2010年6月1日火曜日

HTML5のWeb Workersを使ってみた

Web WorkersはJavaScriptをバックグラウンドで動かすことができる仕組みです!

バックグラウンドで動くことができるので、重たい処理をJavaScriptで処理させてもブラウザが固まらない!っていうメリットがあります。
使い方によっては、めちゃくちゃ便利だと思います。

ただし、WebWorkersからはDOMを操作ができないので注意!
やらないと思うが、alertも使えないので気をつけてください!

■サンプル1
バックグラウンドで、ひたすらカウントアップした結果を返し表示するだけ
サンプル

-index.html
  1. <!DOCTYPE html>  
  2. <html>  
  3. <head>  
  4. <script type="text/javascript">  
  5. var init = function() {  
  6. var worker = new Worker('worker.js');           //①  
  7. worker.onmessage = function(event) {    //②  
  8. document.getElementById('hoge').innerHTML = event.data;  //③  
  9. };  
  10. }  
  11. </script>  
  12. </head>  
  13. <body onload="init();">  
  14. <div id="hoge"></div>  
  15. </body>  
  16. </html>  


-worker.js
  1. var count = 0;  
  2. setInterval(function() {  
  3. postMessage('hoge' + count++);  
  4. }, 1000);  


■解説
①バックグラウンドで実行したいJavaScript(Worker)を指定する
②Workerからのメッセージが送信された際に実行されるイベントを登録する。
③Workerから受け取ったメッセージのデータを取得し、表示させる。
以上が簡単な使い方です!


■サンプル2
バックグラウンドで実行されるWorkerに引数を渡して、それに応じて値を返してもらう
一応、四則演算の結果を返すサンプルにしています。

-index.html
  1. <!DOCTYPE html>  
  2. <html>  
  3. <head>  
  4. <script type="text/javascript">  
  5. var hoge = function() {  
  6. var worker = new Worker('worker.js');  
  7. var json = '{';  
  8. json += 'num1:' + document.getElementById('num1').value;  
  9. json += ',op:"' + document.getElementById('op').value + '"';  
  10. json += ',num2:' + document.getElementById('num2').value;  
  11. json += '}';  
  12. worker.postMessage(json);  
  13. worker.onmessage = function(event) {  
  14. document.getElementById('result').innerHTML = event.data;  
  15. };  
  16. }  
  17. </script>  
  18. </head>  
  19. <body>  
  20. <form onsubmit="hoge(); return false;">  
  21. <input type="number" id="num1">  
  22. <select id="op">  
  23. <option value="+">+</option>  
  24. <option value="-">-</option>  
  25. <option value="*">*</option>  
  26. <option value="/">/</option>  
  27. </select>  
  28. <input type="number" id="num2">  
  29. =<span id="result"></span>  
  30.   
  31.   
  32. <input type="submit" />  
  33. </form>  
  34. </body>  
  35. </html>  


-worker.js
  1. var onmessage = function(event) {  
  2. var data = eval('(' + event.data + ')');  
  3. var num1 = data.num1;  
  4. var num2 = data.num2;  
  5. var op = data.op;  
  6. var result;  
  7. switch (op) {  
  8. case '+':  
  9. result = num1 + num2;  
  10. break;  
  11. case '-':  
  12. result = num1 - num2;  
  13. break;  
  14. case '*':  
  15. result = num1 * num2;  
  16. break;  
  17. case '/':  
  18. result = num1 / num2;  
  19. break;  
  20. default :  
  21. result = 'err';  
  22. }  
  23. //試しに、重たい処理をやらせてみる  
  24. var count = 0;  
  25. for(var i = 0; i < 1000000000; i++) {  
  26. count += i;  
  27. }  
  28. postMessage(result);  
  29. };  
■解説 ①Workerに対して、データを送信する。 ②WorkerがpostMessageをした場合に呼ばれる。 Workerには無駄にカウントアップする処理が含まれている、 通常ならブラウザがロックされてしまい、スクロールができなくなる。 でも、今回はWorkerを使用しているのでDOM側がロックされる事がない。 試しにサンプル画面でスクロールをして見てください。

0 件のコメント:

コメントを投稿