javascript - 使用 DOM 方法删除图像元素

标签 javascript dom

谁能解释为什么 remove() 方法不能像我预期的那样工作。我想从文档中删除所有 img 元素。 遍历文档并删除所有图像,这就是我想要的,但这只删除了 2 张图像,为什么? 这是代码 JSBIN

HTML

<img src="http://www.lorempixel.com/50/50" alt="pic">
<img src="http://www.lorempixel.com/50/50/animals" alt="pic">
<img src="http://www.lorempixel.com/50/50/city" alt="pic">

JS

var imgElements = document.getElementsByTagName("img"); // HTMLCollection

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

最佳答案

关于这段代码,有两件事让我担心:

  1. remove 是一种相对较新的 DOM 方法,它没有得到很好的支持。为了获得更好的支持,请使用 img.parentNode.removeChild(img);

  2. getElementsByTagName 返回一个live NodeList,因此当您从列表的开头删除元素时,所有其他元素上移。因此,如果列表有 5 个条目,并且您删除了 i=0 元素,所有其他元素都会移动,现在有一个 i=0元素(长度为 4)。您的循环将移动到 i=1,因此位于 i=0 的元素(过去位于 i=1)不会不被处理。

    对于非实时 NodeList,使用 querySelectorAll('tagname')(或者只是向后循环列表,从末尾移除)。或者使用 Array.prototype.sliceNodeList 转换为数组。

    querySelectorAll 受所有现代浏览器支持,IE8 也支持。

这是一个使用 querySelectorAll 的例子:

var imgElements = document.querySelectorAll("img"); // HTMLCollection
for(var i=0; i<imgElements.length; i++) {
  var img = imgElements[i];
  img.parentNode.removeChild(img);
}

或者只是倒数:

var imgElements = document.getElementsByTagName("img"); // HTMLCollection
for(var i=imgElements.length-1; i>=0; i--) {
  var img = imgElements[i];
  img.parentNode.removeChild(img);
}

或者使用Array.prototype.slice:

var imgElements = Array.prototype.slice.call(document.getElementsByTagName("img"));
for(var i=0; i<imgElements.length; i++) {
  var img = imgElements[i];
  img.parentNode.removeChild(img);
}

关于javascript - 使用 DOM 方法删除图像元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27889663/

相关文章:

javascript - lit-element 示例中 "$="或 "?="的用途

javascript - 一个 URL 包含在另一个 URL 中的参数

javascript - 两个文件夹 vs lib 文件夹 meteor

javascript - 动态设置文件输入的值

javascript - 纯 JavaScript 的粘性 header ,存在 DOM 问题

javascript - 如何从 jQuery 访问 DOM 的顶层?

javascript - 设置间隔和 AJAX

JavaScript:有没有办法自动初始化实时集合中的元素?

javascript - 枚举由 Handlebars.js 生成的元素在第一页加载时不返回任何内容

javascript - 在 WebRTC 中发送远程 ice candidates 的 SyntaxError