javascript - 如何递归删除多个子节点而不弄乱索引?

标签 javascript dom

JSFiddle 网址:http://jsfiddle.net/sFe45/

代码:

<html>
    <head>
        <title>Foo</title>
        <script type="text/javascript">

var target;
var anchor;

function removeTags(node){
    for (var i = 0; i < node.childNodes.length; i++) {
        var childNode = node.childNodes[i];
        if (childNode.nodeType == 1) {
            node.removeChild(childNode);
            continue;
        } 
        removeTags(childNode);
    }
}

window.onload = function() {
    target = document.getElementById('target');
    anchor = document.getElementById('anchor');
    anchor.onclick = function() {
        removeTags(target);
    }
}

        </script>
    </head>
    <body>
        <div id="target">
            <p>
                <a href="#" id="anchor">Remove tags</a>
            </p>

            Text

            <p>Para 1</p>
            <p>Para 2</p>
            <p>Para 3</p>
            <p>Para 4</p>
            <p>Para 5</p>
            <p>Para 6</p>
            <p>Para 7</p>
            <p>Para 8</p>
            <p>Para 9</p>
            <p>Para 10</p>
            Text
        </div>
</html>

​正如您在 JSFiddle URL 中注意到的那样,当您单击“删除标签”链接时,removeTags() 无法删除备用段落元素。原因是当 removeTags 从其父节点中删除子节点时,剩余的子节点在 node.childNodes 数组中向左移动一位。

如何巧妙地解决这个问题?

最佳答案

倒数:

for (var i = node.childNodes.length - 1; i >= 0; i--) {

Updated fiddle

或者,您可以使用 lastChildpreviousSibling :

var prev;
for (var child = node.lastChild; child; child = prev) {
    prev = child.previousSibling;

    if (child.nodeType == 1) {
        node.removeChild(child);
        continue;
    } 

    removeTags(child);
}

Updated fiddle

分别:

...the remaining child nodes shift one place to left in node.childNodes array...

NodeList s 不是数组。

关于javascript - 如何递归删除多个子节点而不弄乱索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9847377/

相关文章:

javascript - 延迟升级到 HTTPS (TLS/SSL)

Javascript "input"事件值未定义

javascript - DOM元素的CSS默认样式

javascript - 使用 Rangy 的 iOS 风格格式化标注

javascript - 配置 Create.js(所见即所得编辑器)

javascript - 如何使用除不闪烁加载以外的任何方法重新加载 iframe

jquery - 使用 jQuery 选择器选择没有 ID 或类的文本

javascript - 将 html 附加到 jQuery 元素而不在 html 中运行脚本

javascript - 获取一个数组,其中包含数组内对象的所有键

javascript - 带有图像的自定义文本区域