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

按钮无法自动点击求助:代码报错“无法读取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 08:50:23