# HTML 5 Web Workers
**web worker 是運行在后臺的 JavaScript,不會影響頁面的性能。**
## 什么是 Web Worker?
當在 HTML 頁面中執行腳本時,頁面的狀態是不可響應的,直到腳本已完成。
web worker 是運行在后臺的 JavaScript,獨立于其他腳本,不會影響頁面的性能。您可以繼續做任何愿意做的事情:點擊、選取內容等等,而此時 web worker 在后臺運行。
## 瀏覽器支持
所有主流瀏覽器均支持 web worker,除了 Internet Explorer。
## HTML5 Web Workers 實例
下面的例子創建了一個簡單的 web worker,在后臺計數:
計數:
<button onclick="startWorker()" style="font:12px Verdana, Arial, Helvetica, sans-serif;">啟動 Worker</button> <button onclick="stopWorker()" style="font:12px Verdana, Arial, Helvetica, sans-serif;">停止 Worker</button>
<script>var w; function startWorker() { if(typeof(Worker)!=="undefined") { if(typeof(w)=="undefined") { w=new Worker("/example/html5/demo_workers.js"); } w.onmessage = function (event) { document.getElementById("result").innerHTML=event.data; }; } else { document.getElementById("result").innerHTML="Sorry, your browser does not support Web Workers..."; } } function stopWorker() { w.terminate(); }</script>
## 檢測 Web Worker 支持
在創建 web worker 之前,請檢測用戶的瀏覽器是否支持它:
```
if(typeof(Worker)!=="undefined")
{
// Yes! Web worker support!
// Some code.....
}
else
{
// Sorry! No Web Worker support..
}
```
## 創建 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 傳遞消息時,會執行事件監聽器中的代碼。event.data 中存有來自 event.data 的數據。
## 終止 Web Worker
當我們創建 web worker 對象后,它會繼續監聽消息(即使在外部腳本完成之后)直到其被終止為止。
如需終止 web worker,并釋放瀏覽器/計算機資源,請使用 terminate() 方法:
```
w.terminate();
```
## 完整的 Web Worker 實例代碼
我們已經看到了 .js 文件中的 Worker 代碼。下面是 HTML 頁面的代碼:
### 實例
```
<!DOCTYPE html>
<html>
<body>
<p>Count numbers: <output id="result"></output></p>
<button onclick="startWorker()">Start Worker</button>
<button onclick="stopWorker()">Stop Worker</button>
<br /><br />
<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="Sorry, your browser
does not support Web Workers...";
}
}
function stopWorker()
{
w.terminate();
}
</script>
</body>
</html>
```
## Web Workers 和 DOM
由于 web worker 位于外部文件中,它們無法訪問下例 JavaScript 對象:
* window 對象
* document 對象
* parent 對象
- HTML 基礎
- HTML 簡介
- 基本的 HTML 標簽 - 四個實例
- HTML 元素
- HTML 屬性
- HTML 標題
- HTML 段落
- HTML 文本格式化
- HTML 編輯器
- HTML CSS
- HTML 鏈接
- HTML 圖像
- HTML 表格
- HTML 列表
- HTML <div> 和 <span>
- HTML 布局
- HTML 表單和輸入
- HTML 框架
- HTML Iframe
- HTML 背景
- HTML 顏色
- HTML 顏色名
- HTML 4.01 快速參考
- HTML 高級
- HTML <!DOCTYPE>
- HTML 頭部元素
- HTML 腳本
- HTML 字符實體
- HTML 統一資源定位器
- HTML URL 字符編碼
- HTML Web Server
- HTML 媒體
- HTML 多媒體
- HTML Object 元素
- HTML 音頻
- HTML 視頻
- HTML XHTML
- XHTML 簡介
- XHTML - 元素
- XHTML - 屬性
- HTML 5 教程
- HTML 5 簡介
- HTML 5 視頻
- HTML 5 Video + DOM
- HTML 5 音頻
- HTML 5 拖放
- HTML 5 Canvas
- HTML5 內聯 SVG
- HTML 5 Canvas vs. SVG
- HTML5 地理定位
- HTML 5 Web 存儲
- HTML 5 應用程序緩存
- HTML 5 Web Workers
- HTML 5 服務器發送事件
- HTML5 Input 類型
- HTML5 表單元素
- HTML5 表單屬性
- CSS 基礎
- CSS 簡介
- CSS 基礎語法
- CSS 高級語法
- CSS 派生選擇器
- CSS id 選擇器
- CSS 類選擇器
- CSS 屬性選擇器
- 如何創建 CSS
- CSS 樣式
- CSS 背景
- CSS 文本
- CSS 字體
- CSS 鏈接
- CSS 列表
- CSS 表格
- CSS 輪廓
- CSS 框模型
- CSS 框模型概述
- CSS 內邊距
- CSS 邊框
- CSS 外邊距
- CSS 外邊距合并
- CSS 定位
- CSS 定位 (Positioning)
- CSS 相對定位
- CSS 絕對定位
- CSS 浮動
- CSS 選擇器
- CSS 元素選擇器
- CSS 分組
- CSS 類選擇器詳解
- CSS ID 選擇器詳解
- CSS 屬性選擇器詳解
- CSS 后代選擇器
- CSS 屬性選擇器詳解
- CSS 后代選擇器
- CSS 子元素選擇器
- CSS 相鄰兄弟選擇器
- CSS 偽類 (Pseudo-classes)
- CSS 偽元素 (Pseudo-elements)
- CSS 高級
- CSS 水平對齊
- CSS 尺寸 (Dimension)
- CSS 分類 (Classification)
- CSS 導航條
- CSS 圖片庫
- CSS 圖像透明度
- CSS2 媒介類型
- CSS 注意事項
- CSS3 教程
- CSS3 簡介
- CSS3 邊框
- CSS3 背景
- CSS3 文本效果
- CSS3 字體
- CSS3 2D 轉換
- CSS3 3D 轉換
- CSS3 過渡
- CSS3 動畫
- CSS3 多列
- CSS3 用戶界面
- Firebug 教程
- Firebug 教程
- 使用Firebug查看和編輯HTML和CSS
- 使用 Firebug 調試 JavaScript
- Firebug頁面概況查看
- Firebug動態執行JavaScript
- Firebug記錄Javascript日志
- Firebug監控網絡情況
- 免責聲明