如何在 JavaScript 中仅删除父元素而不删除其子元素?

IT技术 javascript dom
2021-01-30 14:18:03

让我们说:

<div>
  pre text
  <div class="remove-just-this">
    <p>child foo</p>
    <p>child bar</p>
    nested text
  </div>
  post text
</div>

对此:

<div>
  pre text
  <p>child foo</p>
  <p>child bar</p>
  nested text
  post text
</div>

我一直在想办法使用 Mootools、jQuery 甚至(原始)JavaScript,但不知道如何做到这一点。

6个回答

使用jQuery,您可以执行以下操作:

var cnt = $(".remove-just-this").contents();
$(".remove-just-this").replaceWith(cnt);

文档的快速链接:

  • 内容( ) : jQuery
  • 替换内容:[字符串|元素| jQuery ]):jQuery
希望我3 小时前意识到(错误..发现)这个......简单而优雅 - 太棒了!
2021-03-21 14:18:03
我不知道为什么,但这在使用 contents() 时对我不起作用。然而,当我使用 html() 代替 contents() 时,它的作用就像一个魅力!
2021-03-22 14:18:03
仅 1 行版本: $('.remove-just-this').replaceWith(function() { return $(this).html(); });
2021-03-29 14:18:03
“cnt”的意义是什么?
2021-04-05 14:18:03
'cnt' 只是一个包含“内容”的变量名
2021-04-11 14:18:03

与库无关的方法是在删除元素之前插入要删除的元素的所有子节点(这隐式地将它们从它们的旧位置删除),然后再删除它:

while (nodeToBeRemoved.firstChild)
{
    nodeToBeRemoved.parentNode.insertBefore(nodeToBeRemoved.firstChild,
                                            nodeToBeRemoved);
}

nodeToBeRemoved.parentNode.removeChild(nodeToBeRemoved);

这将以正确的顺序将所有子节点移动到正确的位置。

现代 JS 支持: node.replaceWith(...node.childNodes);
2021-04-01 14:18:03

您应该确保使用 DOM 执行此操作,而不是innerHTML(如果使用 jk 提供的 jQuery 解决方案,请确保它移动 DOM 节点而不是innerHTML在内部使用),以保留事件处理程序之类的内容。

我的答案很像 insin 的,但对于大型结构会表现得更好(单独附加每个节点可能会对必须重新应用 CSS 的重绘造成负担appendChild;使用 a DocumentFragment,这只会发生一次,因为它在其之后才可见子项都被附加并添加到文档中)。

var fragment = document.createDocumentFragment();
while(element.firstChild) {
    fragment.appendChild(element.firstChild);
}
element.parentNode.replaceChild(fragment, element);
谢谢; 简短而直接。
2021-03-31 14:18:03
 $('.remove-just-this > *').unwrap()

更优雅的方式是

$('.remove-just-this').contents().unwrap();
最佳答案。谢谢。
2021-03-20 14:18:03