FileReader
有类似的方法addEventHandler
因为它是defined实施EventTarget界面。EventTarget
定义为DOM 事件规范,但你不需要成为 DOM 对象来实现它。window
, XMLHttpRequest
and FileReader
是其他实现的浏览器对象模型对象EventTarget
.
不幸的是,没有简单的方法可以利用浏览器的事件目标本机实现...您可以尝试通过使用浏览器对象作为对象来继承浏览器对象prototype
财产,但一般来说这是非常不可靠的。然而,用纯 JavaScript 编写代码来实现所有方法并不太困难:
function CustomEventTarget() { this._init(); }
CustomEventTarget.prototype._init= function() {
this._registrations= {};
};
CustomEventTarget.prototype._getListeners= function(type, useCapture) {
var captype= (useCapture? '1' : '0')+type;
if (!(captype in this._registrations))
this._registrations[captype]= [];
return this._registrations[captype];
};
CustomEventTarget.prototype.addEventListener= function(type, listener, useCapture) {
var listeners= this._getListeners(type, useCapture);
var ix= listeners.indexOf(listener);
if (ix===-1)
listeners.push(listener);
};
CustomEventTarget.prototype.removeEventListener= function(type, listener, useCapture) {
var listeners= this._getListeners(type, useCapture);
var ix= listeners.indexOf(listener);
if (ix!==-1)
listeners.splice(ix, 1);
};
CustomEventTarget.prototype.dispatchEvent= function(evt) {
var listeners= this._getListeners(evt.type, false).slice();
for (var i= 0; i<listeners.length; i++)
listeners[i].call(this, evt);
return !evt.defaultPrevented;
};
注意:上面的代码是我的想法,未经测试,但可能有效。但是它有局限性,例如仅支持dispatchEvent
返回值,如果Event
对象支持 DOM Level 3defaultPrevented
属性,并且不支持 DOM Level 3stopImmediatePropagation()
(这是不可能实现的,除非您依赖自己的为其公开属性的 Event 对象)。此外,没有层次结构或捕获/冒泡的实现。
所以 IMO:尝试编写参与 DOM 事件模型的代码并不会获得太多好处。对于纯 JS 回调工作,我只需使用您自己的侦听器列表的临时实现。