Web 技术研究所

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

浏览器对子线程消息的处理差异

  HTML5中提供了Worker来创建子线程,并且能发送消息到主线程上。但是对于这个消息的归类,浏览器在实现上就有差异了。Chrome把这个消息视为普通的JavaScript消息,而Firefox和IE则把它视为系统消息。而且在Firefox中还有个重复弹出alert的BUG。
  为了做这个测试,我们先写一个子线程程序,这个程序每秒给主线程发送一个当前时间 //test.js
var t=new Date;
while(1)
  if(new Date-t>1000)
    postMessage(t=new Date);
  主线程的程序就运行这个子线程,并且让点击页面时弹出一个alert new Worker("test.js").onmessage=function(e){
  console.log(e.data);
};
onclick=function(){
  alert("暂停");
};
  那么,在alert的期间,message事件会不会触发呢?发送过来的数据会不会被输出到控制台呢?


  答案是,Firefox和IE都不会因为alert而阻止message消息,只有Chrome下阻止了。这意味着在Firefox和IE下,从子线程丢过来的message被视为系统消息,它可以在alert期间处理。而Chrome中则是JavaScript消息,它会被alert阻止。这就有效的证明了上一篇文章中提到的alert不会挂起线程。
  除了这些问题之外,在火狐中还有个特有的重复alert问题,这可以算是一个Firefox的漏洞吧。如果把上面程序中的console.log改成alert,在Firefox中alert可以被多次执行。我们可以看到的效果是页面上的alert在刷新当前时间。 new Worker("test.js").onmessage=function(e){
  alert(e.data);
};


  最后是本次测试的浏览器版本号
    IE:10.0.9200.16660
    Chrome:29.0.1547.62 m
    Firefox:23.0.1
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^