尝试递归地手动编码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;
};
答案 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可以帮助您解决真正的问题。请阅读这里认为合适的问题的常见问题解答。