HTML5 Web Workers
Web worker はバックグラウンドで実行されるJavaScriptであり、ページのパフォーマンスには影響を及ぼしません。
何が Web Worker ですか?
HTMLページでスクリプトを実行すると、スクリプトが完了するまでページの状態は応答不能になります。
Web worker はバックグラウンドで実行される独立したJavaScriptで、他のスクリプトとは独立しており、ページのパフォーマンスには影響を与えません。Web worker がバックグラウンドで動作している間でも、クリックやコンテンツの選択など、何でもできます。
ブラウザのサポート
Web workers は以下のブラウザでサポートされています:
ブラウザ | バージョン |
---|---|
Internet Explorer | 10+ |
Firefox | すべてのバージョン |
Chrome | すべてのバージョン |
Safari | すべてのバージョン |
Opera | すべてのバージョン |
HTML5 Web Workers の例
以下の例では、バックグラウンドでカウントを行うシンプルなWeb workerを作成します:
<body>
<p>カウント: <output id="result"></output></p>
<button onclick="startWorker()">働き始める</button>
<button onclick="stopWorker()">仕事をやめる</button>
<p><strong>注:</strong> Internet Explorer 9 以前の IE ブラウザは Web ワーカーをサポートしていません。</p>
<script>
var w;
function startWorker() {
if(typeof(Worker) !== "undefined") {
if(typeof(w) == "undefined") {
w = new Worker("demo.js");
}
w.onmessage = function(event) {
document.getElementById("result").innerHTML = event.data;
};
} else {
document.getElementById("result").innerHTML = "申し訳ありませんが、お使いのブラウザは Web Workers をサポートしていません...";
}
}
function stopWorker()
{
w.terminate();
w = undefined;
}
</script>
</body>
注意: Internet Explorer 9 およびそれ以前のバージョンのブラウザは Web Workers をサポートしていません。
ブラウザが Web Worker をサポートしているかを調べる
Web worker を作成する前に、ユーザーのブラウザがサポートしているかどうかを調べます:
if (typeof(Worker) !== "undefined") { // はい! Web worker サポートあり! // いくつかのコード..... } else { // 申し訳ありません! Web Worker 未対応 }
Web Worker ファイルを作成する
外部のJavaScriptファイルにWeb workerを作成します。以下に示すのは "demo.js" ファイルのカウントスクリプトです:
var i = 0; function timedCount() { i = i + 1; postMessage(i); setTimeout("timedCount()", 500); } timedCount();
上記コードの重要な部分は postMessage() メソッドです。これは HTML ページにメッセージを返送するために使用されます。
注: web workerは通常、このような単純なスクリプトではなく、よりCPUリソースを消費するタスクに使用されます。
Web Worker オブジェクトを作成する
すでにWeb worker ファイルがあるので、次はHTMLページからこれを呼び出す必要があります。
次のコードは worker の存在を確認し、存在しない場合は新しいWeb workerオブジェクトを作成し、"demo_workers.js" のコードを実行します:
if (typeof(w) == "undefined") { w = new Worker("demo.js"); }
次に、Web worker からメッセージを受信するために "onmessage" イベントリスナーを追加します:
w.onmessage = function(event) { document.getElementById("result").innerHTML = event.data; };
Web Worker の終了
Web workerオブジェクトを作成すると、それが終了されるまで、メッセージのリスニングを続けます。Web worker を終了してブラウザやコンピュータのリソースを解放するには、terminate() メソッドを使用します:
w.terminate();
完全な Web Worker の例
以下は .js ファイル内の Worker コードを含む完全なHTMLページのコードです:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>HTML5 Web Workers</title>
</head>
<body>
<p>カウント: <output id="result"></output></p>
<button onclick="startWorker()">開始 Worker</button>
<button onclick="stopWorker()">停止 Worker</button>
<p><strong>注意:</strong> Internet Explorer 9 及びそれ以前のバージョンのブラウザは Web Workers をサポートしていません。</p>
<script>
var w;
function startWorker() {
if (typeof(Worker) !== "undefined") {
if (typeof(w) == "undefined") {
w = new Worker("demo.js");
}
w.onmessage = function(event) {
document.getElementById("result").innerHTML = event.data;
};
} else {
document.getElementById("result").innerHTML = "申し訳ありませんが、あなたのブラウザはWeb Workersをサポートしていません...";
}
}
function stopWorker() {
w.terminate();
w = undefined;
}
</script>
</body>
</html>
Web Workers と DOM
Web worker は外部ファイルであるため、以下のJavaScriptオブジェクトにはアクセスできません:
- window オブジェクト
- document オブジェクト
- parent オブジェクト
QAセクション
Q1: Web worker はどのようにしてメッセージをHTMLページに送信しますか?
A1: postMessage() メソッドを使用してメッセージを送信します。このメッセージはHTMLページのonmessageイベントで受け取られます。
Q2: Web worker はどのブラウザでサポートされていますか?
A2: Web workers は Internet Explorer 10以上、すべての最新の Firefox, Chrome, Safari および Opera でサポートされています。
Q3: Web worker を終了するにはどうすればよいですか?
A3: terminate() メソッドを使用してWeb workerを終了し、ブラウザやコンピュータのリソースを解放できます。