1

正如标题所述,我尝试将 getElementByClassName 重写为个人练习,但在递归返回结果时遇到了一些意外行为。

Document.prototype.getElementsByClassNameExercise = function(className, tempElement){
  var currentElement = (tempElement || document),
    children = currentElement.childNodes,
    results = [],
    classes = [];

  // Loop through children of said element
  for(var i =0;i<children.length;i++){    
    if(children[i].className && children[i].className !== '') {
      classes = children[i].className.split(' ');

      // Important to note, forEach is not ie8 safe.
      classes.forEach(function(singleClass){
        if(singleClass === className) {
          results.push(children[i]);
        }
      });
    }
    results.concat(Document.prototype.getElementsByClassNameExercise.call(this,     className, children[i]));
  }

  return results;
}

我在我的主页上尝试过这个,它似乎成功地解析了所有 DOM 元素并找到了 className...但是 return/results.concat(results) 步骤似乎失败了。:/

任何接受者都可以看到我缺少什么?:)

4

1 回答 1

0

你的问题

你并没有错过太多。

concat()返回一个新数组,如其MDN文章中所述:

概括

返回一个由该数组与其他数组和/或值连接的新数组。

描述

[...] concat 不会改变这个或任何作为参数提供的数组,而是返回一个浅拷贝,其中包含从原始数组组合的相同元素的拷贝。

如有疑问,如果 MDN 不够,您也可以随时参考ECMA-262 规范,第 15.4.4.4 节:

当使用零个或多个参数 item1、item2 等调用 concat 方法时,它会返回一个数组,其中包含对象的数组元素,后跟每个参数的数组元素。

解决方案

您需要重新分配结果变量。

更改此行:

results.concat(Document.prototype.getElementsByClassNameExercise.call(this,     className, children[i]));

至:

results = results.concat(Document.prototype.getElementsByClassNameExercise.call(this,     className, children[i]));
于 2013-09-05T06:42:06.953 回答