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.
相同的结果
我发现 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.
相同的结果