summaryrefslogtreecommitdiff
path: root/resources/src/mediawiki/mediawiki.confirmCloseWindow.js
diff options
context:
space:
mode:
Diffstat (limited to 'resources/src/mediawiki/mediawiki.confirmCloseWindow.js')
-rw-r--r--resources/src/mediawiki/mediawiki.confirmCloseWindow.js68
1 files changed, 56 insertions, 12 deletions
diff --git a/resources/src/mediawiki/mediawiki.confirmCloseWindow.js b/resources/src/mediawiki/mediawiki.confirmCloseWindow.js
index 7fc5c424..4d0c1352 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 );