javascript:注册第二个事件侦听器.如何防止某些事件发生



我有一段代码,在其中我向输入类型文本注册了一个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.addEventListenerWindow.prototype.addEventListener,您也必须执行同样的操作。

FIDDLE

请注意,我向添加了侦听器的元素添加了一个名为evts的属性(包含函数数组)。这可能不是最好的方法,因为任何人都可以覆盖该属性。最好将数组存储在本地变量中的某个位置,或者至少将其重命名为不太可能意外覆盖的值。

相关内容

  • 没有找到相关文章

最新更新