JQuery не будет анализировать XML с узлами с именем option - PullRequest
5 голосов
/ 26 мая 2010

Я использую jQuery для анализа XML, например:

function enumOptions(xml) {
   $(xml).find("animal").each(function(){  
       alert($(this).text());
   });
}

enumOptions("<root><animal>cow</animal><animal>squirrel</animal></root>");

Это прекрасно работает. Однако, если я попытаюсь найти узлы с именем «option», это не сработает:

function enumOptions(xml) {
   $(xml).find("option").each(function(){  
      alert($(this).text());
   });
}

enumOptions("<root><option>cow</option><option>squirrel</option></root>");

Нет ошибки, просто ничего не предупреждают, как будто находка ничего не находит. Он работает только для узлов с именем option, все остальное, что я тестировал, работает нормально!

Я использую текущую версию jQuery - 1.4.2.

Кто-нибудь есть идеи?

ТИА.

BG

Ответы [ 3 ]

9 голосов
/ 26 мая 2010

Обновление

В jQuery этот метод встроен. Вы можете использовать

$.parseXML("..")

для создания XML DOM из строки.

<ч />

jQuery использует HTML DOM, используя innerHTML для анализа документа, который может иметь ненадежные результаты, когда имена тегов сталкиваются с именами в HTML.

Вместо этого вы можете использовать правильный анализатор XML для первого анализа документа, а затем использовать jQuery для запросов. Приведенный ниже метод проанализирует действительный XML-документ кросс-браузерным способом:

// http://www.w3schools.com/dom/dom_parser.asp
function parseXML(text) {
    var doc;

    if(window.DOMParser) {
        var parser = new DOMParser();
        doc = parser.parseFromString(text, "text/xml");
    }
    else if(window.ActiveXObject) {
        doc = new ActiveXObject("Microsoft.XMLDOM");
        doc.async = "false";
        doc.loadXML(text);
    }
    else {
        throw new Error("Cannot parse XML");
    }

    return doc;
}

Как только XML DOM создан, jQuery можно использовать как обычно - http://jsfiddle.net/Rz7Uv/

var text = "<root><option>cow</option><option>squirrel</option></root>";
var xml = parseXML(text);
$(xml).find("option"); // selects <option>cow</option>, <option>squirrel</option>
1 голос
/ 26 мая 2010

На строке 4448 неунифицированного источника для 1.4.2 виновник:

// ( div = a div node )
// ( elem = the xml you've passed to it )

div.innerHTML = wrap[1] + elem + wrap[2]; 

Рассмотрим этот код:

var d = document.createElement('div');
d.innerHTML = "<foo><option>bar</option><b>blah</b></foo>";

alert(d.innerHTML); // <foo>bar<b>blah</b></foo>

// tested on Firefox 3.6

Итак, не спрашивайте меня, почему именно, но похоже, что-то в том, как DOM обрабатывает это, не обязательно ошибка jQuery.

Возможно, просто использовать другое имя узла?

1 голос
/ 26 мая 2010

Это, вероятно, некоторая специальная обработка для элемента HTML <option>, но я не могу найти его в источнике.

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