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);  
    };

}());

addEventListenerこれはインターフェースのメソッドであり、Elementインターフェースではないことに注意してくださいNode

繰り返しますが、これが機能することは保証されていません。現在機能していても、将来的に機能しなくなる可能性があります。

于 2011-08-28T11:23:58.287 に答える