2012-01-15 153 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 

從那裏,解除綁定很簡單。