Light12306/Web12306/js/platform/EventObject.js

77 lines
1.8 KiB
JavaScript
Raw Normal View History

2014-06-26 22:24:54 +08:00
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;
2014-06-26 22:24:54 +08:00
};
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;
2014-06-26 22:24:54 +08:00
};
this.fireEvent = function (type) {
2015-11-18 19:48:23 +08:00
var ev = typeof (type) === "string" ? new CustomEvent(type) : type.type;
2014-06-26 22:24:54 +08:00
ev.target = ev.target || this;
2015-11-18 19:48:23 +08:00
ev.data = arguments[1] || null;
2014-06-26 22:24:54 +08:00
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;
2014-03-13 15:06:01 +08:00
});