http://www.mediawiki.org/wiki/Special:Code/MediaWiki/89913
Revision: 89913
Author: neilk
Date: 2011-06-12 05:13:59 +0000 (Sun, 12 Jun 2011)
Log Message:
-----------
readiness events, that can occur only once, and can be subscribed to even if
already occured
Modified Paths:
--------------
trunk/extensions/UploadWizard/resources/jquery/jquery.pubsub.js
Modified: trunk/extensions/UploadWizard/resources/jquery/jquery.pubsub.js
===================================================================
--- trunk/extensions/UploadWizard/resources/jquery/jquery.pubsub.js
2011-06-12 02:58:13 UTC (rev 89912)
+++ trunk/extensions/UploadWizard/resources/jquery/jquery.pubsub.js
2011-06-12 05:13:59 UTC (rev 89913)
@@ -2,6 +2,9 @@
* Minimal pubsub framework
*
* Loosely based on
https://github.com/phiggins42/bloody-jquery-plugins/pubsub.js, which is itself
BSD-licensed.
+ * Concept of 'ready' events is new, though.
+ *
+ * @author Neil Kandalgaonkar <[email protected]>
*/
( function( $ ) {
@@ -9,6 +12,11 @@
* Store of events -> array of listener callbacks
*/
var subs = {};
+
+ /**
+ * Store of ready events, as object of event name -> argument array
+ */
+ var ready = {};
/**
* Publish an event
@@ -18,27 +26,60 @@
*/
$.publish = function( name /* , args... */ ) {
var args = [].slice.call( arguments, 1 );
- $.each( subs[name], function( i, sub ) {
- sub.apply( null, args );
- } );
- return subs[name].length;
+ if ( typeof subs[name] !== 'undefined' && subs[name] instanceof
Array ) {
+ $.each( subs[name], function( i, sub ) {
+ sub.apply( null, args );
+ } );
+ return subs[name].length;
+ }
+ return 0;
};
/**
+ * Publish a ready event. Ready events occur once only, so
+ * subscribers will be called even if they subscribe later.
+ * Additional variadic arguments after the event name are passed as
arguments to the subscriber functions
+ * @param {String} name of event
+ * @return {Number} number of subscribers
+ */
+ $.publishReady = function( name /*, args... */ ) {
+ if ( typeof ready[name] === 'undefined' ) {
+ var args = [].slice.call( arguments, 1 );
+ ready[name] = args;
+ $.publish.apply( null, arguments );
+ }
+ };
+
+ /**
* Subscribe to an event.
* @param {String} name of event to listen for
* @param {Function} callback to run when event occurs
* @return {Array} returns handle which can be used as argument to
unsubscribe()
*/
$.subscribe = function( name, fn ) {
- if (!subs[name]) {
+ if ( typeof subs[name] === 'undefined' ) {
subs[name] = [];
}
- subs[name].push(fn);
+ subs[name].push( fn );
return [ name, fn ];
};
/**
+ * Subscribe to a ready event. See publishReady().
+ * Subscribers will be called even if they subscribe long after the
event fired.
+ * @param {String} name of event to listen for
+ * @param {Function} callback to run now (if event already occurred) or
when event occurs
+ * @return {Array} returns handle which can be used as argument to
unsubscribe()
+ */
+ $.subscribeReady = function( name, fn ) {
+ if ( ready[name] ) {
+ fn.apply( null, ready[name] );
+ } else {
+ $.subscribe( name, fn );
+ }
+ };
+
+ /**
* Given the handle of a particular subscription, remove it
* @param {Array} object returned by subscribe ( array of event name
and callback )
* @return {Boolean} success
_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs