web workers各浏览器下参数传递的差异
2010-4-5
做军旗游戏时想用web workers消除计算时界面的停滞,实现了后发现在firefox下正常,但在chrome/safari下却不能用,网上关于web workers的资料太少了,也可能是因为我没找到,结果就一直debug了半天,才找出原因所在,原因就是:chrome/safari下,web worker传递的参数全都会被转换成字符串。
chrome/safari下,只能用字符串通信,无法传递其他数据,无论是数组,object,布尔值,数值,全都会被转成字符串,而在firefox下则支持所有数据类型的传递。
看这段示例代码,以下测试在firefox3.5 safari4.0.5 chrome4.1下进行:
HTML:
<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML4.0 Transitional//EN"> <html> <head> <title>Test threads fibonacci</title> </head> <body> <script type="text/javascript"> var worker = new Worker("testWorker.js"); worker.onmessage = function (event) { alert("type:" + typeof event.data); alert(event.data[1]); }; worker.postMessage([2,3]); </script> </body> </html>
testWorker.js:
onmessage = function (event) { postMessage(event.data.name); };
safari/chrome显示:type:string “,”(字符串”2,3″第二个字符)
firefox显示:type:object 3(数组第二个元素)
可以把worker.postMessage([2,3]);的参数改成其他类型试试,safari/chrome显示出来的type都是string。
写出来好简单,发现这个却花了我挺多时间,firefox对google创造出来的东西的支持比chrome还好,真是奇怪~
附:
还有一个有点难发现的错误,网上有些示例教程在写worker的内置函数时在前面加了var,这样在firefox下正常,在safari/chrome下出错:
var onmessage = function(e){ postMessage(e.data); }
正确写法是不加var
onmessage = function(e){ postMessage(e.data); }