Web Workers API
Web Worker 是在後臺執行的 JavaScript,不會影響頁面的效能。
什麼是 Web Worker?
在執行 HTML 頁面中的指令碼時,頁面會變得無響應,直到指令碼完成。
Web Worker 是一個 JavaScript,它在後臺獨立於其他指令碼執行,不會影響頁面的效能。您可以在 Web Worker 在後臺執行時繼續執行任何操作:單擊、選擇內容等。
瀏覽器支援
表格中的數字表示完全支援 Web Workers 的第一個瀏覽器版本。
Chrome 4 | IE 10 | Firefox 3.5 | Safari 4 | Opera 11.5 |
2010年1月 | 2012 年 9 月 | 2009年6月 | 2009年6月 | 2011年6月 |
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”檔案中。
let i = 0;
function timedCount() {
i ++;
postMessage(i);
setTimeout("timedCount()",500);
}
timedCount();
上面的程式碼中重要的部分是 postMessage()
方法 - 它用於將訊息釋出回 HTML 頁面。
注意:通常不使用 Web Workers 來執行如此簡單的指令碼,而是用於更耗費 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>
let w;
function startWorker() {
if (typeof(w) == "undefined") {
w = new Worker("demo_workers.js");
}
w.onmessage = function(event) {
document.getElementById("result").innerHTML = event.data;
};
}
function stopWorker() {
w.terminate();
w = undefined;
}
</script>
</body>
</html>
自己動手試一試 »
Web Workers 和 DOM
由於 Web Workers 位於外部檔案中,它們無法訪問以下 JavaScript 物件:
- window 物件
- document 物件
- parent 物件