删除子函数事件监听器
Removing child-function event listeners
在构建扩展的 input
字段(复杂的日期选择器)时,我需要使用两个关键事件侦听器。一个附加到输入字段,并启动界面。这很简单。
第二个附加到document
,以关闭复杂的覆盖。单击叠加层,它什么也不做。单击外部:叠加层消失,输入字段的值更新。
它还需要从 document
中删除事件侦听器。
如果不是基于对象结构,这一切都会很简单。我不是在调用独立函数。我正在调用与该字段关联的数据对象的子函数(该字段无法引用回该字段)。
__DateField.prototype.activate = function () {
…
var t = this;
window.setTimeout(function () { document.addEventListener("click", function (ev) { t.closeDateSelector(ev) }, false); }, 0);
…
}
(我还没弄清楚为什么那个事件附件需要嵌套在 setTimeout
中,但如果我不那样做,它会立即调用自己。)
无论如何,问题是我无法成功调用 document.removeEventListener()
,因为它不是同一个初始函数。
此外,我无法通过将函数附加为独立的方式来处理它,因为我需要 对相关 __DateField
对象的引用。
如何从 document
中删除该功能?
我查看了各种线程,它们说无法检查通过“addEventListener”添加的事件侦听器,但想知道它们是否已过时,因为 Firebug 可以列出它们……
要删除它,您必须有函数的引用,所以问题归结为:如何保留函数的引用?
最简单的答案是在对象上添加 属性,因为您手边已经有了一个对象,如果您可以相信 this
在您进行删除时是正确的:
__DateField.prototype.activate = function () {
// …
var t = this;
window.setTimeout(function () {
t.listener = function (ev) {
t.closeDateSelector(ev)
};
document.addEventListener("click", listener, false);
}, 0);
// …
};
// To remove
__DateField.prototype.deactivate = function() {
if (this.listener != null) {
document.removeEventListener("click", this.listener, false);
this.listener = null;
}
};
或者如果由于某种原因这是个问题,您可以在作用域函数中使用变量:
(function() {
var listener = null;
__DateField.prototype.activate = function () {
// …
var t = this;
window.setTimeout(function () {
listener = function (ev) {
t.closeDateSelector(ev)
};
document.addEventListener("click", listener, false);
}, 0);
// …
};
// Later, when removing
function removeIt() {
if (listener != null) {
document.removeEventListener("click", listener, false);
listener = null;
}
}
})();
在构建扩展的 input
字段(复杂的日期选择器)时,我需要使用两个关键事件侦听器。一个附加到输入字段,并启动界面。这很简单。
第二个附加到document
,以关闭复杂的覆盖。单击叠加层,它什么也不做。单击外部:叠加层消失,输入字段的值更新。
它还需要从 document
中删除事件侦听器。
如果不是基于对象结构,这一切都会很简单。我不是在调用独立函数。我正在调用与该字段关联的数据对象的子函数(该字段无法引用回该字段)。
__DateField.prototype.activate = function () {
…
var t = this;
window.setTimeout(function () { document.addEventListener("click", function (ev) { t.closeDateSelector(ev) }, false); }, 0);
…
}
(我还没弄清楚为什么那个事件附件需要嵌套在 setTimeout
中,但如果我不那样做,它会立即调用自己。)
无论如何,问题是我无法成功调用 document.removeEventListener()
,因为它不是同一个初始函数。
此外,我无法通过将函数附加为独立的方式来处理它,因为我需要 对相关 __DateField
对象的引用。
如何从 document
中删除该功能?
我查看了各种线程,它们说无法检查通过“addEventListener”添加的事件侦听器,但想知道它们是否已过时,因为 Firebug 可以列出它们……
要删除它,您必须有函数的引用,所以问题归结为:如何保留函数的引用?
最简单的答案是在对象上添加 属性,因为您手边已经有了一个对象,如果您可以相信 this
在您进行删除时是正确的:
__DateField.prototype.activate = function () {
// …
var t = this;
window.setTimeout(function () {
t.listener = function (ev) {
t.closeDateSelector(ev)
};
document.addEventListener("click", listener, false);
}, 0);
// …
};
// To remove
__DateField.prototype.deactivate = function() {
if (this.listener != null) {
document.removeEventListener("click", this.listener, false);
this.listener = null;
}
};
或者如果由于某种原因这是个问题,您可以在作用域函数中使用变量:
(function() {
var listener = null;
__DateField.prototype.activate = function () {
// …
var t = this;
window.setTimeout(function () {
listener = function (ev) {
t.closeDateSelector(ev)
};
document.addEventListener("click", listener, false);
}, 0);
// …
};
// Later, when removing
function removeIt() {
if (listener != null) {
document.removeEventListener("click", listener, false);
listener = null;
}
}
})();