我知道并不是所有放入队列的 setTimout 任务实际上都会被触发(感谢 bobnice 对此的帖子)。但我不明白为什么在这种情况下无法达到:
我将以下事件处理程序添加到 anchor 链接(通过 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.
});
从处理程序内部(作为调试补丁,当我无法让removeEventListener工作时尝试避免堆栈溢出——我忽略了将我的函数f
分配给变量)。
为什么这个setTimeout不执行?在我的少数测试中,它从未从第一个事件的监听器中执行第二个事件的调度。
显然,setTimeout 将 dispatchEvent
的执行上下文置于函数 f
的堆栈帧之外,因为 f
在 之前返回>dispatchEvent
触发。
或者更确切地说,不触发。
我想确切地了解为什么它在以前版本的代码中没有触发。
最佳答案
setTimeout
的超时延迟应该是第二个参数,而不是第一个!这就是它没有火的原因。
关于javascript - 事件处理程序中的 setTimeout 似乎没有触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21540220/