Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

alert对计时器的阻断差异

  由于一些底层的实现没有规范约束,alert方法对计时器方法的阻断方式在Chrome、Firefox、IE上都不同。虽然在一般情况下使用没有太大影响(一般的项目也不会用alert这种东西),但为了做一些代码优化,了解这些差异还是很有必要的。
  下面这个代码的运行结果在三大主流浏览器上的结果都不同 <script>
setTimeout(function(){
  console.timeEnd("500~1000");
},1000);
setTimeout(function(){
  console.timeEnd("0~500");
  alert("等待1秒后再点确定");
  console.time("500~1000");
},500);
alert("等待1秒后再点确定");
console.time("0~500");
</script>

  Chrome的处理方式是alert会阻断计时。也就是说,alert对话框弹出期间,setTimeout不会计时。所以上面的测试第一次弹出对话框时计时器不计时。从关闭第一个对话框后开始计时,直到500ms的setTimeout回调被执行将近耗时500ms。然后第二个对话框关闭后开始计时,直到1000ms的setTimeou回调被执行也将近耗时500ms。这个结果还是可以接受的。
  IE的处理方式是alert不会阻断计时,严格按照消息顺序执行计时器回调。在第一个对话框弹出之前,两个setTimeout已经被调用了。第一个对话框弹出后,等待1秒再关闭的话前面设置的两个计时器已经期满。所以如果此时关闭第一个对话框的话会瞬间弹出第二个对话框,这期间耗时很短。第二个对话框再关闭的话最后一个setTimeout也是瞬间被执行,这期间耗时同样很短。我觉得这个逻辑是最靠谱的。
  Firefox的处理方式也是alert不阻断计时器,但计时器本身不会按照消息顺序来调用,结果是不可预料的。第一个对话框弹出后的等待过程中,两个计时器都期满。而第一个对话框关闭之后执行完后面的代码,当前消息结束。此时要处理期满的计时器,但它未必会像IE一样总是优先处理先达到期满的计时器。两个达到期满的计时器在Firefox看来是一样的,所以两个计时器的执行顺序是不可预料的。我觉得这个处理方式是最有问题的,或者算是个BUG吧,反正我接受不了。
  我希望有个规范,能把这个结果统一为IE或Chrome目前的处理方式。当然,这方面的问题远不止这些,这个现象只是冰山一角。
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^