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...