2017-04-25 59 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

回答

相關問題