如何替换数组中的元素?

问题描述 投票:2回答:2

我正在构建一个Wordpress网站,我已经制作了这个网站,以便您可以通过CKEditor插入带有视差的全宽图像,方法是为插入的图像分配类。我编写的脚本用div替换找到的图像,并使用替换图像的源作为div的背景。其余的由CSS完成。我的问题是,到目前为止,我只能使用第一个具有该类的图像。

我知道我的代码在哪里发生故障 - 当我用div替换图像时。

这是我的代码:

if (document.getElementsByClassName('fullwidth-image').length > 0) {
      let pictures = document.getElementsByClassName('fullwidth-image');
      Array.prototype.forEach.call(pictures, function(e){
        let imgUrl = e.src,
        imgWrapper = document.createElement('div');
        imgWrapper.classList.add('fullwidth-container');
        imgWrapper.style.backgroundImage = 'url(' + imgUrl + ')';
        e.replaceWith(imgWrapper);
      });
}

如果我发表评论

e.replaceWith(imgWrapper);

然后

console.log(e);

输出页面上的所有图像,就像它应该的那样。但是当它在代码中时,只输出class =“fullwidth-image”的第一个图像。我怎么能写得更好?

javascript arrays replacewith
2个回答
0
投票

来自getElementsByClassName的返回值是一个实时HTMLCollection,这意味着它会在更改基础文档时自动更新。

因此,每当您替换其中的一个元素时,您对这个“类似数组”对象的迭代就会受到影响。

您可以简单地从集合中的元素中创建一个普通数组,并迭代它(在迭代时不会搞砸)。

let pictureElements = document.getElementsByClassName('fullwidth-image');

const pictures = [...pictureElements]; // Uses object spread syntax

pictures.forEach(function(e) {
  let imgUrl = e.src,
  imgWrapper = document.createElement('div');
  imgWrapper.classList.add('fullwidth-container');
  imgWrapper.style.backgroundImage = 'url(' + imgUrl + ')';
  e.replaceWith(imgWrapper);
});
div.fullwidth-container {
  width: 100%;
  height: 50px;
  border: 1px solid black;
}
<img class="fullwidth-image" id="img1" src="" alt="No Image 1"/>
<img class="fullwidth-image" id="img2" src="" alt="No Image 2"/>
<img class="fullwidth-image" id="img3" src="" alt="No Image 3"/>
<img class="fullwidth-image" id="img4" src="" alt="No Image 4"/>
<img class="fullwidth-image" id="img5" src="" alt="No Image 5"/>

请注意,所有被替换的元素应该是带有黑色边框的<div>


0
投票

尝试使用querySelectorAll而不是getElementsByClassName,它对我有用

© www.soinside.com 2019 - 2024. All rights reserved.