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

为何jQuery无法在TypeScript类构造函数中捕获事件?

问题描述

我编写了一个用于学习组合数学的TypeScript脚本,引入jQuery来简化DOM事件处理。已通过npm安装所有依赖,构建过程无报错。

main.ts代码如下:

import * as $ from 'jquery';
import {Totalizator} from "./totalizator/totalizator";


$(() => {
    new Totalizator($('#totalizator'), 42, 5);
});

totalizator.ts代码如下:

import * as $ from 'jquery';

const classes = {
    number: 'number'
};

const selectors = {
    number: `.${classes.number}`,
    numbersTable: '#totalizatorNumbersTable',
    chosenNumbersTable: '#totalizatorChosenNumbersTable'
};

export class Totalizator {
    private $container: JQuery;

    private readonly numbers: number;
    private readonly choices: number;

    constructor($container: JQuery, numbers: number, choices: number) {
        this.$container = $container;
        this.numbers = numbers;
        this.choices = choices;

        this.printNumbersTable();
        this.printChosenNumbersTable();

        // 此处可正常输出jQuery对象
        console.log(this.$container);

        // 此处绑定的点击事件无法触发
        $(this.$container).on(`${selectors.numbersTable} ${classes.number}`, 'click', (event) => {
            console.log(event);
        });
    }
}

点击带有“number”类的元素时,点击事件未触发,即使使用如下基础jQuery写法也无效:

$('#totalizator').on('#totalizatorNumbersTable .number', 'click', (event) => {
    console.log(event);
});

注:totalizator.ts已简化,仅保留构造函数,其余为HTML打印代码,不影响问题。请问这是为什么?


问题原因及解决方法

问题出在jQuery事件委托的参数顺序错误。

jQuery的.on()方法用于事件委托时,正确语法为:

$(父元素).on(事件类型, 子元素选择器, 事件处理函数)

你当前的写法把子元素选择器放在了第一个参数(事件类型的位置),将事件类型click放到了第二个参数,完全不符合API规范,导致事件无法正确绑定。

修正后的代码

Totalizator类构造函数中的事件绑定代码应修改为:

$(this.$container).on('click', `${selectors.numbersTable} ${selectors.number}`, (event) => {
    console.log(event);
});

你测试的基础写法需调整为:

$('#totalizator').on('click', '#totalizatorNumbersTable .number', (event) => {
    console.log(event);
});

额外提示

  • 之前直接使用${classes.number}时,仅传入了类名字符串number,缺少前缀.,建议使用已定义好的selectors.number(已包含.),避免出错且保持代码统一。
  • 确认printNumbersTable()方法正确生成了带number类的元素,且这些元素是#totalizatorNumbersTable的子元素,同时#totalizatorNumbersTable属于#totalizator的子元素,保证事件委托的层级正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 10:10:14