从父级删除所有子级节点?


79

我有一个列表,我只想从中删除所有子节点。使用jquery的最有效方法是什么?这就是我所拥有的:

<ul id='foo'>
  <li>a</li>
  <li>b</li>
</ul>

var thelist = document.getElementById("foo");   
while (thelist.hasChildNodes()){
    thelist.removeChild(thelist.lastChild);
}

有一种捷径而不是一次删除每个项目吗?

-----------编辑----------------

每个列表元素都有一些附加的数据,以及一个单击处理程序,如下所示:

$('#foo').delegate('li', 'click', function() {
    alert('hi!');
});

// adds element to the list at runtime
function addListElement() {
    var element = $('<li>hi</hi>');
    element.data('grade', new Grade());
}

最终我也可能会为每个列表项添加按钮-因此,看来方法为empty(),以确保没有内存泄漏?


用什么术语高效?性能,可读性?
Gumbo 2010年

除了@Gumbo的问题外,内存还需要多少关注?这些项目是否绑定了事件处理程序?
尼克·克雷弗

考虑到更新的答案,肯定.empty()会去的,以清除数据的出路$.cacheelement.data('grade', new Grade());在增加。
尼克Craver

是的,有数据绑定,最终可能有事件处理程序绑定(现在我只是为所有项目使用委托)。
user246114 2010年

@NickCraver我只是在这里吐痰,但是即使使用JS,您也可以做theList.innerHTML=""
John Strood

Answers:


185

您可以.empty()这样使用:

$("#foo").empty();

从文档

从DOM中删除匹配元素集的所有子节点。


6
为了避免内存泄漏,jQuery
user113716 2010年

1
@patrick-+1,这是通常推荐使用的方法的另一个原因.html(''),因为数据根本没有存储在元素上,很多人都忘记了造成泄漏的原因。
尼克·克雷弗

1
+1此外,如果您确定没有事件绑定到父级的子级,则$("#foo")[0].innerHTML="";速度会更快。请注意,以这种方式删除元素时,不要引起任何内存泄漏(empty()已经非常小心,以确保不会发生这种情况,尤其是在IE中)。
大卫·默多克

@David-这些事件在所有浏览器中都是一个问题,但是要点是,IE确实还有其他内存问题,其中很多。由于事件实际上$.cache与数据中的其他所有内容一起存储,因此无法通过html设置调用将其删除。
尼克·克雷弗

1
好的更新的问题,是的,我确实有一些与每个元素相关联的数据,所以看起来Empty()是解决之道。
user246114 2010年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.