[英]Is it possible to disconnect all event handlers in Dojo?
我正在使用的某些代碼將一些具有Dojo事件偵聽器的HTML元素替換為來自AJAX調用(使用.innerHTML =)的新HTML。 我已經讀過,在替換事件偵聽器之前,應使用dojo.disconnect(handle)方法斷開事件偵聽器的連接,以防止內存泄漏。
是否可以派生連接到特定元素的所有句柄,以便我可以將每個句柄傳遞給.disconnect(handle),還是由我自己在代碼中維護此列表?
實際上,如果您使用的是小部件,則通常應斷開tehir destroy()方法中的內容。 如果您自己處理節點,那么我會看到兩種方法。
1)手動管理所有連接,意味着將它們存儲在某個位置。 2)可能更安全:將所有連接處理程序存儲在它們連接的節點中,如下所示:
node._connectHandlers = [];
node._connectHandlers.push(dojo.connect(node, "onclick", ...));
然后,您可以使用以下命令斷開所有連接
dojo.query("*", nodeContainingConnects).forEach(function(node){
if (typeof node._connectHandlers!="undefined"){
dojo.forEach(node._connectHandlers, "dojo.disconnect(item)");
}
});
實際上,這可能效果很好,但是可能存在更有效的方式來按節點獲取所有連接。 我只是沒有找到它。 hth
按照Wolfram Kriesing的答案,可以“改進”:
dojo._connect_tmp = dojo.connect;
dojo.connect = function (obj, event, context, method, dontFix) {
if(obj._connectHandlers == undefined){ obj._connectHandlers = [];}
var handler = dojo._connect_tmp (obj, event, context, method, dontFix);
obj._connectHandlers.push(handler);
return handler;
};
dojo.iwanttobefree = function (obj) {
if(obj._connectHandlers == undefined) {
} else {
dojo.forEach(obj._connectHandlers, "dojo.disconnect(item)");
}
};
然后,您可以執行以下操作:
dojo.connect(myObj, 'onfocus', function(){alert('weee')});
dojo.iwanttobefree(myObj);
由於多種原因,替換dojo代碼可能非常非常丑陋,因此也許您想創建自己的名稱空間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.