我发现只有Chrome浏览器没有给出我期望在XML上使用jQuery find(selector)
的结果(来自$.parseXML()
)。Chrome浏览器不正确的jQuery find()XML结果
考虑以下大大简化代码(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返回1个元素但查询2 & 4返回0个元素。这意味着:
$xml.find('> selector')
是找到一个匹配,而
$xml.find('selector')
没有找到匹配。换句话说,如果查询一个直接的孩子,它会发现一个元素,但如果查询任何后代,它说它不在那里!
我不知道这是否是仅限于XML的问题,或者是否需要使用xs\\:
命名空间是一个问题。
在现实生活中,XML越来越深,有时我需要查询任何后代,而不仅仅是直接的孩子。该解决方案不能通过改变上述查询来工作(例如,将多个find()
合并为一个或使用children()
),它必须在find()
上一般地工作/解释Chrome行为,而没有领先的>
。
编辑:我只是想从find()
去除的XML所有xs:
和xs\\:
,果然,现在的Chrome下返回1元。所以,看起来这是一个在find()
问题中的XML命名空间。当然,我不能在现实生活中这样做。看起来Chrome可以找到带有名称空间前缀的直接子项,但是当它涉及泛型下降时,则无法找到它?有没有可接受的解决方法?
FWIW如果'xs'是唯一的名称空间,则无需在'find'中指定它。 – wOxxOm
但是根据这个例子你可以看到''是在默认的命名空间中,而不是'xs'。如果您在JSFiddle中删除选择器的“xs:\\”,您将看不到任何内容。 –
JonBrave