Javascript / DOM: Как удалить все события объекта DOM?
просто вопрос: есть ли способ полностью удалить все события объекта, например div?
EDIT: я добавляю per div.addEventListener('click',eventReturner(),false); событие.
function eventReturner() {
return function() {
dosomething();
};
}
EDIT2: я нашел способ, который работает, но не возможно использовать для моего случая:
var returnedFunction;
function addit() {
var div = document.getElementById('div');
returnedFunction = eventReturner();
div.addEventListener('click',returnedFunction,false); //You HAVE to take here a var and not the direct call to eventReturner(), because the function address must be the same, and it would change, if the function was called again.
}
function removeit() {
var div = document.getElementById('div');
div.removeEventListener('click',returnedFunction,false);
}
7 ответов:
я не уверен, что вы имеете в виду с удалить все событий. Удалить все обработчики для определенного типа события или все обработчики событий для одного типа?
удалить все обработчики событий
если вы хотите удалить все обработчики событий (любого типа), вы могли бы клон элемент и заменить его своим клоном:
var clone = element.cloneNode(true);Примечание: это позволит сохранить атрибуты и детей, но он не сохранит никаких изменений в свойствах DOM.
удалить" анонимные " обработчики событий определенного типа
другой способ-использовать
removeEventListener()но я думаю, вы уже пробовали это, и это не сработало. вот в чем загвоздка:вызов
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когда вы уничтожите их.
используйте собственную функцию прослушивателя событий
remove(). Например:getEventListeners().click.forEach((e)=>{e.remove()})
это удалит всех слушателей из детей, но будет медленным для больших страниц. Жестоко просто писать.
element.outerHTML = element.outerHTML;
как Корвин.Амбер говорит, что есть различия между Webkit и другими.
В Chrome:
getEventListeners(document);что дает вам объект со всеми существующими прослушивателями событий:
Object click: Array[1] closePopups: Array[1] keyup: Array[1] mouseout: Array[1] mouseover: Array[1] ...отсюда вы можете добраться до слушателя, который вы хотите удалить:
getEventListeners(document).copy[0].remove();так что все слушатели событий:
for(var eventType in getEventListeners(document)) { getEventListeners(document)[eventType].forEach( function(o) { o.remove(); } ) }В Firefox
немного отличается, потому что он использует оболочку слушателя, что не содержит функции удаления. Вы должны получить слушателя, который вы хотите удалить:
document.removeEventListener("copy", getEventListeners(document).copy[0].listener)все слушатели событий:
for(var eventType in getEventListeners(document)) { getEventListeners(document)[eventType].forEach( function(o) { document.removeEventListener(eventType, o.listener) } ) }Я споткнулся с этим сообщением, пытаясь отключить раздражающую защиту от копирования новостного веб-сайта.
наслаждайтесь!
var div = getElementsByTagName('div')[0]; /* first div found; you can use getElementById for more specific element */ div.onclick = null; // OR: div.onclick = function(){};/ / edit
Я не знал, какой метод вы используете для фиксации событий. Ибо
addEventListenerвы можете использовать это:div.removeEventListener('click',functionName,false); // functionName is the name of your callback function
может быть браузер сделает это за вас, если вы делаете что-то вроде:
скопировать
divи его атрибуты и вставить его перед старым, а затем переместить содержимое из старого в новый и удалить старый?
удаление всех событий на
document:один лайнер:
for (key in getEventListeners(document)) { getEventListeners(document)[key].forEach(function(c) { c.remove() }) }красивая версия:
for (key in getEventListeners(document)) { getEventListeners(document)[key].forEach(function(c) { c.remove() }) }
Comments