2012-01-15 152 views
0

我想取消使用Javascript在页面中定义的每个事件处理程序。换句话说,如果页面先前在许多不同的DOM级别上设置了许多事件侦听器,则此方法将简单地删除它们中的每一个。有没有办法在JavaScript中做到这一点?清除每个事件处理程序

回答

2

对于清除动态连接到页面的正文中的元素的所有事件,你可以这样做:

document.body.innerHTML = document.body.innerHTML; 

对于清除附着在窗口对象的事件,你可以这样做:

window.onscroll = function() {}; 

等。

+0

这并没有清除我的测试'document.onmousedown'事件。 – wecsam 2012-01-15 04:30:35

+0

清除附加到文档对象的事件没有捷径。与窗口对象一样,您需要逐一清除它们,例如'document.onmousedown = function(){}'等等。 – techfoobar 2012-01-15 04:37:58

+1

我不确定这是否可行。如果'innerHTML'本身包含一些'

1

没有本地事件列表,看看什么是绑定到什么。 JQuery有自己的,如果你想更好的事件管理。

下面是它是如何在JQuery中完成的:

(function($) { 
    $.eventReport = function(selector, root) { 
     var s = []; 
     $(selector || '*', root).andSelf().each(function() { 
      var e = $.data(this, 'events'); 
      if(!e) return; 
      s.push(this.tagName); 
      if(this.id) s.push('#', this.id); 
      if(this.className) s.push('.', this.className); 
      for(var p in e) s.push('\n', p); 
      s.push('\n\n'); 
     }); 
     return s.join(''); 
    } 
    $.fn.eventReport = function(selector) { 
     return $.eventReport(selector, this); 
    } 
})(jQuery); 

你可以称它为各种方式来满足您的需求:

// all events 
alert($.eventReport()); 

// just events on inputs 
alert($.eventReport('input')); 

// just events assigned to this element 
alert($.eventReport('#myelement')); 

// events assigned to inputs in this element 
alert($.eventReport('input', '#myelement')); 
alert($('#myelement').eventReport('input')); // same result 

// just events assigned to this element's children 
alert($('#myelement').eventReport()); 
alert($.eventReport('*', '#myelement'); // same result 

从那里,解除绑定很简单。