日期:2014-05-17  浏览次数:20647 次

初学DOM ,求助一个问题
刚认识DOM 下面的例子 是遍历body元素的子元素

<body>
<div id="example">
    <span id="p1" class="aaa bbb">M1</span>
    <span id="p2" class="aaa ccc">M2</span>
    <span id="p3" class="bbb ccc">M3</span>
</div>  
<img src="1.jpg" id="1.jpg"/>
<img src="2.jpg" id="2.jpg"/>
<br />
</body>
<script>
var root=document.documentElement;  //获取根元素节点document
var rootNodeList=root.childNodes;  //获取根元素节点的所有子节点,包含head和body
for(var i=0;i<rootNodeList.length;i++){
//处理body元素
if(rootNodeList[i].nodeName.toLowerCase()=="body"){
//body元素是否有子节点
if(rootNodeList[i].hasChildNodes()){
//遍历body子节点
var bodyNodeList=rootNodeList[i].childNodes;
for(var j=0;j<bodyNodeList.length;j++){
if(bodyNodeList[j].nodeType==1){
try{
                                document.write("haha");
//上面这行输出haha正常,一共会输出5个,跟了代码,bodyNodeList里面有5个元素节点,5个文本节点
                                 // getNodeInfo(bodyNodeList[j]);  
                                // document.write("haha"+"<br>");  但是如果用的是注释的这两行,在刷新网页的时候,总是未刷新完成的状态,然后浏览器就卡死,必须用任管关掉才行,为什么???
}catch(e){
alert(e.message?e.message:e.toString()) ;
}
}
}
}
}
}
function getNodeInfo(node){
document.write("节点名:"+"node.nodeName"+"<br />");
document.write("节点值:"+"node.nodeValue"+"<br />");
document.write("id属性:"+"node['id']"+"<br />");
document.write("----------------------------");
}

------解决方案--------------------
引用:
刚认识DOM 下面的例子 是遍历body元素的子元素
XML/HTML code?1234567891011121314151617181920212223242526272829303132333435363738394041<body><div id="example">    <span id="p1" class="aaa bbb">M1</span>    <……

简单跟了一下
把这行
   for(var j=0;j<bodyNodeList.length;j++){
改成下边形式
var length = bodyNodeList.length;
for(var j=0;j<length;j++){
即可
原因是
document.write会在bodyNodeList增加一个新节点,bodyNodeList的长度会一直增加下去,然后j<bodyNodeList.length就永远不会失效,成为死循环。
------解决方案--------------------
问题如LS所说,还有下面这个方法要改下,不然会把node.nodeName...当字符串输出。
function getNodeInfo(node){
    document.write("节点名:"+node.nodeName+"<br />");
    document.write("节点值:"+node.nodeValue+"<br />");
    document.write("id属性:"+node['id']+"<br />");
    document.write("----------------------------");
}