使用Recursion实现getElementsByClassName

时间:2015-03-12 15:33:27

标签: javascript dom recursion

我在getElementsByClassName中创建了一个函数,用于测试当前节点以检查它是否与className匹配,然后递归测试当前节点的childNodes。

对我而言,这在逻辑上是有道理的,但我不确定为什么结果不会产生与getElementsByClassName相同的结果。我尝试实现一个for循环来检查当前级别中的每个节点,但这似乎也不起作用。我需要在第一个if语句中调整什么才能使此代码正常工作?

function getElementsByClassName (className) {
  var nodeList = [];
  function test(node) {
      if (node.classList === className) {
        nodeList.push(node.classList[count]);
      }
    for (var index = 0; index < node.childNodes.length; index++) {
      test(node.childNodes[index]);
    }
  }
  test(document.body)
  return nodeList;
};

3 个答案:

答案 0 :(得分:2)

检查className时你做的很小。

if (node.classList && node.classList.contains(className)) {
    nodeList.push(node);
}

http://jsfiddle.net/us5xjv66/8/

答案 1 :(得分:1)

使用underscore.js的工作解决方案:

function getElementsByClassName(className) {
  var nodeList = [];
  function test(node) {
    if (_(node.classList).contains(className)) {
      nodeList.push(node);
    }
    _(node.childNodes).forEach(function(child) {
      test(child);
    });
  }
  test(document.body);
  return nodeList;
}

答案 2 :(得分:0)

我认为这是你想要实现的目标:

  if (node.className  === className) { // if classname matches, add node to list
    nodeList.push(node);
  }

或者更好的是,处理多个类名:

  if(node.classList){
      if (node.classList.contains(className)) {
        nodeList.push(node);
      }
  }