事件处理程序连接在哪里,以及它为什么存在
Where is the eventhandler attached and why is it present at all?
使用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。该类对象的任何后续实例化都不会与事件处理程序附件进程重复。
相关文章:
- 为什么JavaScript中存在单态和多态性问题
- 为什么没有从数组中存在的对象中删除属性
- 为什么属性存在于对象实例上,即使其原型发生了更改
- 事件处理程序连接在哪里,以及它为什么存在
- 为什么不允许值为0的变量询问是否存在
- 默认选中;为什么这个属性甚至存在
- 我把“;类“;SVG中存在但未应用的节点的属性!为什么?
- 为什么indexOf()在值存在时仍然返回-1
- 为什么在删除指令之后“;人;类的实例仍然存在
- 为什么对匿名函数的引用继续存在
- 为什么我的代码不能用于查找 JavaScript 中的数组中是否存在值
- 为什么JS需要对象/数组存在
- 为什么当我刚刚创建 DOM 元素时它不存在
- 为什么在 php 网站中存在恶意软件问题 在 javascript 文件中不断存在
- 为什么 jquery 在我刷新时显示“禁用”属性存在
- 为什么在 JavaScript 中引用对象的不存在属性不会返回引用错误
- 打字稿 - 为什么猫鼬中不存在“方法”属性
- 为什么 -0 存在
- 为什么存在空白/“;“重叠”;在rect元素之间应该有'不要
- 标签为什么存在?