【发布时间】:2011-06-07 17:11:17
【问题描述】:
我正在考虑将alert() 添加到我们的 Javascript 实用程序断言函数中。
我们是一个 ajax-heavy 应用程序,我们的框架 (Ext) 通过使用 setInterval 轮询 ajax 响应而不是等待 readystate==4 来实现 ajax,导致我们所有的 ajax 回调在一个setInterval 堆栈上下文——以及一个异常/断言吹出它通常会静默失败。
低级 alert() 如何影响浏览器事件循环?根据定义,消息框必须允许 win32 事件循环进行泵送(以响应 mbox 按钮)。这是否意味着其他浏览器事件,例如由我们的框架生成的未来setIntervals、调整大小事件等,将会触发?这会给我带来麻烦吗?
IIRC:你可以使用 Firefox2 和 Firefox3.5 来看看我说的区别。
alert('1');
setTimeout(function(){alert('2');}, 10);
alert('3');
Firefox3.5 显示 1-3-2。 Firefox2[1] 显示 1-2&3(2 和 3 同时堆叠在一起)。我们也可以使用从 ActiveX 启动的 win32 mbox 在 IE8 中复制 1-2&3,而不是发出警报,这在当天对我们造成了严重破坏,我想确保我们不会再走这条路。
谁能指出具体的低级资源来解释这种行为,这里的预期行为是什么,以及低级到底发生了什么,包括为什么行为在 Firefox 版本之间发生变化?
[1] 你可以在 Spoon.net 上复制这个,我现在无法工作。我刚刚在带有 Firefox 2.0.0.20 的 VM 中复制了它。
【问题讨论】:
-
很好的问题。以我的经验,
alert的实现在不同的浏览器中差别很大。一般来说,我会避免alert这些事情很重要,并使用自定义(即 jQuery UI 样式)对话框。 -
@Oliver -- 是的,我们实际上选择使用基于 DOM 的弹出窗口,但我仍然想了解警报的内部结构。
-
“根据定义,消息框必须允许 win32 事件循环泵送”——某些操作系统——例如 Mac OS X——使用嵌套事件循环。警报可能会运行自己的modal event loop,它会阻塞主事件循环。一些网络浏览器可能会为对话框做类似的事情。
标签: javascript winapi dom-events settimeout