X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=resources%2Fsrc%2Fmediawiki%2Fmediawiki.confirmCloseWindow.js;h=4d0c1352de13cf66c4d8823ff4590d92370ec06a;hb=cc28eaeb0930c2d876ee6205de035a12e142d38f;hp=7fc5c4249e600812f3020d9c15241907f990b466;hpb=31d239f9d9e2516fc725d9b743ece0dfe72c23a2;p=lhc%2Fweb%2Fwiklou.git diff --git a/resources/src/mediawiki/mediawiki.confirmCloseWindow.js b/resources/src/mediawiki/mediawiki.confirmCloseWindow.js index 7fc5c4249e..4d0c1352de 100644 --- a/resources/src/mediawiki/mediawiki.confirmCloseWindow.js +++ b/resources/src/mediawiki/mediawiki.confirmCloseWindow.js @@ -1,3 +1,4 @@ +/* jshint devel: true */ ( function ( mw, $ ) { /** * @method confirmCloseWindow @@ -7,11 +8,22 @@ * work in most browsers.) * * This supersedes any previous onbeforeunload handler. If there was a handler before, it is - * restored when you execute the returned function. + * restored when you execute the returned release() function. * * var allowCloseWindow = mw.confirmCloseWindow(); * // ... do stuff that can't be interrupted ... - * allowCloseWindow(); + * allowCloseWindow.release(); + * + * The second function returned is a trigger function to trigger the check and an alert + * window manually, e.g.: + * + * var allowCloseWindow = mw.confirmCloseWindow(); + * // ... do stuff that can't be interrupted ... + * if ( allowCloseWindow.trigger() ) { + * // don't do anything (e.g. destroy the input field) + * } else { + * // do whatever you wanted to do + * } * * @param {Object} [options] * @param {string} [options.namespace] Namespace for the event registration @@ -19,12 +31,13 @@ * @param {string} options.message.return The string message to show in the confirm dialog. * @param {Function} [options.test] * @param {boolean} [options.test.return=true] Whether to show the dialog to the user. - * @return {Function} Execute this when you want to allow the user to close the window + * @return {Object} An object of functions to work with this module */ mw.confirmCloseWindow = function ( options ) { var savedUnloadHandler, mainEventName = 'beforeunload', - showEventName = 'pageshow'; + showEventName = 'pageshow', + message; options = $.extend( { message: mw.message( 'mwe-prevent-close' ).text(), @@ -36,6 +49,12 @@ showEventName += '.' + options.namespace; } + if ( $.isFunction( options.message ) ) { + message = options.message(); + } else { + message = options.message; + } + $( window ).on( mainEventName, function () { if ( options.test() ) { // remove the handler while the alert is showing - otherwise breaks caching in Firefox (3?). @@ -47,11 +66,7 @@ }, 1 ); // show an alert with this message - if ( $.isFunction( options.message ) ) { - return options.message(); - } else { - return options.message; - } + return message; } } ).on( showEventName, function () { // Re-add onbeforeunload handler @@ -60,9 +75,38 @@ } } ); - // return the function they can use to stop this - return function () { - $( window ).off( mainEventName + ' ' + showEventName ); + /** + * Return the object with functions to release and manually trigger the confirm alert + * + * @ignore + */ + return { + /** + * Remove all event listeners and don't show an alert anymore, if the user wants to leave + * the page. + * + * @ignore + */ + release: function () { + $( window ).off( mainEventName + ' ' + showEventName ); + }, + /** + * Trigger the module's function manually: Check, if options.test() returns true and show + * an alert to the user if he/she want to leave this page. Returns false, if options.test() returns + * false or the user cancelled the alert window (~don't leave the page), true otherwise. + * + * @ignore + * @return {boolean} + */ + trigger: function () { + // use confirm to show the message to the user (if options.text() is true) + if ( options.test() && !confirm( message ) ) { + // the user want to keep the actual page + return false; + } + // otherwise return true + return true; + } }; }; } )( mediaWiki, jQuery );