我正在考虑将 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)
有两种可能的结果:
您在 5 秒内关闭了警告框。接下来的两个计时器将按指定的时间间隔设置和触发。您可以看到事件循环已停止,因为无论您等待多长时间才能关闭警报,“listen”总是需要 1 秒才能执行。
您用了超过 5 秒的时间来关闭警报。第一个间隔 (bgColor) 将过去,因此它会立即执行,然后设置和调用两个计时器。
至于间隔,当事件循环停止时它也“停止时间”,所以在这种情况下:
i = 0
setInterval(function(){
document.getElementById('n').innerHTML = ++i
}, 1000)
setTimeout(function(){
alert('stop')
}, 5500)
无论您用多长时间关闭警报,下一个数字始终为 6 - setInterval
不会触发多次。
关于javascript - 了解 alert() 如何影响浏览器事件循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6269008/