我是否需要打开HTMLCollection或Nodelist来创建节点数组?

时间:2019-12-05 12:19:32

标签: javascript html css

又是一个菜鸟家伙。我从正在阅读的书(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;
}

2 个答案:

答案 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;
}