Removing HTMLCollection elements from the DOM

前端 未结 5 1058
孤独总比滥情好
孤独总比滥情好 2020-11-28 12:53

I have a collection of paragraph elements. Some are empty and some contain whitespace only, while others have content:

Pellentesque habitant morbi t

5条回答
  •  孤城傲影
    2020-11-28 13:28

    The problem is that paragraphs is a live list. By removing a p element, you are also changing that list. A simple fix is to iterate over the list in reverse order:

    for (var i = paragraphs.length - 1; i >= 0; --i) {
      paragraphs[i].remove();
    }
    

    The alternative solution is to create a static list (non-live list). You can do this by either:

    • converting the list into an Array:

      var paragraphs =
        Array.prototype.slice.call(document.getElementsByTagName('p'), 0);
      
    • using document.querySelectorAll:

      var paragraphs = document.querySelectorAll('p');
      

    You can then iterate over the list in regular order (using a for loop):

    for (var i = 0; i < paragraphs.length; ++i) {
      paragraphs[i].remove();
    }
    

    or (using a for...of loop):

    for (var paragraph of paragraphs) {
      paragraph.remove();
    }
    

    Note that .remove is a relatively new DOM method, and not supported in every browser. See the MDN documentation for more info.


    To illustrate the problem, let’s imagine we have a node list of three elements, paragraphs = [p0, p1, p2]. Then this is what happens when you iterate over the list:

    i = 0, length = 3, paragraphs[0] == p0  => paragraphs = [p1, p2]
    i = 1, length = 2, paragraphs[1] == p2  => paragraphs = [p1]
    i = 2, length = 1, END
    

    So in this example, p1 is not deleted because it is skipped.

提交回复
热议问题