事件处理程序连接在哪里,以及它为什么存在

Where is the eventhandler attached and why is it present at all?

本文关键字:为什么 存在 程序 连接 在哪里 事件处理      更新时间:2023-09-26

使用JQuery中的Typescript创建一个对话框,然后将click事件附加到两个按钮和窗口标题中的"X"。实际上,每当用户希望打开对话框时,代码都会创建一个新的SettingDlog对象,但绑定的单击事件似乎会在用户选择显示"设置"对话框时添加一个额外的事件。

我认为点击事件可能是被添加到DOM对象中的,因为它独立于typescript类(JavaScript对象),但我在DOM资源管理器中看不到它,所以我认为这是不正确的。

作为一种变通方法,我在调用事件处理程序时显式地删除它,但我不明白为什么必须这样做,因为我每次都要创建一个新的SettingDlog对象。

显示对话框的代码:

 let myDlog = new SettingsDlog();
 myDlog.closedCallback = "settingsDlog_Closed";
 myDlog.show();

然后在SettingsLog的show()方法中,我有:

show() {
     $('#closeX').click({ isOK: false }, this.onClose.bind(this))
     $('#btnCancel').click({ isOK: false }, this.onClose.bind(this))
     $('#btnOK').click({ isOK: true }, this.onClose.bind(this));
}

最后,当用户单击三个UI元素中的任何一个来关闭对话框时,设置对话框的onClose()方法被调用:

 onClose(event) {
    this.dialogResult = event.data.isOK;
    if (!AppHelper.isNullOrEmpty(this._closedCallback))
        MainPage[this._closedCallback](this);
}

最后为MainPage对象调用_closedCallback:

settingsDlog_Closed(sender: SettingsDlog) {
        if (!sender.dialogResult)
            return;
       // if here do something useful...
}

当我在settingsLog_Closed中放置一个断点,并第二次(或第三次…)单击以显示"设置"对话框时,它的作用就好像添加了第二次或第三个单击事件。

这是我添加到SettingsLog的onClosed方法中的代码,作为一种变通方法:

 $('#closeX').off('click');
 $('#btnCancel').off('click');
 $('#btnOK').off('click');

有人能帮我理解这种奇怪的行为吗?

感谢@Patrick Evans为我指明了正确的方向。这是我需要知道的。如何检查动态附加事件侦听器是否存在?

考虑到这一点,我在SettingsLog类中添加了一个静态变量,一旦调用"show"方法,该变量就会设置为true。该类对象的任何后续实例化都不会与事件处理程序附件进程重复。