【问题标题】:Remove an element from the DOM from reference to element only仅从对元素的引用中移除 DOM 中的元素
【发布时间】:2017-05-13 02:31:19
【问题描述】:

这要么非常简单,要么不可能。

我知道我能做到:

var element = document.getElementById('some_element');
element.parentNode.removeChild(element);

...但感觉很乱。是否有一种更简洁且得到普遍支持的方式来做同样的事情?

似乎——至少在我看来——应该是这样的:

document.getElementById('some_element').remove();

...但这不起作用,搜索 Google/SO 并没有找到任何替代方案。

我知道这无关紧要,但 parentNode.removeChild() 只是觉得 hacky/messy/inefficient/bad practice-y。

【问题讨论】:

    标签: javascript removechild


    【解决方案1】:

    这看起来有点乱,但这是从父元素中移除元素的标准方法。 DOM 元素本身可以独立存在,没有parentNode,因此removeChild 方法在父级上是有意义的。

    IMO DOM 节点本身的通用 .remove() 方法可能会产生误导,毕竟,我们并没有从存在中删除元素,只是从其父元素中删除。

    不过,您始终可以为此功能创建自己的包装器。例如

    function removeElement(element) {
        element && element.parentNode && element.parentNode.removeChild(element);
    }
    
    // Usage:
    removeElement( document.getElementById('some_element') );
    

    或者,使用像 jQuery 这样的 DOM 库,它为您提供了一堆包装器,例如在 jQuery 中:

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

    编辑是对您的评论的回应,您在评论中询问了扩展本机 DOM 实现的可能性。这被认为是一种不好的做法,因此我们要做的是创建自己的包装器来包含元素,然后创建我们想要的任何方法。例如

    function CoolElement(element) {
        this.element = element;
    }
    
    CoolElement.prototype = {
        redify: function() {
            this.element.style.color = 'red';
        },
        remove: function() {
            if (this.element.parentNode) {
                this.element.parentNode.removeChild(this.element);
            }
        }
    };
    
    // Usage:
    
    var myElement = new CoolElement( document.getElementById('some_element') );
    
    myElement.redify();
    myElement.remove();
    

    本质上,这就是 jQuery 所做的事情,尽管它更高级一些,因为它包装了 DOM 节点的集合,而不是像上面那样仅包含单个元素。

    【讨论】:

    • +1,我喜欢你的删除元素方法,但它引出了一个子问题——有没有办法为 DOM 元素制作原型方法(在任何地方都可以使用)?我试过HTMLElement.prototype 和看起来很可怕的Object.prototype,但都没有在任何地方工作......
    • 是的,有办法让它工作,但它被认为是一种不好的做法。这就是为什么存在像 jQuery 这样的东西,创建一个完全独立的对象来包含元素,通过它你可以调用方法。您还可以扩展 jQuery。我会在我的答案中添加一个编辑。给我一秒钟:)
    • 同意,抛开我对 jQ 这样的图书馆的仇恨(见其他答案的评论)你说的一切都是真的。
    • 这条指令element && element.parentNode && element.parentNode.removeChild(element);是否意味着如果元素存在并且其父元素也存在,则移除该元素?为什么我们可以使用多个&& 来完成这些步骤?我不知道为什么我可以这样做。
    • @Stallman,为了以后参考,JS使用了短路求值,也就是说如果element或者element.parentNode不存在,逻辑运算就会短路,返回false。此页面上的更多信息:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
    【解决方案2】:

    DOM 4 级规范似乎采用了“jQuery 哲学”来执行多个 DOM 更改操作(请参阅https://dvcs.w3.org/hg/domcore/raw-file/tip/Overview.html#interface-element)。删除就是其中之一:

    var el = document.getElementById("myEl");
    el.remove();
    

    目前,它仅在更高版本的 Chrome、Opera、Firefox 中受支持,但如果您想在今天的生产中使用此功能,可以使用 shims 对其进行修补: https://github.com/Raynos/DOM-shim

    是否最好删除Child,我现在没有争议。

    【讨论】:

      【解决方案3】:

      您的代码是正确且最好的方法。

      jQuery 有what you're looking for:

      $("#someId").remove();
      

      【讨论】:

      • 我认为可能是这种情况,但我想我会问一下,以防我错过了一些非常明显的东西。我个人避免使用 JS 框架,因为恕我直言 a)从长远来看,它很少会为您节省任何带宽 - 我的纯 JS 脚本往往比库 + 我的基于库的代码小,并且 b)它让你变得懒惰,你忘记语言实际上是如何工作的。不过我还是会 +1,因为当我忽略我的个人意见时,你的回答肯定很有用......
      • 框架让你忘记 IE(错误)是如何工作的。快速:如何使用 IE 在 Javascript 中设置 float
      • Frameworks 鼓励您学习 Javascript 的工作原理,同时让您忘记 DOM 的工作原理。它们还使您能够更快更快地开发。
      • 我同意不必担心交叉兼容(尤其是 IE 交叉兼容)是件好事,但我不认为人们鼓励学习语言 - 我和很多写 jQ 的人一起工作,没有一个人知道从哪里开始使用 Node,他们似乎认为我做的一些事情是巫术......
      • @Dave:那是他们的错,他们也会遇到 jQuery 的问题。正确使用 jQuery 需要深入了解原始 Javascript,包括闭包、原型和引用。
      猜你喜欢
      • 1970-01-01
      • 2012-02-08
      • 2014-09-01
      • 2013-02-28
      • 1970-01-01
      • 2014-05-22
      • 2014-05-04
      • 1970-01-01
      • 2020-03-09
      相关资源
      最近更新 更多