2010-07-11 2 views
20

Можно ли удалить всех прослушивателей событий элемента и его детей? Что-то вроде:Удалить все прослушиватели событий JavaScript элемента и его детей?

myElem.removeEventListeners(); 

мне это нужно, потому что у меня есть сложный элемент с событиями, и мне нужно, чтобы создать копию - как статическое изображение, которое не реагирует на любые события.

+1

Как связаны события в первую очередь (например, 'onclick = ...', 'addEventListener', библиотека и т. Д.)? –

+0

addEventListener() используется. Он используется для myElem и для некоторых произвольных детей в зависимости от условной логики, вызванной пользователем. – Tower

+5

Я так понимаю, вам тогда не нужен IE (который использует 'attachEvent')? Если это так, «скопируйте» свой элемент с помощью «cloneNode (true)», а события magic-boom-presto, addEventListener не будут скопированы. Это в спецификации: http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-EventListener –

ответ

22

Если вы используете cloneNode, прослушиватели не будут скопированы..

Если вам нужно надежное решение, лучше всего написать обертку для слушателей attach/detach и следить за ними самостоятельно. Что-то вроде Dean Edwards' addEvent.

+0

Спасибо за советы.Я использую прослушиватели событий W3C, поэтому мне, вероятно, придется написать оболочку, которую я бы хотел избежать ... – Tower

+0

, но если вы используете 'cloneNode', ваши слушатели не будут скопированы. Смотрите мое обновление, – galambalazs

+0

все еще, если есть простой способ удалить все обработчики событий, это было бы замечательно –

-7

Я не знаю одного, и поиск в Google не принес каких-либо очевидных результатов. Один простой, запутано решение создать функцию, что циклы через каждое событие и устанавливает его в null, такие как

function removeEvents(obj) 
{ 
    obj.onblur = null; 
    obj.onchange = null; 
    obj.onclick = null; 
    // ... 
} 

вызвать эту функцию следующим образом: removeEvents(myElem). Полный список обработчиков событий JavaScript можно найти по адресу http://www.elated.com/articles/events-and-event-handlers/.

Несомненно, есть более элегантный способ написать эту функцию, но я не знаю, есть ли более элегантный способ решить эту проблему. Было бы прекрасно, если бы кто-то знал об этом. Если вы привязываете события через библиотеку JavaScript, например jQuery, могут быть другие, лучшие варианты.

+3

Я установил бы его в пустую функцию ('function() {}') вместо этого, если он все еще вызван. –

+1

В зависимости от браузера элементы, не имеющие обработчика событий, имеют значение undefined или null. Я не думаю, что установка его на null вызывает какие-либо проблемы, но если это так, вы должны принять это предложение. – TNi

+1

Почему это ниспровергается до святого ада? Это плохая идея, если вы застряли в устаревшем коде и не можете запирать библиотеку событий? –

Смежные вопросы