Дозвуковая единичная оговорка WHERE

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

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

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

var clone = element.cloneNode();
while (element.firstChild) {
  clone.appendChild(element.lastChild);
}
element.parentNode.replaceChild(clone, element);

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


Удалить «анонимные» обработчики событий определенного типа

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

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

blockquote>

анонимная функция 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')
    

DEMO

Примечание. Если ваш код работает в течение длительного времени, и вы создаете и удаляете множество элементов, вам нужно будет удалить элементы, содержащиеся в _eventHandlers, когда вы их уничтожите.

1
задан Gavin 1 October 2010 в 09:19
поделиться