그래서 테스트해봤습니다:
var stringToDom= function(text ) {
var doc;
if(window.ActiveXObject) {
doc = new ActiveXObject("MSXML2.DOMDocument")
doc.loadXML(text).documentElement; >} else {
doc = (new DOMParser()).parseFromString(text,"text/xml")
}
return doc
}
var xmlDoc=stringToDom("
ab"),
c,
d1=new Date();
for(var i=0;i<100000;i ){
c=xmlDoc.getElementsByTagName("a");
}
document.write(" getElementsByTagName: " ,new Date()-d1);
d1=new Date();
try{
for(var i=0;i<100000;i ){
c=xmlDoc .selectNodes( "a");
}
document.write("
selectNodes: ",new Date()-d1)
}catch(ex){document.write ("< ;br/>error:" ex)}
IE에서 노드를 선택하는 것이 훨씬 빠릅니다.
FF에서도 가능하지만 그런 방법은 없습니다. 검색하여 XPathEvaluator를 사용하여 방법을 찾았습니다. 구현하려면 다음이 구체적인 구현이지만 효율성은 이상적이지 않습니다.
if (!window.ActiveXObject) {
(function(){
var oEvaluator=new XPathEvaluator(),oResult;
XMLDocument.prototype.selectNodes = function(sXPath) {
oResult = oEvaluator.evaluate(sXPath, this, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null)
var aNodes = []
if (oResult != null) {
var oElement = oResult.iterateNext() ;
while (oElement) {
aNodes[aNodes.length]=oElement;
oElement = oResult.iterateNext();
}
return aNodes;
}
})()
}
evaluate(xpathExpression, contextNode, 네임스페이스Resolver, resultType, result); XPath 표현식 및 기타 지정된 매개변수를 기반으로 XPathExpression은 평가할 XPath를 나타내는 문자열입니다.
contextNode는 쿼리에 대한 컨텍스트 노드를 지정합니다([http://www.w3. org/TR/xpath XPath 사양) 문서를 컨텍스트 노드로 전달하는 것이 일반적입니다.
namespaceResolver는 모든 네임스페이스 접두사를 전달하고 해당 접두사와 연결된 네임스페이스 URI를 나타내는 문자열을 반환해야 합니다. 문서와 일치할 수 있도록 XPath 자체 내에서 접두사를 확인하는 데 사용됩니다. HTML 문서에 일반적이거나 네임스페이스 접두사가 사용되지 않는 경우
resultType은 반환할 결과 XPathResult 유형에 해당하는 정수입니다. 0에서 9까지의 정수에 해당하는 XPathResult 생성자의 XPathResult.ANY_TYPE과 같은 명명된 상수 속성을 사용합니다.
result는 결과에 사용할 기존 XPathResult이며 가장 일반적이며 새 항목을 생성합니다. XPathResult
전체 테스트 페이지:
코드 복사