2017-10-02 6 views
0

onclickによって呼び出される関数と同じ関数でイベントリスナーを削除しようとしています。onclick関数であるイベントリスナー/ onclickを削除します。

次の例は、私の問題を示しています。私がその種の構造を使用しようとしているのは、ビューオブジェクトに関数を渡して、それをonclick関数を作成された要素に追加できるようにするためです。

"use strict"; 

// Do I need var fun = function()... here or I could use only function fun() { ....}? 
var fun = function(obj, num) { 
    alert(obj.id + ' ' + num); 
    obj.onclick = ""; // Version 1. This seems to work 
    //obj.removeEventListener('click',); // Version 2. What should I add after the comma to remove EventListener? 

} 

setFn(fun); 

function setFn(fn) { 

    var funct = fn; 

    var val = 10; 
    var elem = document.getElementById('test'); 
    // The next function works with and without return. What are the differences? Are there any possible memory leaks? 
    elem.onclick = function() { funct(this, 11); }; // Version 1. Why in this case 'this' is not referring to the global 'window'? 
    //elem.addEventListener('click', function() {funct(this, val); }); // Version 2. 
} 

ありがとうございます。

+0

ドキュメントを読もうとしましたか? https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener – glennsl

+0

はい、持っています。私は要素をクリックするときに呼び出すのと同じ機能でそれを削除することについて何も言いません。メモリリークについては何も言いません。私はメモリリークが発生する場合があることを知っています。残念ながら、私はすべてのコーナーケースを知っていません。 – Name

答えて

1

イベントリスナーを削除するには、追加したのとまったく同じ機能を渡す必要があります。

"use strict"; 

var fun = function(obj, num, originalEventHandler) { 
    alert(obj.id + ' ' + num); 
    obj.removeEventListener('click', originalEventHandler); 
} 

function setFn(fn) { 
    var element = document.getElementById('test'); 

    element.addEventListener('click', function eventHandler() { 
    fn(this, 11, eventHandler); 
    }); 
} 

setFn(fun); 

これは動作するはずです。

+0

なぜ私は関数を引数として渡すことにならなかったのですか?しかし、なぜこれらのシナリオで引数として 'this'を渡すのが安全でしょうか?グローバルウィンドウやその他の要素ではなく、要素を指すのはなぜですか? – Name

+1

イベントが発生した要素を参照することが望ましい状況になったので、ハンドラ内の 'this'の値は要素への参照です。詳細はこちら[こちら](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener)。 「ハンドラ内のthisの値」を検索します。 –

1

このようにすることはできません。バージョン2の.addEventListener()に渡された匿名関数への参照はないため、削除することはできません。

1つの可能性は、現在の無名関数に名前を付けて、それを第3引数としてfunctに渡すことです。

elem.addEventListener('click', function f() {funct(this, val, f); }); 

次に、funを使用してリスナーを削除できます。

var fun = function(obj, num, bound_fn) { 
    alert(obj.id + ' ' + num); 
    if (bound_fn) { 
    obj.removeEventListener('click', bound_fn); 
    } 
} 
関連する問題