[英]Is there a way to remove all event listeners at once in a web browser?
簡單的好奇心在這里。 沒什么太嚴重的。
建立一個新的應用程序。 客戶端的配置文件應提供terminateOnError
參數。 如果設置為true,則在記錄錯誤后,整個世界都將停止。
退出showTerminationScreen
函數而不執行任何后續代碼應該很容易:只需拋出未處理的異常。
但是該應用程序可能(將...)具有正在進行的異步事件,其中一些我不控制(我擁有該應用程序的一半;另一半對我來說或多或少是封閉源):計時器,正在等待http請求回來等等
有沒有一種簡單的方法可以告訴瀏覽器停止收聽到目前為止一直跟蹤的內容?
您有兩個基本解決方案來解決此問題:
使用事件委托,因此整個頁面上只有一個附加了事件處理程序的元素。
確保每個JavaScript功能都是模塊化的,並且可以一時興起地分離事件處理程序,然后在以后重新附加它們。
活動委托
只是搜索GitHub即可為您提供大量的事件委托選項。 有些需要jQuery。 有些沒有。
<self-promotion type="shameless">
我創建了Oxydizr ,這是一個事件委托庫,不需要jQuery,但是需要面向對象的JavaScript。 它利用HTML5屬性來定義哪些用戶操作導致JavaScript中的方法調用。
</self-promotion>
編寫模塊JavaScript代碼
您可能需要重構JavaScript,以便可以對其進行初始化和未初始化:
示例JavaScript:
function Foo(element) {
this.element = typeof element === "string"
? document.getElementById(element)
: element;
this.handleDeleteItem = this.handleDeleteItem.bind(this);
this.init();
}
Foo.prototype = {
constructor: Foo,
init: function() {
var items = this.element.querySelectorAll("button.delete-item"),
length = items.length, i = 0;
for (i; i < length; i++) {
items[i].addEventListener("click", this.handleDeleteItem, false);
}
},
uninit: function() {
var items = this.element.querySelectorAll("button.delete-item"),
length = items.length, i = 0;
for (i; i < length; i++) {
items[i].removeEventListener("click", this.handleDeleteItem, false);
}
},
handleDeleteItem: function(event) {
event.preventDefault();
// ... do other stuff
}
};
HTML:
<ul id="foo">
<li>Item 1
<button class="delete-item">X</button>
</li>
<li>Item 2
<button class="delete-item">X</button>
</li>
</ul>
JavaScript開始了:
var foo = new Foo("items");
發生錯誤時:
foo.uninit();
如果您可以繼續使用該頁面:
foo.init();
對於計時器和Ajax請求,您需要跟蹤所有這些對象並清除計時器,並手動取消AJAX請求。
編輯#1
由於應用程序的大部分實際上是一個黑匣子,因此這成為體系結構和通信問題。 如果“黑暗的一半”是您公司控制的東西,則需要與該團隊合作並制定解決方案。 如果他們使用JavaScript框架,請詢問他們使用哪個框架,然后開始學習該框架。 您可以深入研究框架的較低級別的API並找到解決方案。 在這種情況下,逆向工程是您的朋友。
不確定100%,但我認為
$( “*”)解除綁定()。
應該可以。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.