如何在不删除子项的情况下删除包装器(父元素)?

lip*_*nco 13 html javascript jquery dom dom-manipulation

我想删除父母而不删除孩子 - 这可能吗?

HTML结构:

<div class="wrapper">
  <img src"">
</div>
<div class="button">Remove wrapper</div>
Run Code Online (Sandbox Code Playgroud)

点击我想要的按钮后:

<img src"">
<div class="button">Remove wrapper</div>
Run Code Online (Sandbox Code Playgroud)

Web*_*ner 25

不使用innerHTML的纯JS解决方案:

function unwrap(wrapper) {
    // place childNodes in document fragment
    var docFrag = document.createDocumentFragment();
    while (wrapper.firstChild) {
        var child = wrapper.removeChild(wrapper.firstChild);
        docFrag.appendChild(child);
    }

    // replace wrapper with document fragment
    wrapper.parentNode.replaceChild(docFrag, wrapper);
}
Run Code Online (Sandbox Code Playgroud)

试试吧:

unwrap(document.querySelector('.wrapper'));
Run Code Online (Sandbox Code Playgroud)

  • @ajbeaven保留现有的DOM对象(而不是使用innerHTML重新创建它们)意味着维护附加到它们的任何事件监听器. (6认同)
  • 很好的解决方案,但不需要从包装器中删除子节点,因为 docFrag.appendChild(wrapper.firstChild); 会自动将节点从当前位置移动到新位置。[在 MDN 上了解有关appendChild 的更多信息](https://developer.mozilla.org/en-US/docs/Web/API/Node/appendChild) (2认同)

Cha*_*kal 12

很惊讶没有人发布最简单的答案:

// Find your wrapper HTMLElement
var wrapper = document.querySelector('.wrapper');

// Replace the whole wrapper with its own contents
wrapper.outerHTML = wrapper.innerHTML;
Run Code Online (Sandbox Code Playgroud)

  • 即使你失去听众也很有趣 (2认同)

小智 12

我认为,纯JS(ES6)解决方案比jQuery解决方案更易于阅读。

function unwrap(node) {
    node.replaceWith(...node.childNodes);
}
Run Code Online (Sandbox Code Playgroud)

节点必须是ElementNode

  • 使用打字稿: ```const unwrap = (node: Element) =&gt; { node.replaceWith(...Array.from(node.children)); };``` (4认同)

Tat*_*nit 11

可以使用此API:http://api.jquery.com/unwrap/

演示 http://jsfiddle.net/7GrbM/

.unwrap

代码将在这些方面看起来像:

示例代码

$('.button').click(function(){
    $('.wrapper img').unwrap();
});
Run Code Online (Sandbox Code Playgroud)

  • +1,如果还有更多内容,则为$('。wrapper')。children()。unwrap();` (2认同)

Jay*_*ris 5

纯粹的JavaScript解决方案,我敢肯定有人可以简化它,但这是纯javascript家伙的替代品.

HTML

<div class="button" onclick="unwrap(this)">Remove wrapper</div>
Run Code Online (Sandbox Code Playgroud)

Javascript(纯)

function unwrap(i) {
    var wrapper = i.parentNode.getElementsByClassName('wrapper')[0];
    // return if wrapper already been unwrapped
    if (typeof wrapper === 'undefined') return false;
    // remmove the wrapper from img
    i.parentNode.innerHTML = wrapper.innerHTML + i.outerHTML;
    return true;
}
Run Code Online (Sandbox Code Playgroud)

的jsfiddle