【问题标题】:Is it possible to disconnect all event handlers in Dojo?是否可以断开 Dojo 中的所有事件处理程序?
【发布时间】:2009-05-15 20:36:50
【问题描述】:

我正在使用的一些代码将一些具有 Dojo 事件侦听器的 HTML 元素替换为来自 AJAX 调用的新 HTML(使用 .innerHTML=)。我已经读到应该在替换事件监听器之前使用 dojo.disconnect(handle) 方法断开连接以防止内存泄漏。

是否可以派生连接到特定元素的所有句柄,以便我可以将每个句柄传递给 .disconnect(handle),还是由我在代码中维护此列表?

【问题讨论】:

    标签: javascript memory-leaks dojo


    【解决方案1】:

    实际上,如果您使用小部件,它们通常应该在 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

    【讨论】:

    • 由于我不希望我的 AJAX 填充区域包含多个事件处理程序,因此我最终将所有节点的所有句柄存储在我的 dojo 模块中的一个数组中.我可以将每个元素传递给 disconnect 方法,而无需遍历页面上的任何节点。当我触发 AJAX 调用时,FireFox 使用多少内存似乎确实有影响。再次感谢您的帮助!
    • dojo._connect_tmp = dojo.connect; dojo.connect = function (obj, event, context, method, dontFix) { if(obj._connectHandlers == undefined){ obj._connectHandlers = ];} obj._connectHandlers.push(dojo._connect_tmp (obj, event, context, method, dontFix)); }; dojo.iwanttobefree = function (obj) { if(obj._connectHandlers == undefined) {` } else {` ` dojo.forEach(node._connectHandlers, "dojo.disconnect(item)"); }` };
    【解决方案2】:

    按照 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 代码可能非常非常难看,所以也许您想创建自己的命名空间。

    【讨论】:

      猜你喜欢
      • 2011-02-19
      • 1970-01-01
      • 2017-08-24
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多