又是一个菜鸟家伙。我从正在阅读的书(Eloquent JavaScript)中进行此练习。它应该像“ getElementByTagName”一样工作。下面的第一个函数不返回任何内容。第二个不能通过“ while”之后的“ if”语句。
谢谢
function tagSearch (node, name) {
let tagArrays = [];
let childrenNode = node.childNodes;
if(childrenNode.length != 0) {
for(let i = 0; i < childrenNode.length; i++) {
let currentNode = childrenNode[i];
if(currentNode == Node.ELEMENT_NODE && currentNode.nodeName == name.toUpperCase()) {
tagArrays.push(currentNode);
}
let child = tagSearch(currentNode, name )
if(child) {
tagArrays.concat(child);
}
}
}
return tagArrays;
}
function tagSearch (node, name) {
let tagArrays = [];
let currentNode = node.firstElementChild;
while(currentNode != null) {
if(currentNode.tagName == name.toUpperCase()) {
tagArrays.push(currentNode);
}
let descendant = tagSearch(currentNode, name );
if(descendant) {
tagArrays.concat(descendant);
}
let currentNode = currentNode.nextElementSibling;
}
return tagArrays;
}
答案 0 :(得分:1)
您错过了某些状况。在这里,您正在将节点与期望的节点类型进行比较:
currentNode == Node.ELEMENT_NODE
您需要检查节点的类型,而不是节点本身:
currentNode.nodeType == Node.ELEMENT_NODE
此外,此代码没有执行任何操作:
tagArrays.concat(child);
concat()
函数返回新数组,而不是对旧数组进行变异。因此,要将项目添加到tagArrays
中,您应该执行以下操作:
tagArrays = tagArrays.concat(child);
or
tagArrays.push(...child);
or
tagArrays.splice(tagArrays.length - 1, 0, child);
答案 1 :(得分:1)
您当前正在将currentNode
(一个节点)与Node.ELEMENT_NODE
(一个数字)进行比较,该结果将始终为false
。您需要在for循环内的第一个nodeType
语句中将currentNode
属性添加到if
中:
function tagSearch (node, name) {
let tagArrays = [];
let childrenNode = node.childNodes;
if(childrenNode.length != 0) {
for(let i = 0; i < childrenNode.length; i++) {
let currentNode = childrenNode[i];
if(currentNode.nodeType == Node.ELEMENT_NODE && currentNode.nodeName == name.toUpperCase()) {
tagArrays.push(currentNode);
}
let child = tagSearch(currentNode, name )
if(child) {
tagArrays.concat(child);
}
}
}
return tagArrays;
}