2013-10-17 70 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

需要遞歸如果元素是和孩子有個元素:

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

你跳過第一個孩子.... – epascarello

+0

是的,你的權利,編輯,謝謝:) – Stefan

+0

你編輯後工作正常。謝謝! – Ja5onHoffman

0

你有沒有遞歸,應該有功能getNodes的內部getNodes()通話。沒有遞歸,它不能更深入到樹中。

需要撥打getNodes(child, classname);

+0

之後child = child.nextElementSibling? – Ja5onHoffman

+0

如果你這樣做,你會跳過每一組中的第一個孩子。需要去之前。 – epascarello

0

一個更簡單的方法將只是採取的所有元素,並篩選出哪些具有類名。不需要遞歸,只需一個循環。

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; 
};