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

时间:2011-06-07 17:11:18

标签: javascript winapi javascript-events settimeout

我正在考虑向我们的javascript实用程序断言函数添加alert()。

我们是一个ajax繁重的应用程序,我们的框架(Ext)通过使用setInterval轮询ajax响应而不是等待readystate == 4来实现ajax的方式,导致我们所有的ajax回调都在setInterval中执行堆栈上下文 - 一个异常/断言吹出它通常会无声地失败。

低级别警报()如何影响浏览器事件循环?根据定义,消息框必须允许win32事件循环泵(响应mbox按钮)。这是否意味着其他浏览器事件,如我们的框架生成的未来setIntervals,调整大小事件等,将会触发?这会给我带来麻烦吗?

IIRC:您可以使用FF2和FF3.5来查看我正在谈论的差异。

alert('1');
setTimeout(function(){alert('2');}, 10);
alert('3');

FF 3.5显示1-3-2。 FF2 [1]显示1-2& 3(2和3同时堆叠在一起)。我们可以使用从activex启动的win32 mbox在IE8中复制1-2& 3,而不是在当天给我们带来巨大威胁的警报,我想确保我们不再沿着这条路走下去

任何人都可以向我指出解释此行为的特定低级资源,这里的预期行为是什么,以及在低级别上究竟发生了什么,包括为什么行为在FF版本中发生了变化?

[1]你可以在Spoon.net上复制这个,我现在无法正常工作。我只是用FF 2.0.0.20在vm中重新编写它。

2 个答案:

答案 0 :(得分:7)

首先,javascript中的计时器不是很精确。小于30ms的间隔可能被认为是完全相同的,并且实现方式也各不相同。不要依赖任何隐式排序。

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)将通过,因此立即执行,然后设置并调用两个定时器。

  3. 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

答案 1 :(得分:1)

我无法复制1-2& 3案例,但here可以帮助您调试不同浏览器中发生的事情。