JQuery не будет анализировать xml с узлами, называемыми опцией
Я использую 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>");
Нет ошибки, только ничего не предупреждается, как будто поиск ничего не находит. Это только для узлов, называемых опцией, все, что я тестировал, работает нормально!
Я использую текущую версию jQuery - 1.4.2.
Любая идея?
ТИА.
Б.Г.
Ответы
Ответ 1
Обновление
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>
Ответ 2
Это, вероятно, некоторая специальная обработка для элемента HTML <option>
, но я не могу найти это в источнике.
Ответ 3
В строке 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.
Возможно, просто используйте другое имя node?