4

我正在尝试使用 javascript 从 dom 树中删除一个节点,同时保留它的子节点。我测试了下面显示的 3 种方法,它们在 Firefox 中运行良好,但在 IE 8 中却不行(参见下面的示例)。

function removeNodeKeepChildren(node){
    // approach 1
    jQuery(node.parentNode).children().map(function (index) {
        jQuery(this).replaceWith(jQuery(this).contents());
    });

    // approach 2
    // doesn't work with content() either
    jQuery(node.parentNode).html(jQuery(node).html());

    // approach 3
    var childfragment = document.createDocumentFragment();
    for(var i=0; i<node.childNodes.length;i++){
            childfragment.appendChild((node.childNodes[i]).cloneNode());
    }
    node.parentNode.replaceChild(childfragment,node);
}

示例输入节点:

<span class="A1">
    start text
    <span class="F">
        bold text
    </span>
    end text
</span>

它应该导致什么:

    start text
    <span class="F">
        bold text
    </span>
    end text

IE 8 做了什么:

    start text
    <span class="F">
    </span>
    end text

如您所见,IE 忽略/删除嵌套的子级。

我会很感激任何帮助:)

4

4 回答 4

3

Next is most simplest and fastest native javascript code:

function removeNodeKeepChildren(node) {
  if (!node.parentElement) return;
  while(node.firstChild)
  {
    node.parentElement.insertBefore(node.firstChild, node);
  }
  node.parentElement.removeChild(node);
}

http://jsfiddle.net/N3J7K/

于 2012-09-24T09:20:19.150 回答
3

这样做应该很容易:

function removeKeepChildren(node) {
    var $node = $(node);
    $node.contents().each(function() {
        $(this).insertBefore($node);
    });
    $node.remove();
}

看到它在行动

于 2012-09-24T08:53:11.327 回答
3

使用unwrap(),这就是它的用途。

<span class="A1">
    start text
    <span class="F">
        bold text
    </span>
    end text
</span>
<script>
  jQuery(function($){$('.F').unwrap();});
</script>
于 2012-09-24T09:00:28.887 回答
2

@Jon 的方法,没有迭代:

function removeKeepChildren(node) {
    var $node = $(node);
    var contents = $node.contents();
    $node.replaceWith(contents);
}

在行动中看到它。


@Dr.Molle 的答案应该是公认的。

于 2012-09-24T08:56:16.960 回答