js:异步的锅-->不能取到xml节点数

问题描述

昨天用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节点数_第1张图片
alert弹出值
console输出值

问题解决

  • 原来是因为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);
Paste_Image.png

你可能感兴趣的:(js:异步的锅-->不能取到xml节点数)