为何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
相关产品推荐
相关产品推荐

