我必须从头开始写.getElementByClassName。这是我到目前为止的代码。

var getElementsByClassName = function(className){
  let result = [];
  let bod = document.body;

  for (let prop in bod) {
    if (bod[prop].classList && bod[prop].classList.contains(className)) {
      result.push(bod[prop]);
    }
    let child = bod[prop].childNodes;
    for(let elem in child) {
      if (child[elem].classList.contains(className)) {
        result.push(child[elem]);
      }
    }
  }
  return result;
};


我无法访问document.body。我的语法错误还是for循环不是解决之道?

最佳答案

prop in bod甚至会返回其方法/属性,并且它们没有classList,只有Node具有。

因此,您需要的是它的子节点,也称为document.body.childNodes。就像是:

for (let i = 0; i<bod.childNodes.length; i++) {
  let thisNode = bod.childNodes[i];
  if (thisNode.classList) {
    // check if it has your class
  }
  if (thisNode.childNodes.length) {
    // go deeper in the node, recursively
  }
}


一个循环是不够的,并且您不知道需要多少个循环,因为每个节点可以具有任意数量的子节点,因此您需要进行递归。

09-11 06:50