【问题标题】:TypeError: Value undefined (result of expression xmlDoc.load) is not objectTypeError:值未定义(表达式 xmlDoc.load 的结果)不是对象
【发布时间】:2010-10-10 13:36:13
【问题描述】:

我正在尝试使用 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。此代码得到“TypeError:未定义的值(表达式 xmlDoc.load 的结果)不是对象。”在 Safari 中。

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

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

但是,它会生成一个空 XML 文件。有人可以帮忙吗?

【问题讨论】:

    标签: javascript xml ajax


    【解决方案1】:

    听起来问题在于 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. 您是否将内容类型设置为 text/xml?
    2. 您的请求是否真正到达服务器并返回?
    3. 当您提醒/检查 responseText 时,您是否看到任何不属于的内容?
    4. 您的 XML 格式是否正确?通过验证器运行它。

    祝你好运!干杯。

    【讨论】:

      【解决方案2】:

      您可能想查看XML for <Script>。我看到一些帖子表明他们已经用它解决了 Safari 上的问题。

      【讨论】:

      • 感谢您的快速回复!该库适用于我需要的浏览器。但是我必须重写所有代码才能使用该库。理想情况下,我只想更新我的加载 xml 函数以在 Safari 中工作,但如果有加载 xml 函数,我可以从也可以工作的库中导入。
      • 我遇到了同样的问题。除了使用第三方库还有什么其他想法吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      • 2011-09-28
      • 2014-07-12
      • 2021-06-11
      • 2018-12-21
      • 2011-10-08
      • 1970-01-01
      相关资源
      最近更新 更多