1

我创建了一个简单的函数来执行类似于 getElementsByClassName() 的任务。它应该遍历 DOM 中的每个节点并将具有匹配类的节点推送到数组中。我尝试使用类似于 Crockford 的 walk_the_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;
};
4

3 回答 3

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;
};
于 2013-10-17T14:18:21.230 回答
0

您没有递归,应该调用getNodes()函数内部getNodes。没有递归,它就无法深入到树中。

需要有一个getNodes(child, classname);电话。

于 2013-10-17T14:13:00.753 回答
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;
};
于 2013-10-17T14:19:43.683 回答