javascript - 事件处理程序中的 setTimeout 似乎没有触发

标签 javascript events

我知道并不是所有放入队列的 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/

相关文章:

c# - Java 中 C# 事件的替代

java - 通过LAN网络(java)发送和监听swing事件?

cocoa - NSColorWell 子类未获取 mouseMoved 事件

javascript - 为什么使用 MooTools 定义伪事件时,Firefox 中的事件未定义?

javascript - Socket.io 在生产环境中不起作用

javascript - 展开运算符+keys()方法: Add additional value

javascript - 在 WebView 中加载使用 Javascript 的 HTML 文件

javascript - 检查其中一个 li 是否没有类(class)

javascript - ReactJs setState 更改数组中对象的属性

excel - VBA Excel-如何使用 MS Excel 关闭中的取消按钮?