2013-10-17 124 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; 
};