<div id="content">
<h1>html</h1>
<h1>php</h1>
<h1>javascript</h1>
<h1>jquery</h1>
<h1>java</h1>
</div>
<script type="text/javascript">
function clearText() {
var content=document.getElementById("content");
// 在此完成该函数
for(var i=0;i<content.childNodes.length;i++){
var x=content.removeChild(content.childNodes[i]);
document.write("被移除的内容是:"+x.innerHTML+"<br>"); //这一句的问题在哪里????
}
}
</script>
运行结果:
被移除的内容是:undefined
被移除的内容是:undefined
被移除的内容是:undefined
被移除的内容是:undefined
被移除的内容是:undefined
被移除的内容是:undefined
for(var i=0;i<content.childNodes.length;i++) 你应该从后面的元素的删除起, 而不是 前面.
我也被这个难到了
自答。
因为在Chrome,Firefox等浏览器看来,HTML代码写在一行和分多行是有区别的,上述HTML部分实际上存在空节点,如图片:
空节点是不具有innerHTML属性,其次在循环的同时,数组的长度在改变,这就难以得到正确结果。
正确做法之一是,将非空节点存在新数组中,然后处理新数组元素:
<div id="content"> <h1>html</h1> <h1>php</h1> <h1>javascript</h1> <h1>jquery</h1> <h1>java</h1> </div> <script type="text/javascript"> function clearText() { var content=document.getElementById("content"); var childArr = content.childNodes; //筛选出元素节点(新数组里不再有空节点) var eleNodeArr = new Array(); for(var i=0;i<childArr.length;i++){ if(childArr[i].nodeType==1){ var x = eleNodeArr.push(childArr[i]);//将元素节点存入新数组 } } // 依次删除元素节点 for (var i=0;eleNodeArr.length; i++) { var y = content.removeChild(eleNodeArr[i]); document.write("被删除的内容为:"+y.innerHTML+"<br>");//注意,这里不能用eleNodeArr[i]代替y } } </script> <button onclick="clearText()">清除节点内容</button>