簡體   English   中英

是否可以斷開Dojo中的所有事件處理程序的連接?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM