You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过addEventListener为多张图片添加样式事件?循环绑定报错求解

循环绑定图片鼠标事件报错的修复方案

错误原因

你碰到的 Uncaught TypeError: Cannot set property 'style' of undefined 问题,根源在于用var声明的变量i没有块级作用域。循环结束后,i的值会变成images.length,当鼠标事件触发时,匿名函数里的images[i]其实是images[images.length],超出了元素集合的索引范围,自然是undefined。

修复方案

方案1:用this指向当前触发事件的元素

事件触发时,this会指向当前触发事件的<img>元素,直接用它来设置样式即可,同时建议单独修改transform属性,避免覆盖其他样式:

const images = document.querySelectorAll(".gallery img");

for (var i = 0; i < images.length; i++) {
    images[i].addEventListener('mouseout', function() {
        this.style.transform = "scale(.8)";
    });
    images[i].addEventListener('mouseover', function() {
        this.style.transform = "scale(1.2)";
    });
}

方案2:用let声明循环变量

let拥有块级作用域,每次循环的i都是独立的,不会被后续循环修改:

const images = document.querySelectorAll(".gallery img");

for (let i = 0; i < images.length; i++) {
    images[i].addEventListener('mouseout', function() {
        images[i].style.transform = "scale(.8)";
    });
    images[i].addEventListener('mouseover', function() {
        images[i].style.transform = "scale(1.2)";
    });
}

方案3:用forEach遍历元素集合

更简洁的写法,直接遍历每个图片元素绑定事件:

document.querySelectorAll(".gallery img").forEach(img => {
    img.addEventListener('mouseout', () => img.style.transform = "scale(.8)");
    img.addEventListener('mouseover', () => img.style.transform = "scale(1.2)");
});

方案4:纯CSS实现(推荐)

如果不需要额外JS逻辑,用CSS伪类:hover就能实现相同效果,更高效且代码更简洁,还能加过渡动画让效果更平滑:

.gallery img {
    transition: transform 0.3s ease; /* 添加平滑过渡 */
    transform: scale(.8); /* 默认缩放0.8 */
}
.gallery img:hover {
    transform: scale(1.2); /* 鼠标悬浮时缩放1.2 */
}

内容的提问来源于stack exchange,提问作者Alberto Licea

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 10:36:51