`
luotuoass
  • 浏览: 639790 次
文章分类
社区版块
存档分类
最新评论

关于XMLDOM对象的不同浏览器间节点长度计算问

 
阅读更多

我在项目实际应用中,用javascript基于XML创建动态树,并实现跨浏览器的功能。但在实现时,通过nodes.length动态创建节点时,google的Chrome和FireFox都会出现死循环,实现不了预期目的,而IE却能实现预期目的。

原因是IE的XMLDOM的节点长度记录的是初始长度,而Chrome、FireFox的节点长度是动态变化的.

for(var i=0;i<pnlist.length;i++){//仅IE适用,其值是初始长度。
//通过这种方式实现动态变化,除了IE外,另外2浏览器会死循环,达不到预期目的!!
//for(var i=0;i<len;i++){ //IE、FireFox、Chrome通用;可以达到预期目的

//动态更新xml内容……

}

我写了一个测试页面,详细内容如下(js代码没有单独创建,有兴趣的朋友可以继续往下看……):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
<SCRIPT LANGUAGE="JavaScript">
<!--
var xmlDoc = null ;
var isIE = (navigator.appName=="Microsoft Internet Explorer") ;
//1、
function createDOM(){
//var isIE = (navigator.appName=="Microsoft Internet Explorer") ;
if(!isIE){
if(this.ns==null)this.ns="";if(this.root==null)this.root="";
return document.implementation.createDocument(this.ns,this.root,null);
}else {
var aVers = ["MSXML2.DOMDocument.5.0","MSXML2.DOMDocument.4.0","MSXML2.DOMDocument.3.0","MSXML2.DOMDocument","Microsoft.XmlDom"];
for(var i=0;i<aVers.length;i++){
try{
var oxmlDom = new ActiveXObject(aVers[i]);
return oxmlDom;
}catch(oError){
//不做任何处理
}
}
}
throw new Error("MSXML or 其他XMLDom对象没有安装!");
}
//2、//从规范的xml字符串生成xml对象
function createXMLDoc(xmlStr){
var xmldoc = null ;
if(isIE){
xmldoc = this.createDOM() ;
xmldoc.async="false";
xmldoc.loadXML(xmlStr);
}else {
var parser=new DOMParser();
xmldoc=parser.parseFromString(xmlStr,"text/xml");
}
//alert(xmldoc.documentElement.firstChild.nodeName);
return xmldoc ;
}
function reloadXML(xmldoc){
this.genXmlDTree(xmldoc);
}
function iniLoad(){
var strxml = "<xtree>"+
"<node>"+
"<id>x01</id>"+
"<pid>0</pid> "+
"<name>Killer-01.</name> "+
"<url>xxx/page.jsp?xx=yy</url> "+
"<title>标题1</title> "+
"<target>workSpace</target>"+
"<node>"+
"<id>x01d1</id>"+
"<pid>x01</pid> "+
"<name>Killer-01-01</name> "+
"<url>xxx/page.jsp</url> "+
"<title>标题011</title> "+
"<target>workSpace</target>"+
"</node>"+
"</node>"+
"<node id=/"second/">"+
"<id>x02</id>"+
"<pid>0</pid> "+
"<name>节点-02</name> "+
"<url>xxx/page.jsp</url> "+
"<title>标题====02</title> "+
"<target>workSpace</target>"+
"</node> "+
"</xtree>";
xmlDoc = createXMLDoc(strxml);
var oRoot = xmlDoc.documentElement ;
var str = null ;
if(isIE){
str = oRoot.xml;
}else{
alert("非IE浏览器:");
str =(new XMLSerializer()).serializeToString(oRoot);
}
document.getElementById("initData").value = "" ;
document.getElementById("dynData").value="";
document.getElementById("initData").value = str ;
}
function reloadMyData(){
var pnlist = xmlDoc.getElementsByTagName("node");//获得node节点 3个node
var len = pnlist.length ;
var ids = new Array() ;
for(var i=0;i<len;i++){
ids[i]=pnlist[i].getElementsByTagName("id")[0].childNodes[0].nodeValue;
}
//注意:关于xml节点长度问题
//pnlist.length 针对IE,其值是初始长度;针对FireFox、Chrome是动态长度
//
for(var i=0;i<pnlist.length;i++){//仅IE适用,其值是初始长度。
//通过这种方式实现动态变化,除了IE外,另外2浏览器会死循环,达不到预期目的!!
//for(var i=0;i<len;i++){ //IE、FireFox、Chrome通用;可以达到预期目的
var pn = pnlist[i];
alert("NODE长度:"+pnlist.length);
//var pid=ids[i];
var pid=pn.getElementsByTagName("id")[0].childNodes[0].nodeValue;
for(var m=0;m<2;m++){//每个node下再增加2个node节点
var nn =xmlDoc.createElement("node");
var cn=xmlDoc.createElement("id");
var txt=xmlDoc.createTextNode("cnid_"+i+"_"+m);
cn.appendChild(txt);
nn.appendChild(cn);
cn=xmlDoc.createElement("pid");
txt=xmlDoc.createTextNode(pid);
cn.appendChild(txt);
nn.appendChild(cn);
cn=xmlDoc.createElement("name");
txt=xmlDoc.createTextNode("Name_"+i+"_"+m);
cn.appendChild(txt);
nn.appendChild(cn);
cn=xmlDoc.createElement("url");
txt=xmlDoc.createTextNode("url/"+i+"_"+m+".jsp");
cn.appendChild(txt);
nn.appendChild(cn);
cn=xmlDoc.createElement("title");
txt=xmlDoc.createTextNode("title-tip-"+i+"_"+m);
cn.appendChild(txt);
nn.appendChild(cn);
cn=xmlDoc.createElement("target");
txt=xmlDoc.createTextNode("workSpace");
cn.appendChild(txt);
nn.appendChild(cn);
pn.appendChild(nn);
}
}
var oRoot = xmlDoc.documentElement ;
var str = null ;
if(isIE){
str = oRoot.xml;
}else{
alert("非IE浏览器:");
str =(new XMLSerializer()).serializeToString(oRoot);
}
document.getElementById("dynData").value = str ;
}


//-->
</SCRIPT>
</HEAD>

<BODY onload="iniLoad()">
初始化xml:<BR>
<TEXTAREA id="initData" style="background-color:#9999FF" NAME="" ROWS="20" COLS="120"></TEXTAREA>
<HR>
动态加载xml:<INPUT TYPE="button" NAME="" value="动态加载" onclick="reloadMyData()"><BR>
<TEXTAREA id="dynData" style="background-color:#9999FF" NAME="" ROWS="20" COLS="120"></TEXTAREA>
</BODY>
</HTML>

分享到:
评论

相关推荐

    《javaScrip开发技术大全》源代码

    • sample17.htm 字符串长度 • sample18.htm 创建字符串 • sample19.htm 字符串与Unicode编码 • sample20.htm 返回字符串中的一个字符 • sample21.htm 通过字符串的...

    xml实用大全和轻松学习手册和无废话xml

    14.4 使用xsl:value-of来计算节点值 440 14.5 使用xsl:for-each处理多个元素 442 14.6 匹配节点的模式 444 14.6.1 匹配根节点 444 14.6.2 匹配元素名 445 14.6.3 使用/字符匹配子节点 447 14.6.4 使用//符号匹配子代...

    XML实用大全(web开发必备手册)

    3.1.3 将XML文件装入Web浏览器... 35 .2 考察简单的XML文档... 37 3.3 赋于XML标记以意义... 39 .4 为XML文档编写样式单... 40 .5 将样式单附加到XML文档上... 41 3.6 本章小结... 43 第4章 数据的结构化... ...

    JavaScript权威指南(第6版)(附源码)

    本书要讲述的内容涵盖JavaScript语言本身,以及Web浏览器所实现的JavaScriptAPI。本书第6版涵盖了HTML5和ECMAScript5,很多章节完全重写,增加了当今Web开发的最佳实践的内容,新增的章节包括jQuery、服务器端...

    JavaScript 权威指南(第四版).pdf

     11.7 E4X: ECMAScript for XML286  第12章 服务器端JavaScript290  12.1 用Rhino脚本化Java291  12.2 用Node实现异步I/O297  第二部分 客户端JavaScript  第13章 Web浏览器中的JavaScript309  13.1 客户端...

    JavaScript权威指南(第6版)中文版pdf+源代码

     11.7 E4X: ECMAScript for XML286  第12章 服务器端JavaScript290  12.1 用Rhino脚本化Java291  12.2 用Node实现异步I/O297  第二部分 客户端JavaScript  第13章 Web浏览器中的JavaScript309  13.1 客户端...

    JavaScript权威指南(第6版)(中文版)

    《JavaScript权威指南(第6版)》主要讲述的内容涵盖JavaScript语言本身,以及Web浏览器所实现的JavaScript API。本书第6版涵盖了HTML5和ECMAScript 5,很多章节完全重写,增加了当今Web开发的最佳实践的内容,新增...

    JavaScript权威指南(第6版)

    《JavaScript权威指南(第6版)》主要讲述的内容涵盖JavaScript语言本身,以及Web浏览器所实现的JavaScript API。本书第6版涵盖了HTML5和ECMAScript 5,很多章节完全重写,增加了当今Web开发的最佳实践的内容,新增...

    JavaScript权威指南(第六版) 清晰-完整

    11.7 E4X: ECMAScript for XML 第12章 服务器端JavaScript 12.1 用Rhino脚本化Java 12.2 用Node实现异步I/O 第二部分 客户端JavaScript 第13章 Web浏览器中的JavaScript 13.1 客户端JavaScript 13.2 在HTML里嵌入...

    JavaScript权威指南(第6版) 中文版

    《JavaScript权威指南(第6版)》要讲述的内容涵盖JavaScript语言本身,以及web浏览器所实现的JavaScript API。本书第6版涵盖了 html5 和 ecmascript 5,很多章节完全重写,增加了当今 web 开发的最佳实践的内容,新增...

    JavaScript权威指南(第6版)

    《JavaScript权威指南(第6版)》要讲述的内容涵盖JavaScript语言本身,以及web浏览器所实现的JavaScript API。本书第6版涵盖了 html5 和 ecmascript 5,很多章节完全重写,增加了当今 web 开发的最佳实践的内容,新增...

    JavaScript权威指南(第6版)中文文字版

    《JavaScript权威指南(第6版)》要讲述的内容涵盖JavaScript语言本身,以及web浏览器所实现的JavaScript API。本书第6版涵盖了 html5 和 ecmascript 5,很多章节完全重写,增加了当今 web 开发的最佳实践的内容,新增...

    JAVA面试题最全集

    选择树的一个节点时,如何得到这个节点? 70.向编辑框中输入字符时,如何控制只输入整数? 71.描述使用JDBC连接数据库的过程 72.EJB分为几类?什么是BMP,CMP? 73.什么是JNDI? 74.ADO是什么?ActiveX数据对象,是...

Global site tag (gtag.js) - Google Analytics