2017-07-27 2 views
2

私はハンドラ関数checkを持つaddEventListenerを宣言する関数beginを持っています。今度は特定の条件がcheckの内部で満たされたら、eventListenerを削除します。ハンドラ関数からウィンドウイベントリスナーを削除する

マイコード:

function begin(data){ 
    //code 
    window.addEventListener('keyUp', check(data)); 
} 

function check(data){ 
    return function check1(event){ 
     //code 
     if(condition) window.removeEventListener('keyUp', check(data)); 
    } 
} 

すべてが正常に動作しているが、それはEventListenerを削除されていません。

+2

可能な重複[クロージャを使用して添加したことにremoveEventListenerするには?](https://stackoverflow.com/questions/19774202/how-to-removeeventlistener-that-was-added-using-closure) –

+0

Psst、removeListener()ではなくremoveEventListener()です。Plus:応答を読み取ります。 –

答えて

3

ハンドブックでは、check(data)レスポンス関数を変数に渡すなどして固有の応答関数にする必要があります。そうでなければ、check(data)に電話をかけて間違ったものを取り除こうとするたびに別の機能が使用されます。

var handler; 

function begin(data) { 
    handler = check(data); 
    window.addEventListener('keyUp', handler); 
} 

function check(data) { 
    return function check1(event) { 
     if(condition) { 
      window.removeEventListener('keyUp', handler); 
     } 
    } 
} 
+0

それはremoveEventListenerであってはなりませんか? – Metaphox

+0

もちろん、ありがとうございます。質問のコードをコピーしました... @Metaphox – eisbehr

+0

この例ではグローバル変数は必要ありません。 'check'の呼び出しごとに常に異なるので、' handler'の代わりに 'check1'だけを使うことができます。 –

3

check1は常になりますcheckの呼び出しごとに異なる機能があなたがwindow.removeEventListener('keyup', check1)を使用して自分自身を削除することができます。他の人があなたのハンドラ関数を指摘したように

function begin(data) { 
    //code 
    window.addEventListener('keyup', check(data)); 
} 

function check(data) { 
    return function check1(event) { 
    if(condition) { 
     window.removeEventListener('keyup', check1); 
    } 
    } 
} 
+0

うわー。これも働いた。アイスベールの答えが働いたので、今私は混乱しています。私はどちらを最高の答えとしてマークするべきですか? :D –

+2

私はこの1つに投票しますが、他のメンバーはポイントが少ないので、もう1つもフィードすることができます:D –

+0

あなたはすでに利用可能なものを使用しているのであなたが良いです^ _^take a +1 – Leathan

1

ので削除カントcheckではありませんそれ。ハンドラ関数は、関数チェックが返す関数です。

あなたは何が起こっているのかをよく理解するために、入力することができます。

check().prototype.constructor.name // 'check' 
check.prototype.constructor.name // 'check1' 
+0

はいそれ。ありがとう –

関連する問題