我有一段代码,在其中我向输入类型文本注册了一个keydown侦听器。
通常的
if (...) {
mytext. addEventListener('keydown', myhandler ,true);
} else {
mytext.attachEvent('onkeydown', myhandler ); // older versions of IE
}
这非常好用。
当有人使用我的API注册事件侦听器keydown时,我的问题就开始了。
除非我愿意,否则我如何确保某些事件不会传递给他/她的代码?
简言之,这意味着事件通知将首先到达我手中,我认为这并不能保证是真的吗?
注意:这与父事件上的事件传播无关(冒泡)。我只是在处理同一HTML元素上的另一个侦听器
有什么建议吗?
我想过重写attachEvent和addEventListener方法,但我不确定这是否是一个好主意。
感谢
我也不建议重写addEventListener
方法。但我也认为,尝试某些事情让自己去测试,看看是否存在某些问题,以及在哪里存在某些问题并不坏。因此,无论如何,这里有一个如何做到这一点的想法:
var f = Element.prototype.addEventListener;
Element.prototype.addEventListener = function(type, func, x){
var that = this;
if (that.evts === undefined) {
that.evts = {};
}
if (that.evts[type] === undefined) {
that.evts[type] = [];
f.call(that, type, function(){
for (var i = 0; i < that.evts[type].length; i++) {
that.evts[type][i].apply(that, arguments);
}
}, x);
}
that.evts[type].push(func);
};
我不是百分之百相信我没有遗漏什么,但理论上,这应该在某种程度上覆盖该方法,即添加事件侦听器的顺序应该与执行处理程序的顺序相同。
这是通过在每次调用addEventListener
方法时将处理程序函数保存在数组中来完成的,并且只添加一个遍历该数组并执行其中每个函数的事件侦听器
当然,您还必须更改removeEventListener
方法才能删除数组中的项。对于Document.prototype.addEventListener
和Window.prototype.addEventListener
,您也必须执行同样的操作。
FIDDLE
请注意,我向添加了侦听器的元素添加了一个名为evts
的属性(包含函数数组)。这可能不是最好的方法,因为任何人都可以覆盖该属性。最好将数组存储在本地变量中的某个位置,或者至少将其重命名为不太可能意外覆盖的值。