微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – TypeError:值undefined(表达式xmlDoc.load的结果)不是对象

我正在尝试使用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:Value undefined(表达式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
        ...
    }       
}

如果您仍然遇到问题,可以检查一些可能解决问题的方法.

>您是否将内容类型设置为text / xml?
>您的请求实际上是否已发送到服务器并返回?
>当您提醒/检查responseText时,您是否看到任何不属于的内容
>您的XML格式正确吗?通过验证器运行它.

祝你好运!干杯.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