JavaScript:イベントリスナーを削除する


136

リスナー定義内のイベントリスナーを削除しようとしています。

canvas.addEventListener('click', function(event) {
    click++;
    if(click == 50) {
        // remove this event listener here!
    }
// More code here ...

どうすればできますか?this = event ...ありがとう。


8
ささいなことですが、将来の参照if(click == 50) {if( click === 50 )orでなければなりif( click >= 50 )ません- または、それらは出力を変更しませんが、健全性の理由から、これらのチェックはより理にかなっています。
rlemon 2012年

良い質問です...コンテンツにアクセスできない場合、どうすれば削除できますか?他のサイトでgreasemonkeyを使用してボタンのonclickのポップアップを削除したいのですが、関数を名前で参照できない限り、削除する方法を見つけられないようです。
JasonXA 2015年

回答:


121

名前付き関数を使用する必要があります。

また、click変数はインクリメントするためにハンドラの外にある必要があります。

var click_count = 0;

function myClick(event) {
    click_count++;
    if(click_count == 50) {
       // to remove
       canvas.removeEventListener('click', myClick);
    }
}

// to add
canvas.addEventListener('click', myClick);

編集:次のclick_counterように変数を閉じることができます:

var myClick = (function( click_count ) {
    var handler = function(event) {
        click_count++;
        if(click_count == 50) {
           // to remove
           canvas.removeEventListener('click', handler);
        }
    };
    return handler;
})( 0 );

// to add
canvas.addEventListener('click', myClick);

このようにして、複数の要素にわたってカウンタを増分できます。


それを望まず、それぞれに独自のカウンターを持たせたい場合は、次のようにします。

var myClick = function( click_count ) {
    var handler = function(event) {
        click_count++;
        if(click_count == 50) {
           // to remove
           canvas.removeEventListener('click', handler);
        }
    };
    return handler;
};

// to add
canvas.addEventListener('click', myClick( 0 ));

編集: 私は最後の2つのバージョンで返されるハンドラーに名前を付けるのを忘れていました。修繕。


14
+1-私はこれをフィドルにしたのですが、うまくいきませんでした。しかし、それは私が50回クリックする必要があったからです:)私はなんてばかです。ここに簡略化した例:jsfiddle.net/karim79/aZNqA
karim79

4
@ karim79:そのようなことは今までに一度もしたことがないと言えるといいのですが。:o)jsFiddleをありがとう。
user113716 2010

+1 3番目のオプションがうまくいきました。検証をクリアするために入力フィールドにキーイベントを割り当てます。感謝します
ガーナード

賛成票、ここでの3番目のオプションは、JSのバインド/バインド解除を理解する上で重要な部分です
SW4

考えmyClick = function(event){...}すぎという名前の関数とみなされますか?
DanielMöller、2015

80
   canvas.addEventListener('click', function(event) {
      click++;
      if(click == 50) {
          this.removeEventListener('click',arguments.callee,false);
      }

それを行う必要があります。


14
これはカッコいい!上のドキュメントarguments.callee:利害関係者のためのdeveloper.mozilla.org/en/JavaScript/Reference/...
エンダー

おかげで、これは多くを助けました。
John O、

2
残念ながら、これはMDNのリンクから、後でのECMAScript 5(2009)またはで仕事をしていません。「のECMAScriptの第5版(ES5)は禁止での使用arguments.callee()strictモードでの使用は避けてください。arguments.callee()どちらかを与える関数式で名前をまたは関数の宣言を使用します関数はそれ自体を呼び出さなければなりません。」(それは使用していてもcallee()代わりのcallee、それはまだ削除、ブーイングだ!)

59

次のように、名前付き関数式(この場合、関数の名前はabc)を使用できます。

let click = 0;
canvas.addEventListener('click', function abc(event) {
    click++;
    if (click >= 50) {
        // remove event listener function `abc`
        canvas.removeEventListener('click', abc);
    }
    // More code here ...
}

素早く汚い作業例:http : //jsfiddle.net/8qvdmLz5/2/

名前付き関数式の詳細:http : //kangax.github.io/nfe/


賢い。NFEが役立つまれなケースの1つ。ありがとう。
DanMan

7
element.querySelector('.addDoor').onEvent('click', function (e) { });
element.querySelector('.addDoor').removeListeners();


HTMLElement.prototype.onEvent = function (eventType, callBack, useCapture) {
this.addEventListener(eventType, callBack, useCapture);
if (!this.myListeners) {
    this.myListeners = [];
};
this.myListeners.push({ eType: eventType, callBack: callBack });
return this;
};


HTMLElement.prototype.removeListeners = function () {
if (this.myListeners) {
    for (var i = 0; i < this.myListeners.length; i++) {
        this.removeEventListener(this.myListeners[i].eType, this.myListeners[i].callBack);
    };
   delete this.myListeners;
};
};

6

@Cyber​​nateのソリューションが機能しない場合は、トリガーを独自の関数に分割して、参照できるようにします。

clickHandler = function(event){
  if (click++ == 49)
    canvas.removeEventListener('click',clickHandler);
}
canvas.addEventListener('click',clickHandler);

4

誰かがjqueryを使用している場合、彼は次のようにそれを行うことができます:

var click_count = 0;
$( "canvas" ).bind( "click", function( event ) {
    //do whatever you want
    click_count++;
    if ( click_count == 50 ) {
        //remove the event
        $( this ).unbind( event );
    }
});

それが誰かを助けることができることを願っています。@ user113716によって与えられた答えはうまく機能することに注意してください:)


2

次のように、ハンドラー関数を事前に定義する必要があると思います。

var myHandler = function(event) {
    click++; 
    if(click == 50) { 
        this.removeEventListener('click', myHandler);
    } 
}
canvas.addEventListener('click', myHandler);

これにより、ハンドラーを名前で削除することができます。


-4

これを試してください、それは私のために働きました。

<button id="btn">Click</button>
<script>
 console.log(btn)
 let f;
 btn.addEventListener('click', f=function(event) {
 console.log('Click')
 console.log(f)
 this.removeEventListener('click',f)
 console.log('Event removed')
})  
</script>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.