我正在使用的一些代码将一些具有 Dojo 事件侦听器的 HTML 元素替换为来自 AJAX 调用的新 HTML(使用 .innerHTML=)。我已经读过事件侦听器应该在被替换之前使用 dojo.disconnect(handle) 方法断开连接以防止内存泄漏。
是否可以派生连接到特定元素的所有句柄,以便我可以将每个句柄传递给 .disconnect(handle),还是由我在代码中维护此列表?
我正在使用的一些代码将一些具有 Dojo 事件侦听器的 HTML 元素替换为来自 AJAX 调用的新 HTML(使用 .innerHTML=)。我已经读过事件侦听器应该在被替换之前使用 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 代码可能非常非常难看,所以也许您想创建自己的命名空间。