2017-04-25 90 views
0

我发现只有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可以找到带有名称空间前缀的直接子项,但是当它涉及泛型下降时,则无法找到它?有没有可接受的解决方法?

+0

FWIW如果'xs'是唯一的名称空间,则无需在'find'中指定它。 – wOxxOm

+0

但是根据这个例子你可以看到''是在默认的命名空间中,而不是'xs'。如果您在JSFiddle中删除选择器的“xs:\\”,您将看不到任何内容。 – JonBrave

回答

相关问题