Skip to content

Instantly share code, notes, and snippets.

@c3ry5
Last active August 29, 2015 13:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save c3ry5/8732484 to your computer and use it in GitHub Desktop.
Save c3ry5/8732484 to your computer and use it in GitHub Desktop.
native js event listener
(function () {
'use strict';
var fo = window.fo = window.fo || {},
eventHandler = fo.eventHandler = fo.eventHandler || {};
eventHandler.events = {};
eventHandler.publish = function (event, data) {
var events = event.split(' '),
key, func;
for (key in events) {
if (eventHandler.events.hasOwnProperty(events[key])) {
if (Object.prototype.toString.call(eventHandler.events[events[key]]) === '[object Array]') {
for (func in eventHandler.events[events[key]]) {
eventHandler.events[events[key]][func].call(this, events[key], data);
}
}
}
}
};
eventHandler.subscribe = function (event, cb) {
var events = event.split(' '),
key, k, arr;
for (key in events) {
if (!eventHandler.events.hasOwnProperty(events[key])) {
if (Object.prototype.toString.call(cb) === '[object Array]' || typeof cb === 'function') {
eventHandler.events[events[key]] = typeof cb === 'function' ? [cb] : cb;
}
} else {
if (Object.prototype.toString.call(eventHandler.events[events[key]]) === '[object Array]') {
arr = typeof cb === 'function' ? [cb] : cb;
for (k in arr) {
if (eventHandler.events[events[key]].toString().indexOf(arr[k]) <= -1) {
eventHandler.events[events[key]].push(arr[k]);
}
}
}
}
}
};
eventHandler.unsubscribe = function (event) {
var events = event.split(' '),
key;
for (key in events) {
if (eventHandler.events.hasOwnProperty(events[key])) {
delete eventHandler.events[events[key]];
}
}
};
}());
/** jasmine test **/
describe("event listener", function () {
it("fo should be object", function () {
expect(typeof (fo)).toBe('object');
});
it("fo.eventHandler.events should be object", function () {
expect(typeof (fo.eventHandler.events)).toBe('object');
});
it("fo.eventHandler.publish should be function", function () {
expect(typeof (fo.eventHandler.publish)).toBe('function');
});
describe("publish", function () {
it("fo.eventHandler.publish should call its callback", function () {        
var eventHandler = fo.eventHandler;
spyOn(eventHandler, 'subscribe').andCallThrough();
spyOn(eventHandler, 'publish').andCallThrough();
eventHandler.subscribe('key', function (trigger, data) {
console.log('data');
});        
expect(eventHandler.subscribe).toHaveBeenCalled();
eventHandler.publish('key');
expect(eventHandler.publish).toHaveBeenCalled();
fo.eventHandler.unsubscribe('key');
});
it("fo.eventHandler.publish should accept an array of callbacks", function () {        
var eventHandler = fo.eventHandler,
arr = [];
spyOn(eventHandler, 'subscribe').andCallThrough();
spyOn(eventHandler, 'publish').andCallThrough();
eventHandler.subscribe('key', [
function (trigger, data) {
arr.push('1');
},
function (trigger, data) {
arr.push('2');
}
]);
eventHandler.publish('key');
expect(eventHandler.publish).toHaveBeenCalled();
expect(eventHandler.subscribe).toHaveBeenCalled();
expect(arr.length).toBe(2);
expect(fo.eventHandler.subscribers.key.length).toBe(2);
fo.eventHandler.unsubscribe('key');
});
});
describe("subscribe", function () {
it("fo.eventHandler.subscribe should be function", function () {
expect(typeof (fo.eventHandler.subscribe)).toBe('function');
});
it("fo.eventHandler.subscribe function should put event 'key' into fo.eventHandler.events", function () {
fo.eventHandler.subscribe('key', function (trigger, data) {});
expect(fo.eventHandler.subscribers.key).toBeDefined();
fo.eventHandler.unsubscribe('key');
});
it("fo.eventHandler.subscribe function should put event 'key1' and 'key2' into fo.eventHandler.events", function () {
fo.eventHandler.subscribe('key1 key2', function (trigger, data) {});
expect(fo.eventHandler.subscribers.key1).toBeDefined();
expect(fo.eventHandler.subscribers.key2).toBeDefined();
fo.eventHandler.unsubscribe('key1 key2');
expect(fo.eventHandler.subscribers.key1).not.toBeDefined();
expect(fo.eventHandler.subscribers.key2).not.toBeDefined();
});
it("fo.eventHandler.subscribe should take an array or a function as a callback", function () {
fo.eventHandler.subscribe('key', function (trigger, data) {
console.log(data);
});
expect(fo.eventHandler.subscribers.key).toBeDefined();
fo.eventHandler.unsubscribe('key');
fo.eventHandler.subscribe('key', [
function (trigger, data) {
console.log(data);
},
function (trigger, data) {
console.log(trigger)
}
]);
expect(fo.eventHandler.subscribers.key).toBeDefined();
fo.eventHandler.unsubscribe('key');
});
it("fo.eventHandler.subscribe function should add events to 'key' in fo.eventHandler.events", function () {
fo.eventHandler.subscribe('key', function (a, b) {
console.log(data);
});
expect(fo.eventHandler.subscribers.key.length).toBe(1);
fo.eventHandler.subscribe('key', function (c, d) {
console.log(data);
});
expect(fo.eventHandler.subscribers.key.length).toBe(2);
fo.eventHandler.subscribe('key', [
function (e, f) {
console.log(data);
}
]);
expect(fo.eventHandler.subscribers.key.length).toBe(3);
fo.eventHandler.subscribe('key', [
function (g, h) {
console.log(data);
},
function (i, j) {
console.log(data);
},
function (i, j) {
console.log(data);
}
]);
expect(fo.eventHandler.subscribers.key.length).toBe(5);
fo.eventHandler.unsubscribe('key');
});
});
describe("unsubscribe", function () {
it("fo.eventHandler.unsubscribe should be function", function () {
expect(typeof (fo.eventHandler.unsubscribe)).toBe('function');
});
it("fo.eventHandler.unsubscribe function should remove event 'key' from fo.eventHandler.events", function () {
fo.eventHandler.subscribe('key', function (trigger, data) {
console.log(data);
});
fo.eventHandler.unsubscribe('key');
expect(fo.eventHandler.events.key).not.toBeDefined();
});
it("fo.eventHandler.unsubscribe function should remove events 'key1' and 'key2' from fo.eventHandler.events", function () {
fo.eventHandler.subscribe('key1 key2', function (trigger, data) {});
expect(fo.eventHandler.subscribers.key1).toBeDefined();
expect(fo.eventHandler.subscribers.key2).toBeDefined();
fo.eventHandler.unsubscribe('key1 key2');
expect(fo.eventHandler.subscribers.key1).not.toBeDefined();
expect(fo.eventHandler.subscribers.key2).not.toBeDefined();
});
});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment