DRY up event target implementations
Dedupe event target code and make it extensible. // FREEBIEpull/749/head
parent
925c1bdb33
commit
f7c4fd2fed
@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
* vim: ts=4:sw=4:expandtab
|
||||||
|
*
|
||||||
|
* Implements EventTarget
|
||||||
|
* https://developer.mozilla.org/en-US/docs/Web/API/EventTarget
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
;(function () {
|
||||||
|
'use strict';
|
||||||
|
window.textsecure = window.textsecure || {};
|
||||||
|
|
||||||
|
function EventTarget() {
|
||||||
|
}
|
||||||
|
|
||||||
|
EventTarget.prototype = {
|
||||||
|
constructor: EventTarget,
|
||||||
|
dispatchEvent: function(ev) {
|
||||||
|
if (!(ev instanceof Event)) {
|
||||||
|
throw new Error('Expects an event');
|
||||||
|
}
|
||||||
|
if (this.listeners === null || typeof this.listeners !== 'object') {
|
||||||
|
this.listeners = {};
|
||||||
|
}
|
||||||
|
var listeners = this.listeners[ev.type];
|
||||||
|
if (typeof listeners === 'object') {
|
||||||
|
for (var i=0; i < listeners.length; ++i) {
|
||||||
|
if (typeof listeners[i] === 'function') {
|
||||||
|
listeners[i].call(null, ev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
addEventListener: function(eventName, callback) {
|
||||||
|
if (typeof eventName !== 'string') {
|
||||||
|
throw new Error('First argument expects a string');
|
||||||
|
}
|
||||||
|
if (typeof callback !== 'function') {
|
||||||
|
throw new Error('Second argument expects a function');
|
||||||
|
}
|
||||||
|
if (this.listeners === null || typeof this.listeners !== 'object') {
|
||||||
|
this.listeners = {};
|
||||||
|
}
|
||||||
|
var listeners = this.listeners[eventName];
|
||||||
|
if (typeof listeners !== 'object') {
|
||||||
|
listeners = [];
|
||||||
|
}
|
||||||
|
listeners.push(callback);
|
||||||
|
this.listeners[eventName] = listeners;
|
||||||
|
},
|
||||||
|
removeEventListener: function(eventName, callback) {
|
||||||
|
if (typeof eventName !== 'string') {
|
||||||
|
throw new Error('First argument expects a string');
|
||||||
|
}
|
||||||
|
if (typeof callback !== 'function') {
|
||||||
|
throw new Error('Second argument expects a function');
|
||||||
|
}
|
||||||
|
if (this.listeners === null || typeof this.listeners !== 'object') {
|
||||||
|
this.listeners = {};
|
||||||
|
}
|
||||||
|
var listeners = this.listeners[eventName];
|
||||||
|
for (var i=0; i < listeners.length; ++ i) {
|
||||||
|
if (listeners[i] === callback) {
|
||||||
|
listeners.splice(i, 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.listeners[eventName] = listeners;
|
||||||
|
},
|
||||||
|
extend: function(obj) {
|
||||||
|
for (var prop in obj) {
|
||||||
|
this[prop] = obj[prop];
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
textsecure.EventTarget = EventTarget;
|
||||||
|
}());
|
Loading…
Reference in New Issue