问题描述
昨天用js解析xml时遇到一个奇怪的问题,使用console输出xml某个节点的节点数时,始终输出0,但是在console前面增加一个alert()函数后,console可以正常输出节点数,而alert弹出的节点数却也是0。
下面是代码:
window.onload=function(){
var xml=loadXML("./test.xml");
alert(xml.getElementsByTagName("row").length);
console.log(xml.getElementsByTagName("row").length);
openNew(xml);
}
loadXML = function (xmlFile) {
var xmlDoc;
if(window.ActiveXObject) {
xmlDoc =new ActiveXObject("microsoft.xmldom");
}else if (document.implementation && document.implementation.createDocument) {
xmlDoc = document.implementation.createDocument('','', null);
}
try{
xmlDoc.load(xmlFile);
}catch(e){
alert(e);
}
return xmlDoc;
}
问题解决
- 原来是因为js异步执行导致xml还没有加载完成,程序就执行完console,所以在没有加alert时,console的输出是0。在loadXML()中加入关闭异步的代码就行了。
- 之所以加入alert之后,console输出正常,是因为alert可以阻断js的执行,阻断的期间,xml已经加载完成。
加入关闭异步的位置:
loadXML = function (xmlFile) {
var xmlDoc;
if(window.ActiveXObject) {
xmlDoc =new ActiveXObject("microsoft.xmldom");
}else if (document.implementation && document.implementation.createDocument) {
xmlDoc = document.implementation.createDocument('','', null);
}
try{
xmlDoc.async =false;//关闭异步执行,让页面等待xmlDoc加载完毕,再继续执行
xmlDoc.load(xmlFile);
}catch(e){
alert(e);
}
return xmlDoc;
}
我又在后面的用了一个1毫秒延时的定时器,发现加载还是很快的,1毫秒之内就xml加载完成了。
console.log(xml.getElementsByTagName("row").length);
setInterval(function(){
console.log(xml.getElementsByTagName("row").length);
},1);