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

如何在class中正确添加inline内联事件监听器?

问题根因

你写的inline onclick 事件里的this指向的是触发事件的<button> DOM元素,不是你创建的App类实例,自然找不到test方法,所以点击不会触发预期逻辑。

解决方案

方案1:推荐使用addEventListener绑定(无需暴露全局变量)

这是最通用的做法,不管有没有传参需求都适用,也不会污染全局作用域:

class App {
  constructor() {
    this.init();
  }

  init() {
    document.body.innerHTML = `
      <button id="testBtn">click me</button>
    `;
    // 绑定事件,箭头函数会继承外层init方法的this,也就是App实例
    document.querySelector('#testBtn').addEventListener('click', () => {
      // 不带参数调用
      this.test();
      // 带参数调用直接传就行,比如 this.test('参数1', 123)
    })
  }

  test(param1, param2) {
    console.log("test", param1, param2);
  }
}

const app = new App();

方案2:必须用inline内联绑定的处理方式

inline事件的执行上下文是全局window,所以你需要把App实例挂载到全局作用域才能访问:

class App {
  constructor() {
    this.init();
  }

  init() {
    // 将当前实例挂载到window全局对象上
    window.myApp = this;
    document.body.innerHTML = `
      <!-- 直接调用全局的myApp实例的方法 -->
      <button onclick="myApp.test()">click me</button>
      <!-- 带参数的写法:<button onclick="myApp.test('字符串参数', 456)">click me</button> -->
    `;
  }

  test(param1, param2) {
    console.log("test", param1, param2);
  }
}

const app = new App();

注意:第二种方案会污染全局作用域,只适合简单 demo 场景,复杂项目优先用第一种方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 19:15:04