如何遍历类型为ORDERED_NODE_SNAPSHOT_TYPE

时间:2018-04-19 22:36:44

标签: javascript xpath

我需要使用javascript获取XPathResult并遍历它,克隆结果的每个节点。最初,我尝试了以下结果,结果为ORDERED_NODE_ITERATOR_TYPE:

childNodesXPath = '//div[@id="'+subcat_id+'" and @parentid="'+subcat_parent_id+'"]';    
subcat_child_nodes = document.evaluate(childNodesXPath, document, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
while (next_child_node = subcat_child_nodes.iterateNext()) {
    new_child_node = next_child_node.cloneNode(true);
    new_child_node.setAttribute('parentid', target_id);
    new_child_node.setAttribute('grandparentid', target_parentid);
    new_length = new_subcat_child_nodes.push(new_child_node);
}

当然我发现迭代器一旦克隆了第一个节点就变成了无效因为DOM发生了变化,所以我尝试了这个结果为ORDERED_NODE_SNAPSHOT_TYPE:

childNodesXPath = '//div[@id="'+subcat_id+'" and @parentid="'+subcat_parent_id+'"]';
subcat_child_nodes = document.evaluate(childNodesXPath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
for (i=0; i<subcat_child_nodes.length; i++) {
    new_child_node = subcat_child_nodes[i].cloneNode(true);
    new_child_node.setAttribute('parentid', target_id);
    new_child_node.setAttribute('grandparentid', target_parentid);
    new_length = new_subcat_child_nodes.push(new_child_node);
}

这不起作用,因为XPathResult对象没有length属性。我也尝试了subcat_child_nodes.forEach(),但是没有工作,也没有迭代到Next()。

如何以允许我克隆每个节点的方式迭代ORDERED_NODE_SNAPSHOT_TYPE类型的XPathResult?如果那是不可能的,有没有办法克隆整个XPathResult是一个节点列表?

1 个答案:

答案 0 :(得分:0)

所以,以防万一其他人正在寻找上述问题的答案,Jaromanda在评论中的答案向我指出了参考资源,这就是我最终使用的内容。

subcat_child_nodes = document.evaluate(childNodesXPath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
for (i=0; i<subcat_child_nodes.snapshotLength; i++) {
    new_child_node = subcat_child_nodes.snapshotItem(i).cloneNode(true);
    new_child_node.setAttribute('parentid', target_id);
    new_child_node.setAttribute('grandparentid', target_parentid);
    new_length = new_subcat_child_nodes.push(new_child_node);
}