2011-12-30 3 views
4

пример кода:Как удалить событие элемента, объявленного анонимной функцией?

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

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

+0

Связанный вопрос о получении списка слушателей событий: http://stackoverflow.com/questions/7810534/have-any-browsers-implemented-the-dom3-eventlistenerlist/7814692#7814692 – user123444555621

ответ

7

Если вы добавили событие с 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/

+0

Но мне интересно, действительно ли они будут удалите функцию «arguments.callee» из браузеров, ее можно осуждать десятки лет и работать как шарм. – rsk82

+1

@ rsk82 он уже удален, если код объявляет '' use strict '; ' – Alnitak

2

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

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

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