JavaScript: удалить прослушиватель событий - PullRequest
104 голосов
/ 09 декабря 2010

Я пытаюсь удалить прослушиватель событий внутри определения слушателя:

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

Как я могу это сделать?это = событие ... Спасибо.

Ответы [ 8 ]

105 голосов
/ 09 декабря 2010

Вам необходимо использовать именованные функции.

Кроме того, переменная 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 ));

РЕДАКТИРОВАТЬ: Я забыл назвать обработчик, возвращаемый в последних двух версиях.Исправлено.

73 голосов
/ 09 декабря 2010
   canvas.addEventListener('click', function(event) {
      click++;
      if(click == 50) {
          this.removeEventListener('click',arguments.callee,false);
      }

Должен это сделать.

38 голосов
/ 07 января 2014

Вы можете использовать выражение с именованной функцией (в этом случае функция называется a), например так:

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

Пример быстрой и грязной работы: http://jsfiddle.net/WqpfZ/1/.

Дополнительная информация о выражениях именованных функций: http://kangax.github.io/nfe/.

7 голосов
/ 30 мая 2012
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;
};
};
4 голосов
/ 08 августа 2014

Если кто-то использует 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, работает хорошо:)

4 голосов
/ 09 декабря 2010

Если решение @ Cybernate не работает, попробуйте отключить триггер для его собственной функции, чтобы вы могли ссылаться на нее.

clickHandler = function(event){
  if (click++ == 49)
    canvas.removeEventListener('click',clickHandler);
}
canvas.addEventListener('click',clickHandler);
1 голос
/ 09 декабря 2010

Я думаю, что вам может потребоваться определить функцию-обработчик заранее, например так:

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

Это позволит вам удалить обработчик по имени изнутри себя.

0 голосов
/ 05 ноября 2016

Попробуйте, у меня это сработало.

<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>
...