2013-04-17 57 views
4

我有一个包含大约1,500行的表。性能:jQuery remove()vs JavaScript removeChild()

我从下面的jQuery代码的DOM删除表:

$('#myTable').remove(); 

这需要300ms左右,创造了相当明显的滞后。

做同样的事情用removeChild移除():

var myTable = $('#myTable')[0] ; 
myTable.parentNode.removeChild(myTable); 

需要大约30毫秒。

我可以很容易地使用removeChild()版本,但我很困惑为什么jQuery的remove()会花更长的时间? removeChild()版本没有清除jQuery的东西?

演示:jspref

+0

阅读@ dystroy的见解后,我开始寻找一个jQuery源代码工具。这里有一个很好的源代码查看器:http://james.padolsey.com/jquery/ – Kong

回答

8

the documentation

除了元素本身,所有绑定事件和jQuery与元件相关联的数据 除去。

这意味着:

  • ,这个功能做一些额外的工作(主要是呼吁cleanData为自己和孩子的)
  • ,你通常应该使用它以避免内存泄漏

这在源代码中看起来很清楚:

remove: function(selector, keepData) { 
    var elem, 
     i = 0; 

    for (; (elem = this[i]) != null; i++) { 
     if (!selector || jQuery.filter(selector, [ elem ]).length > 0) { 
      if (!keepData && elem.nodeType === 1) { 
       jQuery.cleanData(getAll(elem)); 
      } 

      if (elem.parentNode) { 
       if (keepData && jQuery.contains(elem.ownerDocument, elem)) { 
        setGlobalEval(getAll(elem, "script")); 
       } 
       elem.parentNode.removeChild(elem); 
      } 
     } 
    } 

    return this; 
} 
+0

为什么只有一部分答案? – Bergi

+0

@Bergi我编辑过。总是有与jQuery操作相关的开销。但它不是很有趣,所以我简化了这个措辞。 –

+0

谢谢!这清楚地解释了时差。我不知道它是否安全绕过cleanData()?我没有任何针对该元素的jQuery事件。 – Kong