2

匿名コールバック関数のバインドを解除する可能性はありますか...

link.addEventListener("click", function () {
     //Any piece of code
}, true);

link.removeEventListener("click", function () {
     //Any piece of code
});

ありがとう、アジャン

4

3 に答える 3

3

はい。これを行うには、匿名イベント ハンドラー関数へのハンドルを使用してどこかに保存しarguments.callee、後でこの保存された参照を使用して同じバインドを解除します。

// binding
var el = document.getElementById('foo');
el.addEventListener('click', function(e) {
    alert('Hi'); 

    // this is where we save a handle to the anonymous handler
    // arguments.callee gives us a reference to this function
    el['_ev'] = arguments.callee;

}, false);


// unbinding
var el = document.getElementById('foo'), handler = el['_ev'];
if(handler) {

    // here we use the saved reference to unbind it        
    el.removeEventListener('click', handler);

    el['_ev'] = false;
}

デモ: http://jsfiddle.net/jrXex/2/

于 2013-02-22T14:27:16.510 に答える
3

いいえ。匿名関数へのそれらは実際には異なるためです。{ a: 1 } === { a: 1 }false を返すのと同じ理由です。

次のことを行う必要があります。

var func = function () { ... };

element.addEventListener( 'click', func, false );

element.removeEventListener( 'click', func, false );
于 2013-02-22T14:15:12.747 に答える
2

関数はポインタで識別されます。匿名関数へのポインタがないため、remove()に渡して、削除する関数を指定する必要はありません。

複製には別のポインターがあるため、複製関数を渡すだけでは実行されません。

関数を変数に割り当ててから、その変数をremove()に渡すことに固執する必要があります。

于 2013-02-22T14:13:32.073 に答える