javascript - 了解 alert() 如何影响浏览器事件循环

标签 javascript winapi dom-events settimeout

我正在考虑将 alert() 添加到我们的 Javascript 实用程序断言函数中。

我们是一个 ajax 密集型应用程序,我们的框架 (Ext) 通过使用 setInterval 轮询 ajax 响应而不是等待 readystate==4 来实现 ajax 的方式,导致我们所有的在 setInterval 堆栈上下文中执行的 ajax 回调——从中爆发的异常/断言通常会静默失败。

低级 alert() 如何影响浏览器事件循环?根据定义,消息框必须允许 win32 事件循环进行抽取(以响应 mbox 按钮)。这是否意味着其他浏览器事件(例如我们的框架生成的 future setInterval、调整大小事件等)将会触发?这会给我带来麻烦吗?

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 中复制了它。

最佳答案

首先,javascript 中的计时器不是很精确。小于 30 毫秒的间隔可能被认为是相同的,并且实现会有所不同。不要依赖任何隐式排序。

alert() 将始终停止事件循环。如果事件或计时器在警报期间触发,它们将被排队并在事件循环恢复(警报框关闭)后被调用。

举个例子:

var hello = document.getElementById('hello')

setTimeout(function(){
  hello.style.backgroundColor = 'lime'
}, 5000)

alert('Stop!')

setTimeout(function(){
  hello.innerHTML = 'collaborate'
}, 20)

setTimeout(function(){
  hello.innerHTML = 'listen'
}, 1000)

有两种可能的结果:

  1. 您在 5 秒内关闭了警告框。接下来的两个计时器将按指定的时间间隔设置和触发。您可以看到事件循环已停止,因为无论您等待多长时间才能关闭警报,“listen”总是需要 1 秒才能执行。

  2. 您用了超过 5 秒的时间来关闭警报。第一个间隔 (bgColor) 将过去,因此它会立即执行,然后设置和调用两个计时器。

http://jsbin.com/iheyi4/edit

至于间隔,当事件循环停止时它也“停止时间”,所以在这种情况下:

i = 0

setInterval(function(){
  document.getElementById('n').innerHTML = ++i
}, 1000)

setTimeout(function(){
  alert('stop')
}, 5500)

无论您用多长时间关闭警报,下一个数字始终为 6 - setInterval 不会触发多次。

http://jsbin.com/urizo6/edit

关于javascript - 了解 alert() 如何影响浏览器事件循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6269008/

相关文章:

c# - 如何获取隐藏的 Excel 应用程序实例的 ProcessID (PID)

javascript - 如何获取innerHTML的id值?

javascript - 负整数在日期中如何工作?

javascript - 如何跟踪输入字段中的字符位置、删除、插入和替换?

javascript - 如何对数组中的重复项求和

c - 64 位 Windows : longjmp lands in a wrong place

javascript - 打开模式时页面滚动到顶部问题

winapi - Windows NotificationIcons 使用的正确处理 GUID 的方法

Javascript onclick事件调用对象

值更改时的Javascript文本框调用事件