【发布时间】:2015-05-23 17:38:05
【问题描述】:
在构建扩展的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 可以列出它们……
【问题讨论】:
-
我怀疑这可能与从添加的事件侦听器中调用进程嵌入的函数有关......
-
啊,抱歉,我记错了 DOM 事件规范。它说传播路径(事件将发生的元素)必须在一开始就确定而不是改变,但它并没有说处理程序必须是提前确定。因此,在冒泡事件的处理程序中,将同一事件的处理程序添加到祖先元素确实会导致该处理程序被触发。 Example | Relevant section of DOM events spec
setTimeout是解决这个问题的完美方式。
标签: javascript event-handling listener