我發現只有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