我知道并非所有放在队列中的setTimout任务都被解雇了(感谢bobnice对此发布的帖子)。但我无法理解为什么在这种情况下不会达成:
我将以下事件处理程序添加到锚链接(通过addEventListener( 'click', ...
)以试验所谓的“飞行中事件修改”:
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.
});
从处理程序内部(作为调试补丁尝试避免stackoverflow,当我无法使removeEventListener工作时 - 我忽略了将我的函数f
分配给变量)。
为什么这个setTimeout不会执行?在我的一些测试中,它从未在第一个事件的监听器内执行第二个事件的调度。
显然,setTimeout将dispatchEvent
的执行上下文放在函数f
的堆栈帧之外,因为f
在dispatchEvent
触发之前返回。
或者说,不会开火。
我想明白为什么它没有在之前版本的代码中触发。