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)); |