Javascript到Jquery的转换,每次迭代都删除第一个子项

Javascript到Jquery的转换,每次迭代都删除第一个子项,javascript,jquery,Javascript,Jquery,我正在用Jquery重写一些旧项目以更好地学习它,除了这个while循环之外,我设法做了所有的事情。它应该循环通过一个div容器,每次都删除第一个子对象 var calendarModel = { siteContainer: $('#calendar-container') } while (calendarModel.siteContainer.firstChild) { calendarModel.siteContainer.removeChild(calendarMod

我正在用Jquery重写一些旧项目以更好地学习它,除了这个while循环之外,我设法做了所有的事情。它应该循环通过一个div容器,每次都删除第一个子对象

var calendarModel = {
    siteContainer: $('#calendar-container')
}

while (calendarModel.siteContainer.firstChild) {
    calendarModel.siteContainer.removeChild(calendarModel.siteContainer.firstChild);
}
我的第一次(可怕的)尝试没有产生任何结果,除了一个无限循环:

var firstDiv = $('div:first-child', calendarModel.siteContainer);

while (firstDiv) {
    firstDiv.remove();
}
然后我试了一下:

var firstDiv = $('div:first-child', calendarModel.siteContainer);

while (calendarModel.siteContainer.firstDiv) {
    calendarModel.siteContainer.firstDiv.remove();
}
更糟糕的是,它甚至没有进入循环

我还尝试不使用循环,看看它是否删除了任何内容:

var firstDiv = $('div:first-child', calendarModel.siteContainer);
    firstDiv.remove();

然而,事实并非如此。我真的被困住了,所以我非常感谢你在这件事上的帮助。有什么想法吗?

循环中必须有一个测试条件。它们循环执行,直到测试条件不再为真。因此,假设您的
firstDiv
选择器有一个div数组

var i = 0;
while(firstDiv.length > i){
   console.log(firstDiv[i]);
   i++;
}

使用jQuery使用本机api删除节点是危险的,因为它可能导致内存泄漏

而是使用jQuery方法来清理数据

calendarModel.siteContainer.children().remove();

你能发布示例标记吗?@JamesHill-jsFiddle你的意思是?Fiddle,或者只是问题。显然…fiddle更好:)为什么不:
calendarModel.siteContainer.empty()?为什么要将工作JS代码转换为jQuery?你只是增加了不必要的开销。你可能是指
>i
。如果
.length
10
i
0
,那么
10<0
的结果是什么?由于
i
0
开始并递增,因此您希望它在
firstDiv.length>i
期间运行。有几种方法可以做到这一点。如果需要转到文本节点,则可以使用
.contents()
而不是
.children()
。或者按照上面的注释使用
.empty()
。对于.empty()和.children().remove()的执行时间是否有差异?您推荐哪一种?@Chrillewoodz:如果您想删除所有内容,可能应该执行
.empty()
,但是jQuery已经相当慢了。如果需要更好的性能,那么可能需要减少或消除jQuery。如果没有,那么在您真正遇到性能问题之前不要担心。