JSFiddle - React, Tailwind, and code Playground
by stevenkaspar
JavaScript
var eventify = function(window_key){
var _event_subscribers = [];
var on = function(event_name, cb, scope){
if(!_event_subscribers[event_name]){
_event_subscribers[event_name] = [];
}
_event_subscribers[event_name].push({
cb: cb,
scope: scope,
once: false
});
}
var once = function(event_name, cb, scope){
on(event_name, cb, scope);
var last_index = _event_subscribers[event_name].length - 1;
_event_subscribers[event_name][last_index].once = true;
}
var off = function(event_name, cb){
if(!_event_subscribers[event_name]){
return;
}
let i = _event_subscribers[event_name].length;
while(i--){
if(_event_subscribers[event_name][i].cb === cb){
_event_subscribers[event_name].splice(i, 1);
}
}
}
var fire = function(event_name){
if(!_event_subscribers[event_name]){
return;
}
let args = Array.prototype.slice.call(arguments, 1);
for(var i = 0, l = _event_subscribers[event_name].length; i < l; i++){
var subscriber = _event_subscribers[event_name][i];
subscriber.cb.apply(subscriber.scope, args);
/**
* if once is set to true then we will call off on the event so that
* it will not be called again
*/
if(subscriber.once){
off(event_name, subscriber.cb);
}
}
}
// initiate event bus
var obj;
if(typeof window_key === 'string'){
obj = window[window_key];
}
else if(typeof window_key === 'object'){
obj = window_key;
}
obj.on = on;
obj.once = once;
obj.off = off;
obj.fire = fire;
}
// test generic object
var test_object = {
a: 1,
b: 2
}
eventify(test_object);
test_object.on('test-event', function(data){
console.log('test_object => test-event => ',data);
}, this)
test_object.fire('test-event', {data: 'object'});
// test global window key
var key = 'EventBus';
eventify(key);
window.EventBus.on('test-event', function(data){
console.log('window...