問題描述:
今天在寫一個基於 jquery 的讀取xml文件的程序時候,需要遍歷xml的節點。
代碼片段如下:
1 function parse_xml_node(parent,result){ 2 // result[$(parent)[0].nodeName] = {}; 3 if( false == ($(parent)[0].nodeName in result)){ 4 result[$(parent)[0].nodeName] = {}; 5 } 6 7 // 獲取子節點 8 var childs = $(parent)[0].children; 9 // 遍歷子節點 10 $.each(childs,function(i,val){ 11 if(i==0){ 12 result[$(parent)[0].nodeName]['children'] = []; 13 } 14 result[$(parent)[0].nodeName]['children'].push({}); 15 parse_xml_node($(this),result[$(parent)[0].nodeName]['children'][i]); // 函數遞歸 16 }); 17 18 return result; 19 }
其中,parent 代表我需要遍歷的父級節點,然后對獲取到的子節點進行遍歷,也就是 $.each(childs,function(){}) 的程序。
上述程序,采用遞歸的方式,一層層遍歷子節點,直到遍歷完成。
由於是在 Chrome 瀏覽器下開發的,所以在 Chrome 瀏覽器中,解析的是正確的,而在 IE 下卻沒有解析到子節點。
解決方法:
IE瀏覽器下,在上述程序 Line 8 地方打斷點,發現:$(parent)[0] 沒有 children 屬性,度娘后也發現 IE 不支持 children,但是有 childNode 屬性。
而 childNode 節點屬性又分為 TextNode(文本節點)和 元素節點。
找到了問題的原因,就修改程序如下:
1 var childs = $(parent)[0].children || (function(){ 2 // 兼容IE 3 var children = []; 4 $.each($(parent)[0].childNodes,function(i,e){ 5 if (Object.prototype.toString.call(e) === "[object Element]") { 6 // 判斷是元素節點 7 children.push(e); 8 } 9 }); 10 return children; 11 })();
當程序運行時,獲取到 children 屬性,就返回 children的屬性值,若沒有,則 children 值為 undefined。執行 || 之后的程序。
如此改動后,問題解決。
注意:|| 在此處充當短路運算的作用。