Получение HTMLUnknownElement с помощью jQuery.find () и XML-документа - PullRequest
2 голосов
/ 09 марта 2009

Я пытаюсь загрузить XML-документ (в частности, RSS-канал) с помощью Ajax-запроса, проанализировать его и вставить некоторую информацию, основанную на указанном фиде, на мою страницу. Код прекрасно работает в 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 ]

1 голос
/ 09 марта 2009

Мне удалось это исправить, но для того, чтобы это работало, потребовалось немного кода, специфичного для 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 голос
/ 03 апреля 2010

ЭТО РАБОТАЕТ ДЛЯ МЕНЯ, ИСПОЛЬЗУЯ 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());
     });
});
0 голосов
/ 09 марта 2009

EDIT

После вашего комментария я посмотрел немного ближе к вашему коду. 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));
    }

});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...