我有3张html格式的图片.
我 Select 包含querySelectorAll的图像,将它们转换为数组,然后:

Step1
我将它们包含在一个<div>标记中,添加一个.img-container类,使用outerHTML.

Step2
我向图像中添加了一个事件侦听器. 当图片被点击时,我会在控制台记录"img已被点击".

如果我单独运行Step1,代码可以运行.
如果我单独运行Step2,代码就可以运行.

当我try 同时运行Step1和Step2时,事件侦听器(步骤2)不起作用.

有什么帮助吗?

// Select all img tags
const allImg = document.querySelectorAll('img');


// ***STEP 1 ***
//Enclose imgs in divs (and add img-container class)
const allImgArr = Array.from(allImg).map((curr) =>
  curr.outerHTML = '<div class="img-container">' + curr.outerHTML + '</div>' );

// ***STEP 2***
//Click on image to console.log 'img has been clicked'
const allImgArrTwo = Array.from(allImg).map((curr) =>
  curr.addEventListener('click', function() {
      console.log ('img has been clicked')
    }));
.img-container {
    display: flex;
    align-items: center;
    justify-content: center;
    background-color: red;
    width: 250px;
    height: 250px;
}
<p>Img 1</p>
<img src="https://images.pexels.com/photos/574071/pexels-photo-574071.jpeg" width="100" height="100" alt="">


<p>Img 2</p>
<img src="https://images.pexels.com/photos/1181676/pexels-photo-1181676.jpeg" width="100" height="100"  alt="">

<p>Img 3</p>
<img src="https://images.pexels.com/photos/1181244/pexels-photo-1181244.jpeg" width="100" height="100" alt="">

推荐答案

您不需要将事件侦听器添加到每个图像.使用event delegation应该可以解决您的问题.这使得第二步变得多余.这段代码演示了事件委托和创建元素的方法,而不需要outerHTML.

用这stackblitz project个fork 来玩这个代码.

document.addEventListener(`click`, evt => {
  if (evt.target.nodeName === `IMG`) {
    console.clear();
    console.log(`image has been clicked`);
  }
});

// No steps needed.
// Alternative for creating div.img-container for each image
// (avoids outerHTML).
document.querySelectorAll('img').forEach( img => 
  img.insertAdjacentElement( `beforebegin`, 
    Object.assign(document.createElement(`div`), {className: `img-container`}) )
  .appendChild(img)
);
.img-container {
    display: flex;
    align-items: center;
    justify-content: center;
    background-color: red;
    width: 250px;
    height: 250px;
}
<p>Img 1</p>
<img src="//images.pexels.com/photos/574071/pexels-photo-574071.jpeg?cs=srgb&dl=pexels-lukas-574071.jpg" width="100" height="100" alt="">


<p>Img 2</p>
<img src="//images.pexels.com/photos/1181676/pexels-photo-1181676.jpeg?cs=srgb&dl=pexels-christina-morillo-1181676.jpg" width="100" height="100"  alt="">

<p>Img 3</p>
<img src="//images.pexels.com/photos/1181244/pexels-photo-1181244.jpeg" width="100" height="100" alt="">

Javascript相关问答推荐

如何通过onClick为一组按钮分配功能;

如何通过在提交时工作的函数显示dom元素?

如何在不分配整个数组的情况下修改包含数组的行为主体?

vanillajs-datepicker未设置输入值,日期单击时未触发更改事件

使用json文件字符串来enum显示类型字符串无法按照计算的enum成员值的要求分配给类型号

使用JavaScript在ionic Web应用程序中更新.pane和.view的背景 colored颜色

警告!合同执行期间遇到错误[执行已恢复](Base Layer 2)

yarn安装一个本地npm包,以便本地包使用main项目的node_modules(ckeditor-duplicated-modules错误)

Javascript,部分重排序数组

在vercel throws上部署带有gunjs的sveltekit应用无法找到模块./' lib/文本编码'

如何修复我的js构建表每当我添加一个额外的列作为它的第一列?

在Three JS中看不到补间不透明度更改效果

如何在bslib nav_insert之后更改导航标签的CSS类和样式?

如何在coCos2d-x中更正此错误

将对象推送到数组会导致复制

将范围 Select 器添加到HighChart面积图

无法检索与Puppeteer的蒸汽游戏的Bundle 包价格

Socket.IO在刷新页面时执行函数两次

如何使用[ModelJSON,ArrayBuffer]调用tf.loadGraphModelSync

在HTML5画布上下文中使用putImageData时,重载解析失败