0

我有一些代码在其中注册了一个 keydown 侦听器到我的输入类型文本。

通常

  if (...) {
 mytext. addEventListener('keydown', myhandler ,true); 
} else {
mytext.attachEvent('onkeydown', myhandler ); // older versions of IE
}

这工作得很好。

当有人使用我的 API 注册事件侦听器 keydown 时,我的问题就开始了。

除非我愿意,否则如何确保某些事件不会传递给他/她的代码?

简而言之,这意味着事件通知将首先到达我,我认为不能保证是这种情况?

注意:这与父事件的事件传播无关(冒泡)。我只是在处理同一个 HTML 元素上的另一个侦听器

有什么建议、想法吗?

我想过覆盖方法 attachEvent 和 addEventListener 但我不确定这是否是一个合理的想法。

谢谢

4

1 回答 1

0

我也不建议重写该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调用方法时将处理函数保存在一个数组中来完成的,并且只添加一个遍历该数组并执行其中的每个函数的事件侦听器。

Of course you would also have to change the removeEventListener method to remove the items in your array. And you would have to do the same for Document.prototype.addEventListener and Window.prototype.addEventListener.

FIDDLE

Note that I added a property called evts (which contains the function arrays) to the element to which the listener was added. This is probably not the best way to do it, since anyone can override that property. It probably would be better to store your arrays somewhere in a local variable or at least rename it to something that is unlikely to be overridden by accident.

于 2013-06-24T13:27:37.287 回答