Как удалить событие элемента, который был объявлен анонимной функцией? - PullRequest
4 голосов
/ 30 декабря 2011

пример кода:

element.addEventListener('click',function () {
  this.style.backgroundColor = '#cc0000'
  //after element was clicked once what to do here to remove this event ?
},false)

А где это сделать, возможно ли прямо в функции, куда я положил комментарий?

Ответы [ 2 ]

7 голосов
/ 30 декабря 2011

Если вы добавляете событие с addEventListener(), вы должны иметь ссылку на эту функцию, чтобы иметь возможность впоследствии удалить его.

С анонимной функцией, которая возможна только с arguments.callee, и только тогда, когда вы находитесь внутри самой функции:

element.addEventListener('click', function() {
    this.style.backgroundColor = '#cc0000';
    this.removeEventListener('click', arguments.callee);
}, false);

но учтите, что в ES5 "строгий режим" это недопустимо.

Следовательно, было бы лучше дать вашему обратному вызову имя, а затем использовать его при вызове removeEventLister():

element.addEventListener('click', function cb() {
    this.style.backgroundColor = '#cc0000';
    this.removeEventListener('click', cb);
}, false);

Демо на http://jsfiddle.net/alnitak/RsaVE/

2 голосов
/ 30 декабря 2011

Больше не по-настоящему анонимный, но вот лучшее, что я могу придумать (используя закрытие):

(function(){
  var handler = function(){
    this.style.backgroundColor = '#cc0000'
    element.removeEventListener('click', handler, false);
  };
  element.addEventListener('click', handler, false);
})();

Редактировать: +1 к пересмотренному ответу Альнитака - это немного более кратко, чем этот.

...