好吧,这实际上取决于您在处理程序中做什么以及如何定义第一个处理程序结束时刻?
例如,如果您只在 eventHandler1 中执行同步操作,那么您确定 eventHandler2 在 eventHandler1 完成之前不会被触发。原因是javascript是单线程的。
但是,想象一下这样的场景:点击 button1 会触发 eventHandler1,它实际上会发出 ajax 请求。在那种情况下,您实际上认为什么是“eventHandler1 的结束”?如果是 ajax 请求返回的那一刻,那么 eventHandler2 肯定会在 eventHandler1 完成之前开始(并且可能结束)执行。
简而言之:每当您执行仅同步操作时,都会保证顺序。
从评论中添加:
http://www.w3.org/TR/DOM-Level-3-Events/#sync-async例如,它说:“这个虚拟队列中的每个事件都必须延迟,直到前一个事件完成其传播行为,或被取消。”
好吧,现在我们回到“我们在谈论什么类型的事件”这个问题?如前所述:如果它是异步事件,则确保不能保证顺序。但最初的困境是关于点击事件,而那个不是异步的,而是同步的。对于同步事件文档明确指出:必须将同步事件(“同步事件”)视为它们在先进先出模型中的虚拟队列中,按时间发生顺序排序,关于其他事件、DOM 中的更改以及用户交互。
是的,没有保证。现在添加 javascript 是单线程的,你不能让它们同时执行。但是,是的,严格来说 DOM - 无法保证之前会发生哪一个。
再加一条评论……您可能拥有完全相同的 DOM,但可以从 Java 多线程环境中访问。然后呢?:) 那么您必须实现自己的线程安全异步事件处理,因为您不再像使用 javascript 那样受到单线程环境的“保护”。所以,我看到的结论是 DOM 规范确实要求同步事件是 fifo 实现的。异步事件的执行取决于堆栈/线程实现。在 Javascript 中,这意味着 2 个处理程序不能重叠,但在 Java 中,例如不一定意味着。