Chrome使用XML DOM的getElementsByTagName()返回不正确的NodeList

17 浏览
0 Comments

Chrome使用XML DOM的getElementsByTagName()返回不正确的NodeList

这个问题已经有答案了:

可能重复:

Chrome:禁用同源策略

关于我的问题,以下是一些背景信息:

  • 编写一个用于图片库的JavaScript文件;从一个XML文件中拉取数据,点此查看。
  • 使用XMLHttpRequest()异步加载DOM对象。
  • 使用DOMParser解析响应文本以生成DOM对象。
  • 在Firefox上工作,但在Chrome上失败。

编辑(请阅读):

使用console.log后,似乎Chrome报告了跨源问题:

  • 无法加载资源文件:./Gallery/dropdown_style.css
  • XMLHttpRequest无法加载文件:./Gallery/gallery_info.xml。跨源请求仅支持HTTP。
  • NodeList[0]
  • 长度:0
  • 未捕获的错误:NETWORK_ERR:XMLHttpRequest异常101
  • 无法加载资源./Gallery/Pictures/bg_one.jpg

现在我的问题是:

  1. 如何在本地级别(离线)解决这个问题?
  2. 即使我将所有文件上传到同一个服务器,这仍然是一个问题吗?
  3. 如果是,那么解决方案是什么(在线)?

现在DOM对象在Firefox和Chrome上都正确传递。

并在以下代码中:

window.alert(xmlDoc.getElementsByTagName("pic"));

它返回“HTML Collection”或在Chrome中是“NodeList”的响应。但是,当我在Chrome中询问该NodeList的长度时,它返回0,这意味着NodeList的格式不正确,或者不像我想要的那样。

在FireFox中,长度将返回一个值为2,这正是我想要的。

这是我的源代码,没有冗余术语:

var elemPic = [];
function initGallery(xmlFName){
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.open("GET", xmlFName, true);
    xmlhttp.onreadystatechange = function(){
        if (xmlhttp.readyState == 4){ //since it's offline and local, don't check status == 200
            //use a DOMParser, which is in a different file
            myCallBack(parseXml(xmlhttp.responseText));
        }
    }
    xmlhttp.send();
}
function myCallBack(xmlDoc){
    //window.alert(xmlDoc);
    elemPic = xmlDoc.getElementsByTagName("pic");
    //window.alert(elemPic);
    for(var i = 0; i < elemPic.length; i++){
        //whats the source path?
        var src = elemPic[i].getElementsByTagName('src')[0].childNodes[0].nodeValue;
        window.alert(src);
    }
}

如果您想查看它,请这里看我的整个源文件夹:源文件夹

我不确定这是哪些问题之一:

  1. DOM xml对象损坏
  2. NodeList损坏
  3. getElementsByTagName()的Chrome总体问题
  4. 其他

如果您能帮助我确定问题的确切来源和解决方法,那么我将非常感激。

admin 更改状态以发布 2023年5月21日
0
0 Comments

回答:看起来问题出在了同源策略上。对于本地访问,将文件上传到本地的Web服务器上,或者更改Chrome的测试设置。如果上传到服务器上应该不会有问题。

非常感谢用户Luminously、Diego Pino和Bergi。

解决问题的步骤:

  1. 使用console.log()而不是window.alert() - 它更详细和准确。
  2. 本地:将文件上传到本地Web服务器或更改Chrome设置(禁用Web安全性)
  3. 全局:如果上传到服务器上,没有问题。
0