HTML Web Workers API
Web Worker 是一種在後臺執行的 JavaScript,不影響頁面效能。
什麼是 Web Worker?
在 HTML 頁面中執行指令碼時,頁面會變得無響應,直到指令碼完成。
Web Worker 是一種在後臺執行的 JavaScript,獨立於其他指令碼,不影響頁面效能。您可以繼續做任何您想做的事情:點選、選擇等等,而 Web Worker 在後臺執行。
瀏覽器支援
表中數字指定了完全支援 Web Workers 的第一個瀏覽器版本。
API | |||||
---|---|---|---|---|---|
Web Workers | 4.0 | 10.0 | 3.5 | 4.0 | 11.5 |
HTML Web Workers 示例
以下示例建立了一個簡單的 Web Worker,用於在後臺計數
檢查 Web Worker 支援
在建立 Web Worker 之前,請檢查使用者的瀏覽器是否支援它
if (typeof(Worker) !== "undefined") {
// 是的!支援 Web Worker!
// 一些程式碼.....
} else {
// 抱歉!不支援 Web Worker..
}
建立 Web Worker 檔案
現在,讓我們在外部 JavaScript 中建立我們的 Web Worker。
在這裡,我們建立一個計數指令碼。該指令碼儲存在 "demo_workers.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_workers.js");
}
然後我們可以從 Web Worker 傳送和接收訊息。
為 Web Worker 新增一個 "onmessage" 事件監聽器。
w.onmessage = function(event){
document.getElementById("result").innerHTML = event.data;
};
當 Web Worker 釋出訊息時,事件監聽器中的程式碼將被執行。來自 Web Worker 的資料儲存在 event.data 中。
終止 Web Worker
建立 Web Worker 物件後,它將繼續監聽訊息(即使外部指令碼已完成),直到被終止。
要終止 Web Worker 並釋放瀏覽器/計算機資源,請使用 terminate()
方法
w.terminate();
重用 Web Worker
如果您在終止 Worker 變數後將其設定為 undefined,則可以重用程式碼
w = undefined;
完整的 Web Worker 示例程式碼
我們已經看到了 .js 檔案中的 Worker 程式碼。下面是 HTML 頁面的程式碼
示例
<!DOCTYPE html>
<html>
<body>
<p>計數: <output id="result"></output></p>
<button onclick="startWorker()">啟動 Worker</button>
<button onclick="stopWorker()">停止 Worker</button>
<script>
var w;
function startWorker() {
if (typeof(Worker) !== "undefined") {
if (typeof(w) == "undefined") {
w = new Worker("demo_workers.js");
}
w.onmessage = function(event) {
document.getElementById("result").innerHTML = event.data;
};
} else {
document.getElementById("result").innerHTML = "抱歉!不支援 Web Worker。";
}
}
function stopWorker() {
w.terminate();
w = undefined;
}
</script>
</body>
</html>
自己動手試一試 »
Web Workers 和 DOM
由於 Web Worker 位於外部檔案中,它們無法訪問以下 JavaScript 物件
- window 物件
- document 物件
- parent 物件