这是因为getElementById再结合children属性获取的是DOM元素,而querySelectorAll获取的则是NodeList对象元素。前者会随页面DOM结构的变化而变化,比如删除了box中的一个div,这个div就会从children中被“真实地”删掉,children.length的计数也会减1。而后者如果删除其中的某个子元素,被删的元素并不会消失,而是变成一个空对象,children1.length的计数也不会改变,这样的话 for(var i=0i<children1.length) 这个循环由于i的值不变(总是等于0),而children1.length也不会减少(总是4),这样就变成死循环了(同时也意味着把一个已删除的元素不断重复删除)。
改成这样就没问题了:
for(var i=0i<children1.lengthi++){
box.removeChild(children1[i])
}
<div id="test"><div></div>
<div></div>
</div>
<script>
function dom() {
var s= document.getElementById("test")
var chils= s.childNodes //得到s的全部子节点
var par=s.parentNode //得到s的父节点
var ns=s.nextSbiling //获得s的下一个兄弟节点
var ps=s.previousSbiling //得到s的上一个兄弟节点
var fc=s.firstChild //获得s的第一个子节点
var lc=s.lastChile //获得s的最后一个子节点
}
</script>
使用元素对象的getElementsByTagName('tagName')方法可以获得一个元素对象内所有的指定tagName标签的对象, 其返回值为一个数组, 然后遍历此数组即可. 例如:var ary = piece.getElementsByTagName("span"), i, spanObj
for (i = 0i <ary.lengthi++) {
spanObj = ary[i]
// 进行处理
}
当然, 前提是你的piece对象为一个有效的页面元素对象(如div对象).