这个问题与Javascript event handling and flow control有关,但它超越了一步。仍然没有答案的问题是:当一个事件被触发并且控制权返回给浏览器时,浏览器是否可以决定先处理其他事件(由其他脚本或用户操作触发)(A),或者它是否总是直接处理我的事件(B)?
这个问题很重要,因为在情况(B)中你可以依赖于在触发事件和事件处理程序之间没有任何改变的事实,而(A)不给出任何保证。
我的第一个猜测是(B),还有什么可以stopPropagation()和preventDefault()工作?但是再给它一点思考,这并不是确凿的证据。
这个问题的现实例子。我正在修改一个富文本编辑器(hallo),我希望它有这些规范:
现在,在大多数情况下,当您关闭对话框时,您希望焦点返回到#txt。但是如果打开对话框并单击页面上的其他位置,编辑器将关闭并调用工具栏,包括要关闭的对话框。如果在这种情况下对话框将焦点返回到编辑器,它将再次激活编辑器。
据我所知,事件处理顺序至少是确定性的。某些事件可能会延迟,而其他事件则会提前处理。这就是'同步'的含义。例外情况当然是加载文件等事件。
从程序组件的角度来说,说对话框,情况可能非常难以预测。它可以将处理程序绑定到open事件,然后调用dialog(“open”),但是在调用和处理程序之间可能发生任何事情,只是因为编辑器在同一事件上有一个事件处理程序。
所以我的结论是1)是的,它是可预测的但是2)它需要一个复杂的架构来实现它。
答案 0 :(得分:4)
通常,事件模型是同步的和可重入的,这意味着如果事件处理程序导致另一个事件 - 第二个事件将同步执行,并且只有在完成后第一个事件才会继续执行。
这似乎是你想要描述的,在这种情况下(B)是有保证的。