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);
}
2069   7  

7 ответов:

я не уверен, что вы имеете в виду с удалить все событий. Удалить все обработчики для определенного типа события или все обработчики событий для одного типа?

удалить все обработчики событий

если вы хотите удалить все обработчики событий (любого типа), вы могли бы клон элемент и заменить его своим клоном:

var clone = element.cloneNode(true);

Примечание: это позволит сохранить атрибуты и детей, но он не сохранит никаких изменений в свойствах DOM.


удалить" анонимные " обработчики событий определенного типа

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

вызов addEventListener для анонимной функции создает новый слушатель каждый раз. Звоню removeEventListener к анонимной функции не имеет никакого эффекта. Анонимный функция создает уникальный объект каждый раз, когда вызывается, это не Ссылка на существующий объект, хотя он может вызвать один. При добавлении прослушивателя событий таким образом убедитесь, что он добавлен только один раз, он является постоянным (не может быть удален) до тех пор, пока объект, к которому он был добавлен, не будет уничтожен.

вы по существу передаете анонимную функцию в addEventListener как eventReturner возвращает функция.

вы должны возможности для решения это:

  1. не используйте функцию, которая возвращает функцию. Используйте функцию напрямую:

    function handler() {
        dosomething();
    }
    
    div.addEventListener('click',handler,false);
    
  2. создать обертку для 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

    Ничего не найдено.