Remove all child elements of a DOM node in JavaScript

前端 未结 30 1991
花落未央
花落未央 2020-11-22 03:28

How would I go about removing all of the child elements of a DOM node in JavaScript?

Say I have the following (ugly) HTML:

&

30条回答
  •  我在风中等你
    2020-11-22 04:05

    Option 1 A: Clearing innerHTML.

    • This approach is simple, but might not be suitable for high-performance applications because it invokes the browser's HTML parser (though browsers may optimize for the case where the value is an empty string).

    doFoo.onclick = () => {
      const myNode = document.getElementById("foo");
      myNode.innerHTML = '';
    }
    Hello

    Option 1 B: Clearing textContent

    • As above, but use .textContent. According to MDN this will be faster than innerHTML as browsers won't invoke their HTML parsers and will instead immediately replace all children of the element with a single #text node.

    doFoo.onclick = () => {
      const myNode = document.getElementById("foo");
      myNode.textContent = '';
    }
    Hello

    Option 2 A: Looping to remove every lastChild:

    • An earlier edit to this answer used firstChild, but this is updated to use lastChild as in computer-science, in general, it's significantly faster to remove the last element of a collection than it is to remove the first element (depending on how the collection is implemented).
    • The loop continues to check for firstChild just in case it's faster to check for firstChild than lastChild (e.g. if the element list is implemented as a directed linked-list by the UA).

    doFoo.onclick = () => {
      const myNode = document.getElementById("foo");
      while (myNode.firstChild) {
        myNode.removeChild(myNode.lastChild);
      }
    }
    Hello

    Option 2 B: Looping to remove every lastElementChild:

    • This approach preserves all non-Element (namely #text nodes and ) children of the parent (but not their descendants) - and this may be desirable in your application (e.g. some templating systems that use inline HTML comments to store template instructions).
    • This approach wasn't used until recent years as Internet Explorer only added support for lastElementChild in IE9.

    doFoo.onclick = () => {
      const myNode = document.getElementById("foo");
      while (myNode.lastElementChild) {
        myNode.removeChild(myNode.lastElementChild);
      }
    }
    Hello

    Bonus: Element.clearChildren monkey-patch:

    • We can add a new method-property to the Element prototype in JavaScript to simplify invoking it to just el.clearChildren() (where el is any HTML element object).
    • (Strictly speaking this is a monkey-patch, not a polyfill, as this is not a standard DOM feature or missing feature. Note that monkey-patching is rightfully discouraged in many situations.)

    if( typeof Element.prototype.clearChildren === 'undefined' ) {
        Object.defineProperty(Element.prototype, 'clearChildren', {
          configurable: true,
          enumerable: false,
          value: function() {
            while(this.firstChild) this.removeChild(this.lastChild);
          }
        });
    }
    Hello

提交回复
热议问题