Chrome неверный jQuery find() в результате XML
Я обнаружил, что только Chrome не дает мне ожидаемого результата при использовании jQuery find(selector)
на XML (от $.parseXML()
).
Рассмотрим следующий значительно упрощенный код ( https://jsfiddle.net/a504caa0/):
<!DOCTYPE html>
<html>
<head>
<script src="https://code.jquery.com/jquery-3.2.1.js"></script>
</head>
<body>
<script>
$(function ()
{
var xml =
'<?xml version="1.0"?>' +
'<DataSet>' +
' <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">' +
' <xs:element>' +
' </xs:element>' +
' </xs:schema>' +
'</DataSet>'
;
var xmlDoc = $.parseXML(xml)
var $docElm = $(xmlDoc.documentElement);
alert("> find('xs\\:schema').length=" + $docElm.find('> xs\\:schema').length);
alert("find('xs\\:schema').length=" + $docElm.find('xs\\:schema').length);
alert("> find('xs\\:schema').find('> xs\\:element').length=" + $docElm.find('> xs\\:schema').find('> xs\\:element').length);
alert("> find('xs\\:schema').find('xs\\:element').length=" + $docElm.find('> xs\\:schema').find('xs\\:element').length);
});
</script>
</body>
</html>
Запуск этого в IE 11 или Firefox сообщает об одномэлементном совпадении для каждого из четырех запросов, чего я и ожидаю.
Однако в Chrome (57.0.2987.133) запросы 1 и 3 возвращают 1 элемент, а запросы 2 и 4 возвращают 0 элементов. Это означает, что:
$xml.find('> selector')
находит совпадение, а
$xml.find('selector')
не находит совпадений. Другими словами, при запросе прямого потомка он находит элемент, но при запросе у любого потомка он говорит, что его там нет!
Я не знаю, является ли это проблемой, связанной только с XML, или необходимость использования xs\\:
Пространство имен является проблемой.
В реальной жизни XML больше и глубже, и бывают случаи, когда мне нужно запрашивать любого потомка, а не только прямых детей. Решение должно работать не только путем изменения вышеуказанных запросов (например, конгломерата нескольких find()
с одним или используя children()
), он должен работать / объяснять поведение Chrome в общем find()
без ведущего >
,
РЕДАКТИРОВАТЬ: я просто попытался удалить все xs:
из XML и xs\\:
от find()
и, конечно же, теперь он возвращает 1 элемент в Chrome. Итак, похоже, что это пространство имен XML в find()
вопрос. Конечно, я не могу сделать это в реальной жизни. Кажется, что Chrome может найти прямых потомков с префиксом пространства имен, но не тогда, когда он включает в себя общий спуск? Есть ли приемлемый обходной путь?
1 ответ
Я сообщил об этой ошибке для хрома на https://bugs.chromium.org/p/chromium/issues/detail?id=738372.
Согласно ответу https://bugs.chromium.org/p/chromium/issues/detail?id=738372, эта ошибка была исправлена в Chrome #60. Теперь Chrome корректно ищет XML с использованием пространств имен, предоставляя те же результаты, что и Firefox/IE 11.