Chrome XML 结果上的 jQuery find() 不正确

Chrome incorrect jQuery find() on XML result

我发现 Chrome 没有给我预期的结果,我在 XML 上使用 jQuery find(selector)(来自 $.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 中报告四个查询中的每一个的 1 元素匹配,这是我所期望的。

然而,在 Chrome (57.0.2987.133) 中查询 1 & 3 return 1 个元素,但查询 2 & 4 return 0 个元素。这意味着:

$xml.find('> selector')

正在寻找匹配项,而

$xml.find('selector')

找不到匹配项。换句话说,如果查询直接 child 它找到一个元素,但如果查询任何后代它说它不存在!

我不知道这是 XML-only 的问题,还是需要使用 xs\: 命名空间的问题。

在现实生活中XML更大更深,有时我需要查询任何后代,而不仅仅是直接children。解决方案不能仅仅通过改变上述查询来工作(例如将多个 find() 合并为一个或使用 children()),它必须 work/explain Chrome 行为通常在 find() 没有前导 >.

编辑:我刚刚尝试从 XML 中删除所有 xs: 并从 find() 中删除所有 xs\:,当然现在够了 returns Chrome 下的 1 个元素。所以,看起来这是一个 XML-namespace in find() 的问题。当然,我不能在现实生活中那样做。似乎 Chrome 可以找到带有名称空间前缀的直接 children 但当它涉及通用血统时却找不到?是否有可接受的解决方法?

我在 https://bugs.chromium.org/p/chromium/issues/detail?id=738372 报告了铬的这个错误。

根据那里的回复 https://bugs.chromium.org/p/chromium/issues/detail?id=738372#c10,此错误已在 Chrome #60 中修复。 Chrome 现在可以使用命名空间正确搜索 XML,提供与 Firefox/IE 11.

相同的结果