Pastebin launched a little side project called HostCabi.net, check it out ;-)Don't like ads? PRO users don't see any ads ;-)
Guest

jQuery Pub/Sub plugin v0.2

By: a guest on Mar 7th, 2011  |  syntax: JavaScript  |  size: 2.36 KB  |  hits: 163  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
This paste has a previous version, view the difference. Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. /*     
  2.         jQuery pub/sub plugin by Túbal Martín (http://margenn.com)
  3.  
  4.         Inspired by Peter Higgings plugin: https://github.com/phiggins42/bloody-jquery-plugins/blob/8ccf0da40b85fa4ecc30079c8650bac58f7a334c/pubsub.js
  5. */
  6.  
  7. (function($) {
  8.        
  9.         // The topics/subscriptions hash
  10.         var topics = {};
  11.        
  12.         /**
  13.          * @description Publishes some data on a named topic.
  14.          * @param {String} topic The topic to publish.
  15.          * @param {Array} [args] The data to publish.                  
  16.          * @returns {jQuery} returns jQuery object.
  17.          * @example
  18.          * $( "#sidebarWidget" ).publish( "/some/topic", [ "a", "b", "c" ] );
  19.          */
  20.         $.fn.publish = function ( topic, args ) {      
  21.                 args = args || [],
  22.                 argsLength = args.length;
  23.                
  24.                 if ( topics[topic] ) {
  25.                         this.each( function( i, obj ) {
  26.                                 // Let's add a reference to the publisher object
  27.                                 args[argsLength] = obj;
  28.                                 $.each( topics[topic], function( j, aElem ) {
  29.                                         aElem.callback.apply( aElem.object, args );
  30.                                 });    
  31.                         });
  32.                 }
  33.                
  34.                 return this;
  35.         };
  36.        
  37.        
  38.         /**
  39.          * @description Registers a callback on a named topic.
  40.          * @param {String} topic The topic to subscribe to.
  41.          * @param {Function} callback The handler. Anytime something is published on a subscribed
  42.          * topic, the callback will be called with the published array as ordered arguments.                   
  43.          * @returns {jQuery} returns jQuery object.
  44.          * @example
  45.          * $( "#header" ).subscribe( "/some/topic", function( a, b, c ) { // handle data } );
  46.          */
  47.         $.fn.subscribe = function( topic, callback ) {
  48.                 topics[topic] = topics[topic] || [];
  49.                
  50.                 this.each( function( i, obj ) {
  51.                         // Array.push() is way slower. See: http://jsperf.com/array-push-el-vs-array-array-length-el
  52.                         topics[topic][topics[topic].length] = { "object": obj, "callback": callback };
  53.                 });
  54.                
  55.                 return this;   
  56.         };
  57.        
  58.        
  59.         /**
  60.          * @description Unregisters a previously registered callback for a named topic.
  61.          * @param {String} topic The topic to unsubscribe from.        
  62.          * @returns {jQuery} returns jQuery object.
  63.          * @example
  64.          * $( "#header" ).unsubscribe( "/some/topic" );
  65.          */
  66.         $.fn.unsubscribe = function ( topic ) {
  67.                
  68.                 if ( topics[topic] ) {
  69.                         this.each( function( i, obj ) {
  70.                                 topics[topic] = $.grep( topics[topic], function( aElem, j ) {
  71.                                         return ( obj !== aElem.object );
  72.                                 });
  73.                         });
  74.                        
  75.                         if ( topics[topic].length === 0 ) {
  76.                                 delete topics[topic];
  77.                         }
  78.                 }
  79.                
  80.                 return this;   
  81.         };
  82.        
  83. }(jQuery));