按钮无法自动点击求助:代码报错“无法读取undefined的click属性”
问题分析
错误根源是用var声明的循环变量i属于函数作用域,循环里所有的yeet函数共享同一个i的引用。等鼠标悬停触发定时器时,循环早就执行完毕,i的值已经等于按钮集合的长度,此时x[i]就是undefined,调用click()自然会抛出"无法读取undefined的click属性"的错误。
解决方案
下面是几种可行的修复方式:
方式一:用let替换var声明循环变量
let拥有块级作用域,每次循环都会生成独立的i变量,每个yeet函数会绑定当前循环的i值:
let int; const x = document.querySelectorAll("button"); for (let i = 0; i < x.length; i++) { function yeet() { x[i].click(); } x[i].onmouseenter = function() { int = setInterval(yeet, 0); }; x[i].onmouseleave = function() { clearInterval(int); }; }
方式二:用forEach遍历按钮集合
直接遍历每个按钮,彻底规避循环变量的作用域问题:
let int; document.querySelectorAll("button").forEach(btn => { function yeet() { btn.click(); } btn.onmouseenter = () => { int = setInterval(yeet, 0); }; btn.onmouseleave = () => { clearInterval(int); }; });
方式三:立即执行函数创建独立作用域(兼容旧环境)
如果需要兼容不支持let的老浏览器,用立即执行函数为每个循环迭代创建独立作用域:
var int; var x = document.querySelectorAll("button"); for (var i = 0; i < x.length; i++) { (function(index) { function yeet() { x[index].click(); } x[index].onmouseenter = function() { int = setInterval(yeet, 0); }; x[index].onmouseleave = function() { clearInterval(int); }; })(i); }
注意:定时器间隔设为0会高频触发点击,可能影响页面性能,建议根据实际需求调整为合理值(比如100ms)。
内容的提问来源于stack exchange,提问作者user20479204
相关产品推荐
相关产品推荐

