Skip to content

Instantly share code, notes, and snippets.

@rossgoodwin
Forked from monostere0/GlobalEvents.js
Last active August 29, 2015 14:12
Show Gist options
  • Save rossgoodwin/574658c650a82a1afc2d to your computer and use it in GitHub Desktop.
Save rossgoodwin/574658c650a82a1afc2d to your computer and use it in GitHub Desktop.

Revisions

  1. @monostere0 monostere0 revised this gist Jan 3, 2015. 1 changed file with 5 additions and 14 deletions.
    19 changes: 5 additions & 14 deletions GlobalEvents.js
    Original file line number Diff line number Diff line change
    @@ -43,22 +43,13 @@
    };
    eventListener = function (e) {
    var ev = _findByName(e.key),
    val = e.newValue;
    val = e.newValue,
    params = [];
    if (ev && !eventIsRunning) {
    eventIsRunning = true;
    if (ev.args) {
    if ( val === '_evt' || !val) {
    ev.callback.call(this, ev.args);
    } else {
    ev.callback.call(this, ev.args, _parse(val));
    }
    } else {
    if ( val === '_evt' || !val) {
    ev.callback.call(this);
    } else {
    ev.callback.call(this, _parse(val));
    }
    }
    ev.args && params.push(ev.args);
    val && val !== '_evt' && params.push(_parse(val));
    ev.callback.apply(this, params);
    setTimeout(function() {
    eventIsRunning = false;
    }, 10);
  2. @monostere0 monostere0 revised this gist Jan 3, 2015. 1 changed file with 108 additions and 82 deletions.
    190 changes: 108 additions & 82 deletions GlobalEvents.js
    Original file line number Diff line number Diff line change
    @@ -1,102 +1,128 @@
    var GlobalEvents = (function(){
    var EVENT_EXISTS = 'GlobalEvents: Event already exists.';
    (function(window){

    var eventIsRunning,
    _eventStack,
    _findByName,
    stackEvent,
    removeEvent,
    eventListener,
    listen, unlisten,
    _set, _rem,
    _storage;
    var EVENT_EXISTS = 'GlobalEvents: Event already exists.';

    _storage = window.localStorage;
    eventIsRunning = false;
    _eventStack = [];
    _findByName = function (eventName) {
    var evArray = _eventStack.filter(function(ev) {
    return ev.name === eventName;
    });
    var eventIsRunning,
    _eventStack,
    _findByName,
    stackEvent,
    removeEvent,
    eventListener,
    listen, unlisten,
    _set, _rem, _parse,
    _storage;

    return evArray.length ? evArray[0] : null;
    }
    stackEvent = function (eventName, callback, args) {
    if (_findByName(eventName)) {
    throw EVENT_EXISTS;
    _storage = window.localStorage;
    eventIsRunning = false;
    _eventStack = [];
    _findByName = function (eventName) {
    var evArray = _eventStack.filter(function(ev) {
    return ev.name === eventName;
    });

    return evArray.length ? evArray[0] : null;
    };
    stackEvent = function (eventName, callback, args) {
    if (_findByName(eventName)) {
    throw EVENT_EXISTS;
    } else {
    var ev = {
    name: eventName,
    callback: callback
    };
    if (args) {
    ev.args = args;
    }
    _eventStack.push(ev);
    }
    };
    removeEvent = function (eventName) {
    var ev = _findByName(eventName);
    var idx = _eventStack.indexOf(ev);
    _eventStack.splice(idx, 1);
    };
    eventListener = function (e) {
    var ev = _findByName(e.key),
    val = e.newValue;
    if (ev && !eventIsRunning) {
    eventIsRunning = true;
    if (ev.args) {
    if ( val === '_evt' || !val) {
    ev.callback.call(this, ev.args);
    } else {
    ev.callback.call(this, ev.args, _parse(val));
    }
    } else {
    var ev = {
    name: eventName,
    callback: callback
    };
    if (args) {
    ev.args = args;
    }
    _eventStack.push(ev);
    }
    }
    removeEvent = function (eventName) {
    var ev = _findByName(eventName);
    var idx = _eventStack.indexOf(ev);
    _eventStack.splice(idx, 1);
    }
    eventListener = function (e) {
    var ev = _findByName(e.key);
    if (ev && !eventIsRunning) {
    eventIsRunning = true;
    if (ev.args) {
    ev.callback.call(this, ev.args);
    } else {
    ev.callback.call(this);
    }
    setTimeout(function() {
    eventIsRunning = false;
    }, 10);
    if ( val === '_evt' || !val) {
    ev.callback.call(this);
    } else {
    ev.callback.call(this, _parse(val));
    }
    }
    setTimeout(function() {
    eventIsRunning = false;
    }, 10);
    }
    listen = function () {
    window.addEventListener('storage', eventListener);
    }
    unlisten = function () {
    window.removeEventListener('storage', eventListener);
    }
    };
    listen = function () {
    window.addEventListener('storage', eventListener);
    };
    unlisten = function () {
    window.removeEventListener('storage', eventListener);
    };

    _set = function (key) {
    return _storage.setItem(key, '_evt');
    }
    _rem = function (key) {
    return _storage.removeItem(key);
    }
    _set = function (key, value) {
    return _storage.setItem(key, value || '_evt');
    };
    _rem = function (key) {
    return _storage.removeItem(key);
    };
    _parse = function (val) {
    try {
    return JSON.parse(val);
    } catch (e) {}

    function GlobalEvents() {
    //begin listening for events
    return val;
    };

    function GlobalEvents() {
    //begin listening for events
    unlisten();
    listen();
    };

    GlobalEvents.prototype = {
    on: stackEvent,
    off: removeEvent,
    trigger: function (eventName, transportObject) {
    _set(eventName, transportObject);
    unlisten();
    listen();
    setTimeout(function() {
    _rem(eventName);
    listen();
    });
    }
    };

    GlobalEvents.prototype = {
    on: stackEvent,
    off: removeEvent,
    trigger: function (eventName) {
    _set(eventName);
    unlisten();
    setTimeout(function() {
    _rem(eventName);
    listen();
    });
    }
    };

    return new GlobalEvents();
    })();
    window.GlobalEvents = new GlobalEvents();

    })(window);

    //usage

    //usage #1 - trigger the event
    //listen to the event in one window
    GlobalEvents.on('test', function() {
    //do something when the event fires
    });

    //fire the event from another window
    GlobalEvents.trigger('test');
    GlobalEvents.trigger('test');

    //usage #2 - trigger the event an transport an object between windows
    //listen to the event in one window
    GlobalEvents.on('test', function(transportObj) {
    //do something with transportObj when the event fires
    });

    //fire the event from another window and send an object
    GlobalEvents.trigger('test', {foo:bar,baz:bar});
  3. @monostere0 monostere0 created this gist Jan 3, 2015.
    102 changes: 102 additions & 0 deletions GlobalEvents.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,102 @@
    var GlobalEvents = (function(){
    var EVENT_EXISTS = 'GlobalEvents: Event already exists.';

    var eventIsRunning,
    _eventStack,
    _findByName,
    stackEvent,
    removeEvent,
    eventListener,
    listen, unlisten,
    _set, _rem,
    _storage;

    _storage = window.localStorage;
    eventIsRunning = false;
    _eventStack = [];
    _findByName = function (eventName) {
    var evArray = _eventStack.filter(function(ev) {
    return ev.name === eventName;
    });

    return evArray.length ? evArray[0] : null;
    }
    stackEvent = function (eventName, callback, args) {
    if (_findByName(eventName)) {
    throw EVENT_EXISTS;
    } else {
    var ev = {
    name: eventName,
    callback: callback
    };
    if (args) {
    ev.args = args;
    }
    _eventStack.push(ev);
    }
    }
    removeEvent = function (eventName) {
    var ev = _findByName(eventName);
    var idx = _eventStack.indexOf(ev);
    _eventStack.splice(idx, 1);
    }
    eventListener = function (e) {
    var ev = _findByName(e.key);
    if (ev && !eventIsRunning) {
    eventIsRunning = true;
    if (ev.args) {
    ev.callback.call(this, ev.args);
    } else {
    ev.callback.call(this);
    }
    setTimeout(function() {
    eventIsRunning = false;
    }, 10);
    }
    }
    listen = function () {
    window.addEventListener('storage', eventListener);
    }
    unlisten = function () {
    window.removeEventListener('storage', eventListener);
    }

    _set = function (key) {
    return _storage.setItem(key, '_evt');
    }
    _rem = function (key) {
    return _storage.removeItem(key);
    }

    function GlobalEvents() {
    //begin listening for events
    unlisten();
    listen();
    }

    GlobalEvents.prototype = {
    on: stackEvent,
    off: removeEvent,
    trigger: function (eventName) {
    _set(eventName);
    unlisten();
    setTimeout(function() {
    _rem(eventName);
    listen();
    });
    }
    };

    return new GlobalEvents();
    })();


    //usage

    //listen to the event in one window
    GlobalEvents.on('test', function() {
    //do something when the event fires
    });

    //fire the event from another window
    GlobalEvents.trigger('test');