2013-10-17 3 views
1

저는 getElementsByClassName()과 비슷한 작업을 수행하는 간단한 함수를 만들었습니다. DOM의 모든 노드를 통과하여 일치하는 클래스가있는 노드를 배열로 푸시해야합니다. 그러나 Crockford의 walk_the_DOM 메서드와 비슷한 것을 사용하려고 시도했지만, 내 작업이 작동하지 않습니다. 이 함수는 첫 번째 DOM 수준에서 노드를 검색하지만 더 깊게 가지 않습니다. 누군가가 나에게 무슨 문제가 있는지에 대한 힌트를 줄 수 있을까요? 여기 코드는 다음과 같습니다DOM 걷기 기능이 작동하지 않습니다.

var getNodesWithClassname = function(classname) { 
    var a = document.body; 
    var ar = []; 
    var getNodes = function(obj, classname) { 
    if (obj.hasChildNodes()) { 
     var child = obj.firstElementChild; 
     while (child) { 
     if (child.className === classname) { 
      ar.push(child) 
     } 
     child = child.nextElementSibling; 
     } 
    } 
    } 
    getNodes(a, classname); 
    return ar; 
}; 
+0

어떻게 *이 작동하지 않습니다 *? – Joseph

+0

어디에서나 재귀가 발생하지 않으므로 코드가 한 수준 만 이동하는 큰 부분을 차지합니다. – Brian

답변

1

당신은 재귀가 필요합니다. 재귀는 필요 없으며 단지 한 번만 실행됩니다.

http://jsfiddle.net/3weJc/

var getNodesWithClassname = function (classname) { 
    var nodes = document.getElementsByTagName("*"); 
    var nodesLength = nodes.length; 
    var results = []; 

    for(var i = 0; i < nodesLength; ++i){ 
     if(nodes[i].className === classname) results.push(nodes[i]); 
    } 

    return results; 
}; 
+0

첫 아이를 건너 뜁니다 .... – epascarello

+0

옙, ur right, edited, thanks :) – Stefan

+0

편집 후에 잘 작동했습니다. 감사! – Ja5onHoffman

0

당신은 더 재귀가 없다는 기능 getNodes의 내부 getNodes()에 대한 호출이 있어야합니다. 재귀가 없으면 트리 안으로 더 깊숙이 들어갈 수 없습니다.

getNodes(child, classname); 전화가 필요합니다.

var getNodesWithClassname = function(classname) { 
    var a = document.body; 
    var ar = []; 
    var getNodes = function(obj, classname) { 
    if (obj.hasChildNodes()) { 
     var child = obj.firstElementChild; 
     while (child) { 
     if (child.className === classname) { 
      ar.push(child) 
     } 
     if (child.nodeType === 1 && child.childElementCount > 0) { 
      getNodes(child, classname); 
     } 
     child = child.nextElementSibling; 
     } 
    } 
    } 
    getNodes(a, classname); 
    return ar; 
}; 
+0

child = child.nextElementSibling 이후? – Ja5onHoffman

+0

그렇게했다면, 모든 세트에서 첫 아이를 건너 뛸 것입니다. 전에 갈 필요가있어. – epascarello

0

훨씬 더 간단한 방법은 단지 모든 요소를 ​​가지고 사람이 클래스 이름을 가지고있는 필터링하는 것입니다 : 요소가 아이 요소 인 경우