1

我正在尝试扩展该Node.addEventListener方法,以便可以进行一些事件管理,例如:

Node.prototype.on = function (type, listener, useCapture) {
    'use strict';
    var i, evt;

    this.events = this.events || [];


    for (i = 0; i < this.events.length; i += 1) {

        evt = this.events[i];

        if (this === evt[0] && type === evt[1]) {
            this.removeEventListener(type, evt[2], evt[3]);
            this.events.splice(i, 1);
        }

    }

    this.events.push([this, type, listener, useCapture]);

    return this.addEventListener(type, listener, useCapture);  
};

但在这种情况下,on我不想命名它,而是将它命名为相同的名称,addEventListener这样我可以保证任何 javascript 都可以在它上面工作。

所以这里的重点是,如果我addEventListener在 return 子句上将函数命名为 on ,它将导致无限循环。所以我在想是否有什么方法可以让它调用该super方法?

提前致谢

4

1 回答 1

4

首先让我再次指出(对于其他读者),扩展 DOM 通常是个坏主意

也就是说,如果环境允许,您可以执行以下操作:

您可以保留对原始addEventListener函数的引用并使用.call.
这仅在addEventListener公开此方法时才有效(即就像原生 JavaScript 函数)并且您实际上可以覆盖addEventListener

// immediate function to create scope
(function() {
    // keep a reference to the original method
    var orig_addEventListener = Element.prototype.addEventListener;

    Element.prototype.addEventListener = function (type, listener, useCapture) {
        // your code here
        //...
        // call the original method
        return orig_addEventListener.call(this, type, listener, useCapture);  
    };

}());

请注意,这addEventListenerElement接口的方法,而不是Node接口。

再说一遍:这不能保证有效,即使现在有效,将来也可能会中断。

于 2011-08-28T11:23:58.287 回答