我不确定 _删除 所有 事件_是什么意思。删除特定事件类型的所有处理程序还是删除一种类型的所有事件处理程序?
删除所有事件处理程序
如果要删除所有(任何类型的)事件处理程序,则可以克隆 该元素并将其替换为其克隆:
var clone = element.cloneNode(true);
注意: 这将保留属性和子项,但不会保留对DOM属性的任何更改。
删除特定类型的“匿名”事件处理程序
另一种方法是使用,
removeEventListener()但我想您已经尝试过了,但是没有用。
addEventListener每次调用匿名函数都会创建一个新的侦听器。调用
removeEventListener匿名函数 无效
。匿名函数每次被调用时都会创建一个唯一的对象,尽管它可以调用一个对象,但它并不是对现有对象的引用。以这种方式添加事件侦听器时,请确保仅添加一次,它是永久的(无法删除),直到添加到它的对象被销毁为止。
您实质上是将匿名函数传递给
addEventListeneras
eventReturner返回一个函数。
您可以通过两种方法解决此问题:
- 不要使用返回函数的函数。直接使用功能:
function handler() {dosomething();}div.addEventListener('click',handler,false);- 为此创建一个包装,
addEventListener
该包装存储对返回的函数的引用,并创建一些奇怪的removeAllEvents
函数:
var _eventHandlers = {}; // somewhere globalfunction 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 laterremoveAllListeners(div, 'click')
注意: 如果您的代码运行了很长时间,并且正在创建和删除许多元素,那么在
_eventHandlers销毁它们时必须确保删除其中包含的元素。



