代码之家  ›  专栏  ›  技术社区  ›  Will

jquery:是否有理由不将dom元素存储在变量中,而不是将它们附加到dom中?

  •  2
  • Will  · 技术社区  · 14 年前

    我正在开发一个插件,它获取远程页面的一部分,并保存该部分以在jquery ui对话框小部件中使用;最初我将HTML附加到DOM并用 display:none 直到它被 $.dialog 但我意识到我可以把dom节点留在变量中。

    有什么理由不这样做吗?下面是一个例子:

    function makeDialogLink() {
    
        var HTML = $("<div />").load('file.html #container', function() {
    
            $('a#test').bind('click', function(e) {
                e.preventDefault();
                showDialog();
            }); 
        });
    
        function showDialog() {
            $(HTML).dialog({
                autoOpen : true,
                width  : opts.width,
                modal  : opts.modal,
                resizable : opts.resizeable,
                title  : opts.title
            });
    
            // some other stuff happens in here, and a setTimout
            closeDialog();
        }
        function closeDialog() {
            $(HTML).dialog('close');
        }
    }
    

    我已经从实际工作中简化了这一点,但这很好地概括了我的问题所在。

    如您所见,我已经加载了远程文档的一部分,我将它弹出到一个对话框中,稍后关闭该对话框,但我从未将提取的HTML直接附加到DOM。( $对话框 当然是在某个时候做的)。

    有什么理由不这样做吗?看起来好多了,然后把HTML推到一个隐藏的DIV中,然后再把它取出来。我只是想知道是否有一些陷阱,我不知道用这种方式在JavaScript中使用闭包。

    3 回复  |  直到 14 年前
        1
  •  2
  •   Cristian Sanchez    14 年前

    我想不出有什么严重的缺点。它可能会慢一点,因为每次需要对话框时都会将其重新连接到DOM,但这并不重要,因为1)除非弹出数百个对话框,否则差异甚至不会明显;2)如果有切换的DIV,它可能不会慢很多。

    这似乎是最好和最干净的解决方案。如果我在你的位置,我会保留它。

        2
  •  1
  •   josh3736    14 年前

    是的,对于未连接到DOM的节点,必须非常小心。 IE is notoriously bad at leaking memory. (向下滚动到“跨页泄漏”部分。)

    因为您正在创建一个未连接的DOM树,然后将其附加到文档(在 showDialog() )我可以想象您的代码会泄露。当然,唯一能确定的方法就是找到一些分析工具并找出答案。

    更安全的方法是使用隐藏的 div .

    var HTML = $("#hiddenDiv").load('file.html #container');
    
        3
  •  1
  •   morgancodes    14 年前

    您还可以将来自Ajax调用的数据存储为字符串(使用$.get或$.ajax)。仅在用户单击对话框按钮后创建DOM元素。