расширение метода Node.addEventListener с тем же именем - PullRequest
1 голос
/ 28 августа 2011

Я пытаюсь расширить метод 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, это вызовет бесконечный цикл. поэтому я подумал, есть ли способ заставить его вызывать метод super?

Заранее спасибо

1 Ответ

3 голосов
/ 28 августа 2011

Прежде всего, позвольте мне еще раз указать (для других читателей), что расширение 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);  
    };

}());

Обратите внимание, что addEventListener - это метод интерфейса Element, а не интерфейса Node.

Опять же: это не гарантируется, и даже если оно работает сейчас, оно может сломаться в будущем.

...