使用jQuery.find()和XML文档获取HTMLUnknownElement

时间:2009-03-09 01:32:16

标签: jquery xml ajax internet-explorer

我正在尝试通过Ajax请求加载XML文档(特别是RSS提要),解析它,并根据所述提要将一些信息插入到我的页面中。该代码在Firefox,Opera,Chrome和Safari中运行良好,但不适用于IE7。去图。

在做了一些初步调试之后,我发现通过请求检索了XML字符串 ,并且当我尝试从文档中解析节点时,我得到的特定节点类型是的 HTMLUnknownElement

以下是相关代码:

$.get('feed.php', function(oXmlDoc) {

    var titles = $(oXmlDoc).find('title');
    var dates = $(oXmlDoc).find('pubDate');

    for(var i = 0; i < 5; i++) {
        parseNodes(titles[i].firstChild.nodeValue, dates[i].firstChild.nodeValue));
    }

});

parseNodes函数实际上从未被命中,因为IE无法访问firstChild,因此无法访问nodeValue

提前感谢有关如何解决此问题的任何想法和/或建议。

3 个答案:

答案 0 :(得分:1)

我能够解决这个问题,但它需要一些IE特定的代码才能解决它的问题。基本上,这就是我最终必须解决问题的方法。

首先,我验证了我的服务器端代码返回了正确的内容类型:

header('Content-Type: application/rss+xml');

之后,我检查了当前正在访问该页面的浏览器:

if($.browser.msie) {
    // ie-specific code (see below)
} else {
    // code as posted in the question
}

为了更好地控制ajax请求,我选择使用jQuery的$.ajax函数而不是$.get函数。

var oXmlDoc = new ActiveXObject("Microsoft.XMLDOM");
$.ajax({
    url: "feed.php",
    processData: false,
    data: oXmlDoc,
    success: function(sXml) {
        oXmlDoc.loadXML(sXml) 
        var titles = $('title', oXmlDoc);
        var dates = $('date', oXmlDoc);
        for(var i = 0; i < 5; i++) {
            parseNodes(titles[i].childNodes[0].nodeValue, dates[i].childNodes[0].nodeValue));
        }
     }
});

无论如何,它并不像我想的那样优雅,但它完成了工作。

答案 1 :(得分:1)

这是我使用GET工作

$.get("url.php", { mode: "r"},
    function(data){
     //FIX FOR UNKNOWNHTML OBJECT RETURNED IN IE
     if(navigator.appName.indexOf("Microsoft")>=0) {
        var xData = new ActiveXObject("Microsoft.XMLDOM");
        xData.loadXML(data);
     } else {
        var xData = $(data)
     }
     $(xData).find("room").each(function() {
            alert($(this).find("name:first").text());
     });
});

答案 2 :(得分:0)

修改

在您发表评论后,我看了一下您的代码。与selectors不同,Find返回一个jQuery对象,但是你需要实际的DOM对象。尝试使用get()从jQuery中检索元素数组。您可能还需要使用childNodes []。

$.get('feed.php', function(oXmlDoc) {

    var titles = $(oXmlDoc).find('title').get();
    var dates = $(oXmlDoc).find('pubDate').get();

    for(var i = 0; i < 5; i++) {
        parseNodes(titles[i].childNodes[0].nodeValue,
                   dates[i].childNodes[0].nodeValue));
    }

});