Удалить все прослушиватели событий JavaScript для элемента и его дочерних элементов?

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

myElem.removeEventListeners();

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

Ответ 1

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

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

Ответ 2

Я не знаю одного, и поиск в 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, могут быть другие, лучшие варианты.