77 lines
1.8 KiB
JavaScript
77 lines
1.8 KiB
JavaScript
define(function () {
|
|
function EventObject() {
|
|
var that = this;
|
|
|
|
var handles = {};
|
|
|
|
this.on = function (name, callback, once) {
|
|
var handleQueue = handles[name] || [];
|
|
handles[name] = handleQueue;
|
|
handleQueue.push(callback);
|
|
|
|
return this;
|
|
};
|
|
|
|
this.off = function (name, callback) {
|
|
var handleQueue = handles[name] || [];
|
|
if (callback) {
|
|
for (var i = handleQueue.length - 1; i >= 0; i--) {
|
|
if (handleQueue[i] === callback || (handleQueue[i].hasOwnProperty("__rawFn") && handleQueue[i].__rawFn === callback)) {
|
|
if (handleQueue[i].hasOwnProperty("__rawFn"))
|
|
delete handleQueue[i].__rawFn;
|
|
|
|
handleQueue.splice(i, 1);
|
|
}
|
|
}
|
|
} else {
|
|
handleQueue.length = 0;
|
|
}
|
|
handles[name] = handleQueue;
|
|
|
|
return this;
|
|
};
|
|
|
|
this.fireEvent = function (type) {
|
|
var ev = typeof (type) === "string" ? new CustomEvent(type) : type.type;
|
|
ev.target = ev.target || this;
|
|
ev.data = arguments[1] || null;
|
|
|
|
var handleQueue = handles[type];
|
|
if (!handleQueue) return;
|
|
|
|
var args = [].slice.call(arguments, 1);
|
|
args.unshift(ev);
|
|
handleQueue = handleQueue.slice();
|
|
|
|
for (var i in handleQueue) {
|
|
var handle = handleQueue[i];
|
|
if (!handle) continue;
|
|
|
|
if (handle.apply(this, args) === false) {
|
|
ev.defaultPrevented = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return !ev.defaultPrevented;
|
|
};
|
|
this.once = function (name, fn) {
|
|
var ptr = Function.prototype.apply.bind(fn.bind(this));
|
|
var nCallback = function () {
|
|
delete nCallback.__rawFn;
|
|
that.off(name, fn);
|
|
return ptr([].slice.call(arguments));
|
|
};
|
|
nCallback.__rawFn = fn;
|
|
that.on(name, nCallback);
|
|
};
|
|
this.addEventListener = this.on;
|
|
this.removeEventListener = this.off;
|
|
this.dispatchEvent = this.fireEvent;
|
|
|
|
|
|
return this;
|
|
}
|
|
|
|
return EventObject;
|
|
}); |