javascript - TypeError : Value undefined (result of expression xmlDoc. 加载)不是对象

标签 javascript xml ajax

我正在尝试使用 Javascript 加载 XML 文件,但我还没有找到适用于 IE、Firefox 和 Safari 的良好功能。我目前使用的加载函数基本上是直接从 w3schools 教程中提取的函数:

http://www.w3schools.com/XML/tryit.asp?filename=tryxml_dom_createelement

具体代码如下:

if (window.ActiveXObject)
{
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
}
// code for Mozilla, Firefox, Opera, etc.
else if (document.implementation.createDocument)
{
xmlDoc=document.implementation.createDocument("","",null);
}
else
{
alert('Your browser cannot handle this script');
}
xmlDoc.async=false;
xmlDoc.load(dname);

其中 dname = xml 文件的 url。此代码得到“类型错误:值未定义(表达式 xmlDoc.load 的结果)不是对象”。在 Safari 中。

我也试过这个网站上的代码:

http://developer.apple.com/internet/webcontent/xmlhttpreq.html

但是,它会生成一个空 XML 文件。谁能帮忙?

最佳答案

听起来问题是 Safari 不支持 document.implementation.createDocument 作为获取和加载 XML 源的方法。您必须使用 XMLHttpRequest 来获取和解析 XML AFAIK。

我已经尝试了您链接的 Apple 教程中代码的修改版本,它似乎对我有用。这段代码不是世界上最好的,它缺少很多错误处理,但它是我手头上唯一的概念证明。

注意:我强烈推荐使用库。浏览器与 XMLHttpRequests 和 XML 解析的不一致比比皆是。值得投资!

对于非库版本,我使用了 safari 代码的修改版本来获取 XMLHttpRequest:

function getXHR(url,callback) {
    var req = false;
    // branch for native XMLHttpRequest object
    if(window.XMLHttpRequest && !(window.ActiveXObject)) {
        try {
            req = new XMLHttpRequest();
        } catch(e) {
            req = false;
        }
    // branch for IE/Windows ActiveX version
    } else if(window.ActiveXObject) {
        try {
            req = new ActiveXObject("Msxml2.XMLHTTP");
        } catch(e) {
            try {
                req = new ActiveXObject("Microsoft.XMLHTTP");
            } catch(e) {
                req = false;
            }
        }
    }

    if(req) {
        req.onreadystatechange = function() { callback( req ) };
        req.open("GET", url, true);
        req.send("");
    }
}

从结果中获取 XML 也有其自身的怪癖:

function getXML( response ) {
    if( response.readyState==4 ) {
        //Get the xml document element for IE or firefox
        var xml;
        if ( response.responseXML ) {
                xml = new ActiveXObject("Microsoft.XMLDOM");
                xml.async = false;
                xml.loadXML(response.responseText);
        } else {
                xml = response.responseXML;
        }

        return xml;
    }

    return null;
}

最终使用你得到的:

function callback( response ) {
    var xmlDoc = getXML( response );
    if( xmlDoc ) {
        //do your work here
        ...
    }       
}

如果您仍然发现自己遇到问题,可以检查一些可能会解决问题的方法。

  1. 您是否将内容类型设置为文本/xml?
  2. 您的请求是否真正到达服务器并返回?
  3. 当您提醒/检查响应文本时,您是否看到任何不属于的内容?
  4. 您的 XML 格式是否正确?通过验证器运行它。

祝你好运!干杯。

关于javascript - TypeError : Value undefined (result of expression xmlDoc. 加载)不是对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/598699/

相关文章:

javascript - 显示延迟的网络摄像头/摄像头流 - webrtc

c++ - 从原始 xml 创建 xml 文件的子集,同时保持相同的结构

java - com.sun.istack.SAXException2 和 javax.xml.bind.JAXBException 异常

javascript - IE8 上的 jQuery ajax 总是返回错误 : "Type Error: Could not complete the operation due to error 80070005"

javascript - 单击时 HTML 输入字段未获得焦点

c# - 从 javascript 调用 csharp 方法

javascript - 通过ajax发送两个数组或带有变量的数组

php - Ajax 在同一页面上发布到 php 不起作用

javascript - jQuery:选项卡/内容可以链接到的选项卡

c# - 以 Base64 编码写入 XML