##Option 1: Using jQuery 1.7's $.Callbacks() feature:
var topics = {}; jQuery.Topic = function( id ) { var callbacks, method, topic = id && topics[ id ]; if ( !topic ) { callbacks = jQuery.Callbacks(); topic = { publish: callbacks.fire, subscribe: callbacks.add, unsubscribe: callbacks.remove }; if ( id ) { topics[ id ] = topic; } } return topic; };
Usage:
// Subscribers $.Topic( 'mailArrived' ).subscribe( fn1 ); $.Topic( 'mailArrived' ).subscribe( fn2 ); $.Topic( 'mailSent' ).subscribe( fn1 ); // Publisher $.Topic( 'mailArrived' ).publish( 'hello world!' ); $.Topic( 'mailSent' ).publish( 'woo! mail!' ); // Here, 'hello world!' gets pushed to fn1 and fn2 // when the 'mailArrived' notification is published // with 'woo! mail!' also being pushed to fn1 when // the 'mailSent' notification is published. /* output: hello world! fn2 says: hello world! woo! mail! */
##Option 2: Using .on() and .off():
Ben Alman's really tiny pub/sub with my 1.7 updates from https://gist.github.com/1319216. The link to his gist with lots of useful comments is here: https://gist.github.com/661855
/* jQuery Tiny Pub/Sub - v0.7 - 10/27/2011 * http://benalman.com/ * Copyright (c) 2011 "Cowboy" Ben Alman; Licensed MIT, GPL */ (function($) { var o = $({}); $.subscribe = function() { o.on.apply(o, arguments); }; $.unsubscribe = function() { o.off.apply(o, arguments); }; $.publish = function() { o.trigger.apply(o, arguments); }; }(jQuery));
Usage
// Super-basic example: function handle(e, a, b, c) { // `e` is the event object, you probably don't care about it. console.log(a + b + c); }; $.subscribe("/some/topic", handle); $.publish("/some/topic", [ "a", "b", "c" ]); // logs: abc $.unsubscribe("/some/topic", handle); // Unsubscribe just this handler // Or: $.subscribe("/some/topic", function(e, a, b, c) { console.log(a + b + c); }); $.publish("/some/topic", [ "a", "b", "c" ]); // logs: abc // Unsubscribe all handlers for this topic $.unsubscribe("/some/topic");
##Option 3: Using the jQuery UI $.observables
Demo: http://jsfiddle.net/jUZmM/ Implem: http://view.jqueryui.com/grid/ui/jquery.ui.observable.js More information: http://wiki.jqueryui.com/w/page/47179578/Observable
/*$.observers/$.observables example by @addyosmani*/ The basic idea behind observables are that when objects/collections of data are changed or updated, events often need to be triggered to inform any observers of the change. This is a concept you see in a few different frameworks (Backbone's Collections for example); // The array I would like observed var myData = []; // An observer instance of my array, that can be observed var observer = $.observer(myData); function dataChange( data ){ console.log('New data arrived with ID ' + data[0].id + ' and value ' + data[0].title); } // Bind a callback to be executed when the data $(observer).bind("change", function ( e ) { dataChange( e.target.data ); }); $.observable( myData ).insert({ id: myData.length + 1, title: 'test' });