Javascript 事件处理程序中的setTimeout未显示为激发
我知道并不是所有放在队列上的setTimout任务都会被触发,这要感谢bobnice在这方面的一篇文章。但我不明白为什么在这种情况下无法达到: 我通过addEventListener“click”将以下事件处理程序添加到锚链接中。。。要尝试所谓的飞行中事件修改:Javascript 事件处理程序中的setTimeout未显示为激发,javascript,events,Javascript,Events,我知道并不是所有放在队列上的setTimout任务都会被触发,这要感谢bobnice在这方面的一篇文章。但我不明白为什么在这种情况下无法达到: 我通过addEventListener“click”将以下事件处理程序添加到锚链接中。。。要尝试所谓的飞行中事件修改: var f = function(e) { e.preventDefault(); e.stopPropagation(); // capture first event e2 = new MouseEve
var f = function(e) {
e.preventDefault();
e.stopPropagation(); // capture first event
e2 = new MouseEvent("click",{metaKey:true}); // create second event where we hold meta
e.target.removeEventListener('click', f, false); // remove this handler so no stackoverflow
e.target.dispatchEvent(e2); // dispatch second event, a "modified" first event.
};
很好
但是,早期版本有以下内容:
setTimeout( 0, function () {
e.target.dispatchEvent(e2); // dispatch second event, a "modified" first event.
});
当我无法让removeEventListener工作时,作为调试补丁从处理程序内部尝试避免堆栈溢出-我忽略了将函数f分配给变量
为什么这个setTimeout不能执行?在我的一些测试中,它从未从第一个事件的侦听器中执行第二个事件的调度
显然,setTimeout将dispatchEvent的执行上下文置于函数f的堆栈帧之外,因为f在dispatchEvent激发之前返回
或者,更确切地说,不会开火
我想确切地理解为什么它在以前版本的代码中没有触发。的超时延迟应该是第二个参数,而不是第一个参数!这就是它没有触发的原因。的超时延迟应该是第二个参数,而不是第一个参数!这就是为什么它没有着火。我总是把它弄混@Cris e也没有在setTimeout中声明。@ps2goat是否会从setTimeout中的匿名函数内部关闭,因为setTimout在f内?@ps2goat否它没有。它说,从内部处理,这是不清楚的,没有阅读的话。如果你读的话,它是清楚的。我总是混淆@Cris e也没有在setTimeout中声明。@ps2goat是否会从setTimeout中的匿名函数内部关闭,因为setTimout在f内?@ps2goat否它没有。它说,从内部处理,这是不清楚的,没有阅读的话。如果你读这些词,它是清楚的。