【问题标题】:Remove dom element without knowing its parent?在不知道其父级的情况下删除 dom 元素?
【发布时间】:2017-08-14 19:18:59
【问题描述】:

是否可以删除除了 body 标签之外没有父元素的 dom 元素?我知道使用 jquery 之类的框架会很容易做到这一点,但我试图坚持使用直接的 javascript。

这是我发现的其他代码:

function removeElement(parentDiv, childDiv){
     if (childDiv == parentDiv) {
          alert("The parent div cannot be removed.");
     }
     else if (document.getElementById(childDiv)) {     
          var child = document.getElementById(childDiv);
          var parent = document.getElementById(parentDiv);
          parent.removeChild(child);
     }
     else {
          alert("Child div has already been removed or does not exist.");
          return false;
     }
}   

谢谢!

【问题讨论】:

  • 仅供参考 body 是一个完全有效的父母。
  • 每个元素都有一个父元素
  • @connorspiracist 除了document
  • @adam document 不是元素,它是一个节点(文档节点),因此不属于元素
  • 未添加到树中的文档片段没有父级。

标签: javascript removechild


【解决方案1】:

您应该能够获取元素的父元素,然后从中删除元素

function removeElement(el) {
el.parentNode.removeChild(el);
}

更新

您可以将其设置为 HTMLElement 上的新方法:

HTMLElement.prototype.remove = function() { this.parentNode.removeChild(this); return this; }

然后执行el.remove()(这也将返回元素)

【讨论】:

  • 更新到正确答案,因为它更加模块化/包含不同的场景。谢谢。
【解决方案2】:
childDiv.remove();

适用于 Chrome 25.0.1364.155

请注意,这在 IE11 或 Opera Mini 中不起作用,但所有其他浏览器都支持。

请看这里:reference to childnode-remove on caniuse

【讨论】:

【解决方案3】:

我认为你可以做类似...

var child = document.getElementById(childDiv);
//var parent = document.getElementById(parentDiv);
child.parentNode.removeChild(child);

有关更多信息,请参阅node.parentNode

【讨论】:

    【解决方案4】:
    document.body.removeChild(child);
    

    【讨论】:

    • @unknown:此答案仅适用于 document.body 的直接后代节点。其他答案适用于所有情况,包括document.body 的后代。
    • 如上所述,此答案仅适用于作为 body 的直接后代的元素。有人可以审核吗?
    • 阅读问题:«a dom element that has no parent other than body tag»,所以我的回答非常有价值
    【解决方案5】:

    使用outerHTML 属性删除元素

    remElement(document.getElementById('title'));
    remElement(document.getElementById('alpha'));
    
    function remElement(obj) {
    obj.outerHTML="";
    }
    

    【讨论】:

      【解决方案6】:

      这个函数可以简单地使用 id 删除一个元素:

      function removeElement (id) { 
        document.getElementById(id).parentElement.removeChild(document.getElementById(id));
      }
      

      【讨论】:

        【解决方案7】:

        好的,从 DOM 中删除 DOM 元素基本上不需要知道父节点,看下面的代码,看看 JavaScript 中删除节点元素的顺序是怎样的:

        Element + parentNode + removeChild(Element);

        如你所见,我们首先找到元素,然后使用 .parentNode ,然后再次删除作为元素的子元素,所以我们根本不需要知道父元素!

        所以现在看看真正的代码:

        var navigation = document.getElementById('navigation');
        if(navigation) {
          navigation.parentNode.removeChild(navigation);
        }
        

        或作为函数

        function removeNode(element) {
          if(element) { //check if it's not null
            element.parentNode.removeChild(element);
          } 
        } //call it like : removeNode(document.getElementById('navigation'));
        

        jQuery 也有 remove() 函数,被广泛使用,比如:

        $('#navigation').remove();
        

        还有原生 ChildNode.remove() 不在 IE 和旧浏览器中,但你可以对其进行 polyfill,查看 MDN 中建议的 polyfill:

        Polyfill
        您可以在 Internet Explorer 9 及更高版本中填充 remove() 方法 使用以下代码:

        //from:https://github.com/jserz/js_piece/blob/master/DOM/ChildNode/remove()/remove().md
        (function (arr) {
          arr.forEach(function (item) {
            if (item.hasOwnProperty('remove')) {
              return;
            }
            Object.defineProperty(item, 'remove', {
              configurable: true,
              enumerable: true,
              writable: true,
              value: function remove() {
                this.parentNode.removeChild(this);
              }
            });
          });
        })([Element.prototype, CharacterData.prototype, DocumentType.prototype]);
        

        如果您想了解更多信息,请访问 MDN 上的 link

        【讨论】:

          猜你喜欢
          • 2021-05-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-17
          • 2013-10-16
          • 1970-01-01
          • 2015-03-22
          • 2019-10-23
          相关资源
          最近更新 更多