Preparation Code Preparation HTML (this will be inserted in the <body>
of a valid HTML5 document in standards mode) (useful when testing DOM operations or including libraries) <script src ="https://ajax.googleapis.com/ajax/libs/yui/2.9.0/build/yuiloader/yuiloader-min.js" > </script >
<script src ="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js" > </script >
<script src ="https://underscorejs.org/underscore.js" > </script >
<script src ="https://raw.github.com/Sahadar/pubsub.js/master/pubsub.js" > </script >
<script src ="https://raw.github.com/ajacksified/Mediator.js/master/lib/mediator.js" > </script >
<script >
var callback1 = function (event ) {
return false ;
};
var callback2 = function ( ) {};
var payload = {
somekey : 'some value'
};
var body;
var someJqueryObject = $({});
var mediator = new Mediator ();
var channels = {},
obj = {};
obj.subscribe = function (channel, subscriber, callback, context ) {
if (channel === undefined || callback === undefined || context === undefined ) {
throw new Error ("Channel, callback, and context must be defined" );
}
if (typeof channel !== "string" ) {
throw new Error ("Channel must be a string" );
}
if (typeof subscriber !== "string" ) {
throw new Error ("Subscriber must be a string" );
}
if (typeof callback !== "function" ) {
throw new Error ("Callback must be a function" );
}
channels[channel] = (!channels[channel]) ? [] : channels[channel];
channels[channel].push ({
subscriber : subscriber,
callback : this .util .method (callback, context)
});
};
obj.unsubscribe = function (subscriber ) {
$.each (channels, function (key, channel ) {
var foundObject = _.find (channel, function (item ) {
return item.subscriber === subscriber;
});
var index = _.indexOf (channel, foundObject);
if (index !== -1 ) {
delete channel[index];
channel.splice (index, 1 );
}
});
};
obj.publish = function (channel ) {
if (channel === undefined ) {
throw new Error ("Channel must be defined" );
}
if (typeof channel !== "string" ) {
throw new Error ("Channel must be a string" );
}
var i, l, args = [].slice .call (arguments , 1 );
if (!channels[channel]) {
return ;
}
for (i = 0 , l = channels[channel].length ; i < l; i += 1 ) {
channels[channel][i]['callback' ].apply (this , args);
}
};
obj.util = {
method : function (fn, context ) {
return $.proxy (fn, context);
}
};
var f = {
subscribe : function (channel, callback, context ) {
pubsub.subscribe (channel, callback, context || this );
},
unsubscribe : function (subscriber ) {
pubsub.unsubscribe (subscriber);
},
publish : function (channel, args ) {
pubsub.publish (channel, [args]);
}
};
var f2 = {
subscribe : function (channel, subscriber, callback, context ) {
obj.subscribe (channel, subscriber, callback, context || this );
},
unsubscribe : function (subscriber ) {
obj.unsubscribe (subscriber);
},
publish : function (channel ) {
obj.publish .apply (obj, arguments );
}
};
jQuery (function ( ) {
body = $('body' );
body.bind ('my-event' , callback1);
someJqueryObject.bind ('my-event' , callback1);
pubsub.subscribe ('my-event' , callback2)
mediator.subscribe ('my-event' , callback2);
f.subscribe ('my-event' , callback2);
f2.subscribe ('my-event' , 'subscriber' , callback2);
doc = $(document )
});
</script >
Setup JS
Teardown JS
Test cases
Test #1 Title *
Async
Code * body.trigger ('my-event' , payload);
Test #2 Title *
Async
Code * someJqueryObject.trigger ('my-event' , payload);
Title *
Async
Code * pubsub.publish ('my-event' , [payload]);
Title *
Async
Code * doc.trigger ('my-event' , payload);
Title *
Async
Code * mediator.publish ('my-event' , payload);
Title *
Async
Code * f.publish ('my-events' , payload);
Title *
Async
Code * f2.publish ('my-events' , payload);
Title *
Async
Code * YUI ().use ('event-custom' , function (Y ) {
Y.on ('my-events' , callback1);
Y.fire ('my-events' , [payload]);
}