Я не уверен, что вы имеете в виду удалить все события . Удалить все обработчики для определенного типа событий или всех обработчиков событий для одного типа?
Если вы хотите удалить все обработчики событий (любого типа), вы мог клонировать элемент и заменить его своим клоном:
var clone = element.cloneNode();
while (element.firstChild) {
clone.appendChild(element.lastChild);
}
element.parentNode.replaceChild(clone, element);
Примечание: Это сохранит атрибуты и дочерние элементы, но не сохранит никаких изменений в свойствах DOM.
. Другой способ - использовать removeEventListener()
, но я думаю, вы уже пробовали это, и он не сделал Не работай. Вот улов :
Вызов
blockquote>addEventListener
для анонимной функции создает новый слушатель каждый раз. ВызовremoveEventListener
анонимной функции не влияет. Анонимная функция создает уникальный объект каждый раз, когда вызывается, это не ссылка на существующий объект, хотя он может именовать один. При добавлении слушателя событий таким образом убедитесь, что он добавлен только один раз, он является постоянным (не может быть удален) до тех пор, пока объект, к которому он был добавлен, не будет уничтожен.анонимная функция
addEventListener
, когда функцияeventReturner
возвращает функцию.Вы должны решить это:
- Не использовать функцию, возвращающую функцию , Используйте функцию напрямую:
function handler() { dosomething(); } div.addEventListener('click',handler,false);
- Создайте обертку для
addEventListener
, которая хранит ссылку на возвращаемую функцию и создаст какую-то странную функциюremoveAllEvents
:И затем вы можете использовать ее с:var _eventHandlers = {}; // somewhere global function addListener(node, event, handler, capture) { if(!(node in _eventHandlers)) { // _eventHandlers stores references to nodes _eventHandlers[node] = {}; } if(!(event in _eventHandlers[node])) { // each entry contains another entry for each event type _eventHandlers[node][event] = []; } // capture reference _eventHandlers[node][event].push([handler, capture]); node.addEventListener(event, handler, capture); } function removeAllListeners(node, event) { if(node in _eventHandlers) { var handlers = _eventHandlers[node]; if(event in handlers) { var eventHandlers = handlers[event]; for(var i = eventHandlers.length; i--;) { var handler = eventHandlers[i]; node.removeEventListener(event, handler[0], handler[1]); } } } }
addListener(div, 'click', eventReturner(), false) // and later removeListeners(div, 'click')
Примечание. Если ваш код работает в течение длительного времени, и вы создаете и удаляете множество элементов, вам нужно будет удалить элементы, содержащиеся в
_eventHandlers
, когда вы их уничтожите.