2017-04-25 2 views
0

Chrome에서만 jQuery find(selector) ($.parseXML())을 사용하여 예상 한 결과를 얻지 못하고 있습니다. IE 11 또는 Firefox이 실행XML 결과에 대한 Chrome의 jQuery 찾기()가 잘못되었습니다.

<!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> 

내가 기대되는 네 개의 쿼리의 각각에 대해 1 요소 일치를보고

훨씬 단순화 코드 (https://jsfiddle.net/a504caa0/) 다음과 같은 고려하십시오.

그러나 Chrome (57.0.2987.133) 쿼리 1 & 3 반환 요소 1 개를 반환하지만 쿼리 2 & 4 반환 요소 0 개를 반환합니다.

$xml.find('selector') 

일치하는 항목을 찾지 못하는 동안
$xml.find('> selector') 

이 일치하는 항목을 찾는이는 것을 의미한다. 다시 말해, 직접적인 자식에 대해 질의를하면 요소를 찾는다. 그러나 어떤 자손에 대해서도 질의가 있으면 그것이 없다는 것을 말한다.

이것이 XML 전용 문제인지 여부 또는 xs\\: 네임 스페이스 사용의 필요성이 문제가되는지 여부는 알 수 없습니다.

실생활에서 XML은 더 커지고 깊어졌습니다. 직접적인 어린이뿐만 아니라 모든 자손을 쿼리해야 할 때가 있습니다. 해결책은 위의 검색어를 변경하여 (예 : 복수 find()을 하나로 합치거나 children()을 사용하여) 작동해야하며, find()의 크롬 동작을 일반적으로 >없이 작동/설명해야합니다.

편집 : 난 그냥 find()에서 모든 XML에서 xs:xs\\:을 제거했는데, 과연 지금 크롬에서 한 요소를 반환합니다. 그래서 이것은 find() 문제의 XML 네임 스페이스 인 것 같습니다. 물론, 나는 실생활에서 그것을 할 수 없다. Chrome이 네임 스페이스 접두어가있는 직접적인 자식을 찾을 수는 있지만 일반적인 강하가 관련된 경우는 찾을 수없는 것 같습니다. 허용 가능한 해결 방법이 있습니까?

+0

FWIW 'xs'가 유일한 네임 스페이스 인 경우 'find'에 지정할 필요가 없습니다. – wOxxOm

+0

그러나 예제에 따르면''이'xs '가 아닌 기본 네임 스페이스에 있음을 알 수 있습니다. JSFiddle에서 선택자의'xs : \\\'를 제거하면 아무 것도 발견되지 않습니다. – JonBrave

답변