HTML5之Worker用法

HTML5提供了Worker类用于多线程处理。Worker是在UI主线程中创建,后台执行的一段js脚本,它通过消息与UI线程传递数据。使用Worker就3步:

cheungmine 2011-11-29

第1步:创建一个Worker,需要指定一个js文件,作为Worker线程的执行体:

var worker = new Worker(“worker.js”);

第2步:给Worker实例指定消息处理函数,只有2个:onmessage ,onerror
worker.onmessage = function (event) {
// update UI here
var t1 = new Date().getTime();
elemById(“_time”).value = t1 – t0;
elemById(“_piValue”).value = event.data;
};

worker.onerror = function (event) {
alert(event.message);
};

第3步:给worker发消息:postMessage。

elemById(“_time”).value = “-”;
t0 = new Date().getTime();
worker.postMessage(parseInt(elemById(“_num_rects”).value));

 

下面以一个具体的例子来说明Worker的用法。这个例子是用数值积分的方法求pi=(3.1415926….)的。worker.js就是做这个工作。

 

  1. // worker.js
  2. //   calculate pi using numerical integration
  3. // 2011-11, cheungmine
  4. self.onmessage = function (event) {
  5. // numerical integration to calc pi
  6. var num_rects = event.data;
  7. var width = 1.0/num_rects;
  8. var mid;
  9. var height;
  10. var sum = 0.0;
  11. var area;
  12. for (var i=0; i<num_rects; i++) {
  13. mid = (i+0.5) * width;
  14. height = 4.0/(1.0+mid*mid);
  15. sum += height;
  16. }
  17. area = width*sum; // area=pi
  18. // post message back to UI thread
  19. self.postMessage(area);
  20. };

// worker.js // calculate pi using numerical integration // 2011-11, cheungmine self.onmessage = function (event) { // numerical integration to calc pi var num_rects = event.data; var width = 1.0/num_rects; var mid; var height; var sum = 0.0; var area; for (var i=0; i<num_rects; i++) { mid = (i+0.5) * width; height = 4.0/(1.0+mid*mid); sum += height; } area = width*sum; // area=pi // post message back to UI thread self.postMessage(area); }; HTML5主页面js-test.html如下:

 

 

  1. <!doctype html>
  2. <html lang=“en”>
  3. <head>
  4. <meta charset=“UTF-8″>
  5. <title>js-test.html</title>
  6. <script type=“text/javascript”>
  7. function elemById(id) {
  8. return document.getElementById(id);
  9. }
  10. function getBrowserAgent() {
  11. var browser = “$”;
  12. if ((navigator.userAgent.indexOf(‘MSIE’) >= 0) &&
  13. (navigator.userAgent.indexOf(‘Opera’) < 0)){
  14. browser = “$IE”;
  15. }
  16. else if (navigator.userAgent.indexOf(‘Firefox’) >= 0){
  17. browser = “$FIREFOX”;
  18. }
  19. else if (navigator.userAgent.indexOf(‘Opera’) >= 0){
  20. browser = “$OPERA”;
  21. }
  22. else if (navigator.userAgent.indexOf(‘Chrome’) >= 0){
  23. browser = “$CHROME”;
  24. }
  25. return browser;
  26. }
  27. var browser = getBrowserAgent();
  28. window.addEventListener(‘load’,
  29. function () {
  30. if (browser==”$IE”) {
  31. // MSIE
  32. if (window.confirm(“IE does not support HTML5 currently.\n”+
  33. “please use lastest FireFox, Chrome or Opera!\n”+
  34. “if you havenot any of them installed,\n”+
  35. “please click OK to enter download page.”)) {
  36. window.location.replace(“selbrowser.html”);
  37. }
  38. else {
  39. window.close();
  40. }
  41. }
  42. else if (browser==”$FIREFOX”||browser==”$CHROME”) {
  43. // do stuff for FireFox and Chrome
  44. }
  45. else {
  46. // do stuff for others
  47. }
  48. initPage();
  49. },
  50. false
  51. );
  52. var dt = new Date();
  53. var t0 = 0;
  54. function initPage () {
  55. // onclick
  56. elemById(“_piWorker”).addEventListener(‘click’,
  57. function(){
  58. var worker = new Worker(“worker.js”);
  59. worker.onmessage = function (event) {
  60. // update UI here
  61. var t1 = new Date().getTime();
  62. elemById(“_time”).value = t1 - t0;
  63. elemById(“_piValue”).value = event.data;
  64. };
  65. worker.onerror = function (event) {
  66. alert(event.message);
  67. };
  68. elemById(“_time”).value = “-”;
  69. t0 = new Date().getTime();
  70. worker.postMessage(parseInt(elemById(“_num_rects”).value));
  71. },
  72. false
  73. );
  74. }
  75. </script>
  76. </head>
  77. <body>
  78. <p>Press button ”calc” to get pi</p>
  79. <p>
  80. <input type=“input” size=“10″ id=“_num_rects” value=“100000000″>
  81. <input type=“button” id=“_piWorker” value=“calc”>
  82. pi=<input type=“input” size=“30″ id=“_piValue” value=“”>
  83. time elapsed: <input type=“input” size=“10″ id=“_time” value=“-”>
  84. </p>
  85. </body>
  86. </html>

