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.

Другие вопросы по тегам