View difference between Paste ID: SdjRvZ3j and
SHOW: | | - or go back to the newest paste.
1-
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));