<!doctype html> <html lang=”en”> <head> <meta charset=”UTF-8″> <title>js-test.html</title> <script type=”text/javascript”> function elemById(id) { return document.getElementById(id); } function getBrowserAgent() { var browser = “$”; if ((navigator.userAgent.indexOf(‘MSIE’) >= 0) && (navigator.userAgent.indexOf(‘Opera’) < 0)){ browser = “$IE”; } else if (navigator.userAgent.indexOf(‘Firefox’) >= 0){ browser = “$FIREFOX”; } else if (navigator.userAgent.indexOf(‘Opera’) >= 0){ browser = “$OPERA”; } else if (navigator.userAgent.indexOf(‘Chrome’) >= 0){ browser = “$CHROME”; } return browser; } var browser = getBrowserAgent(); window.addEventListener(‘load’, function () { if (browser==”$IE”) { // MSIE if (window.confirm(“IE does not support HTML5 currently.\n”+ “please use lastest FireFox, Chrome or Opera!\n”+ “if you havenot any of them installed,\n”+ “please click OK to enter download page.”)) { window.location.replace(“selbrowser.html”); } else { window.close(); } } else if (browser==”$FIREFOX”||browser==”$CHROME”) { // do stuff for FireFox and Chrome } else { // do stuff for others } initPage(); }, false ); var dt = new Date(); var t0 = 0; function initPage () { // onclick elemById(“_piWorker”).addEventListener(‘click’, function(){ var worker = new Worker(“worker.js”); worker.onmessage = function (event) { // update UI here var t1 = new Date().getTime(); elemById(“_time”).value = t1 – t0; elemById(“_piValue”).value = event.data; }; worker.onerror = function (event) { alert(event.message); }; elemById(“_time”).value = “-”; t0 = new Date().getTime(); worker.postMessage(parseInt(elemById(“_num_rects”).value)); }, false ); } </script> </head> <body> <p>Press button “calc” to get pi</p> <p> <input type=”input” size=”10″ id=”_num_rects” value=”100000000″> <input type=”button” id=”_piWorker” value=”calc”> pi=<input type=”input” size=”30″ id=”_piValue” value=”"> time elapsed: <input type=”input” size=”10″ id=”_time” value=”-”> </p> </body> </html>

 

如果用户不小心用IE打开了主页面,我们需要提示用户目前IE还干不了这个活,下面的是下载支持HTML5的浏览器页面selbrowser.html:

 

  1. <html>
  2. <head>
  3. <title>selbrowser.html</title>
  4. </head>
  5. <body>
  6. <p><h4>Download the lastest HTML5 browser!</h4></p>
  7. <table align=“center”>
  8. <tr>
  9. <td width=“200″><a href=“http://www.mozilla.org/en-US/firefox/all.html”><h3>Mozilla FireFox</h3></a></td>
  10. <td width=“200″><a href=“http://www.google.cn/chrome/eula.html?hl=zh-CN&platform=win”><h3>Google Chrome</h3></a></td>
  11. <td width=“200″><a href=“http://www.opera.com/download/”><h3>Opera</h3></a></td>
  12. </table>
  13. </body>
  14. </html>

<html> <head> <title>selbrowser.html</title> </head> <body> <p><h4>Download the lastest HTML5 browser!</h4></p> <table align=”center”> <tr> <td width=”200″><a href=”http://www.mozilla.org/en-US/firefox/all.html”><h3>Mozilla FireFox</h3></a></td> <td width=”200″><a href=”http://www.google.cn/chrome/eula.html?hl=zh-CN&platform=win”><h3>Google Chrome</h3></a></td> <td width=”200″><a href=”http://www.opera.com/download/”><h3>Opera</h3></a></td> </table> </body> </html>
好,全齐了。把上面3个文件放到同一个目录如:C:/myJSP/test下面:

 

test/js-test.html

test/worker.js

test/selbrowser.html

使用FireFox直接打开file:///C:/myJSP/test/js-test.html即可。目前FireFox8不支持http://localhost:8080/myJSP/test/js-test.html,会报Could not load domain错误。

但是FireFox Aurora支持,只是Worker计算速度超慢。

目前Chrome不支持Worker直接用file:///C:/myJSP/test/js-test.html方式打开,会报Uncaught Error: SECURITY_ERR: DOM Exception 18。

可以使用Chrome以http://localhost:8080/myJSP/test/js-test.html方式打开。需要建一个本地http server,如tomcat。

Opera两种方式都支持。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值