递归地实现getElementsByClassName

时间:2015-10-21 16:42:43

标签: javascript dom recursion

尝试递归地手动编码getElementsByClassName

虽然代码在我的控制台中有效,但我没有在mocha中传递我的测试用例。假设测试用例写得正确,我可以做些什么来使我的代码更好(阅读:更正确)?

var getElementsByClassName = function(className){
  var docBody = document.body;
  var classes = [];
  var walk = function (node, func) {
    func(node);
    node = node.firstChild;
    while (node) {
      walk(node, func);
      node = node.sibling;
    }
  }
  walk(docBody, function() { 
    if (docBody.classList.contains(className)) {
      classes.push(docBody)
    }
  });
  return classes;
};

2 个答案:

答案 0 :(得分:4)

如上所述,有两个问题:node.sibling应为node.nextSibling,您需要查看传递给node的{​​{1}},而不是walk() }。

此外,您遇到的某些节点(例如文本节点)不会 docBody,所以说明了这一点:



classList




答案 1 :(得分:1)

首先,objects implementing the Element interface have a nextSibling (and a previousSibling) property, not a sibling property,因此while循环始终在.firstChild之后停止,因为属性访问权限值为false值。

下次请debug first

另外,我建议基于document.getElementsByTagName("*")的返回值来实现它,而不是已经更有效地执行递归遍历(因为它使用本机DOM代码)。

你的问题听起来像是家庭作业。 StackOverflow可以帮助您解决真正的问题。请阅读这里认为合适的问题的常见问题解答。