Web Workers 是 HTML5 提供的一個javascript多執行緒解決方案,我們可以將一些大計算量的程式碼交由web Worker運行而不凍結使用者介面。
一:如何使用Worker
Web Worker的基本原理就是在當前javascript的主線程中,使用Worker類加載一個javascript文件來開闢一個新的線程,起到互不阻塞執行的效果,並且提供主線程和新線程之間數據交換的介面:postMessage,onmessage。
那麼如何使用呢,我們看一個例子:
- //worker.js
- onmessage =function (evt){
- var d = evt.data;//透過evt. 🎜> postMessage( d );
- //將取得的資料傳送會主執行緒 }
- HTML>
- html>
- 跨度 樣式 樣式 樣式 >樣式「寬度:自動;高度:自動;浮動:無;」 id=「20_nwp=「20_nwp 🎜>>a 樣式=樣式="文字裝飾:無; " mpid="20" 目標 目標目標目標> "_blank" href="http://cpro.baidu.com/ cpro/ui uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=619521ab1ccffd45&k=head&k0=head&kdi0=0&luki=6&n=100&k=head&k0=head&kdi0=0&luki=6&n=10&p id=1&sid=45fdcf1cab219561&ssp2= 1&stid=0&t= tpclicked3_hc&tu=u1922429&u=http://www.admin10000.com/document/1183.html&urlid=0" id id id >>🎜>> ">跨度 樣式=“顏色:#0000ff;字體大小:14px;寬度:自動;高度:自動;浮動:無;”
- >頭 頭 頭 頭 頭 頭 頭 span>a>跨度跨度>> 元 http-equiv類型" 內容="text/html; charset=utf-8"/
- 腳本 類型="text/類型="text/類型="text// 🎜>跨度 style="寬度: 自動; 高度:自動; 浮動:無;」idid =“21_nwp”> a 樣式 ="文字裝飾:無;" mpid="21" 目標="_blank" ref > >"http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di= 128&fv=0&is_app=0&jk=619521ab1ccffd45&java=kdf45&pscript=k000&p baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=45fdcf1cab219561&ssp2=1&stid=0&t =tpclicked3_hc&tu=u1922429&stid=0&t =tpclicked3_hc&tu=u1922429&stid=http://www.D.com id="21_nwl">< ;跨度< ;跨度< ;跨度< ;跨度< ;跨度< ;跨度< ; 跨度
- < ; 跨距>樣式
- ="顏色:#0000ff;字體大小:14px;寬度:自動;高度:自動;浮動:無;「>javascript 跨度
- > aa 跨度>「> 🎜>> 🎜> //WEB頁面主執行緒 var worker =new Worker("worker.js"); /M它將在新線程中執行的腳本的URL worker.postMessage(「你好世界」); //傳送資料
- worker.onmessage =function(evt){ 跨度 樣式=「寬度:自動;高度:自動浮動:無; " id="22_nwp">> a 樣式=「文字裝飾:無;」 >="22" 目標="_blank" >href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch =0&di=128&fv =0&is_app=0&jk=619521ab1ccffd45&k=����&k0=����&kdi0=0&luki=2&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_1006010000 tpclicked3_hc&tu=u1922429&u=http :// www.admin10000.com/document/1183.html&urlid=0" id="2="222_nwl 跨度 樣式="顏色:0000:000:000:000:000:000:000:000:000:000? 14px;width:auto;height:auto;float:n;">函數跨度 >a>跨度 >
- console.log(evt.跨度 樣式= 「寬度:自動;高度:自動;浮動:無;」 id=「23_nwp >>a 樣式="文字裝飾:無; 🎜> mpid="23" 目標 "_blank" href="http://cpro.baidu.com/cpro/ ui/uijs. php?adclass=0&app_id=0&c=新聞&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=619521ab1ccffd45&k=data&k0=data&kdi0=0&luki=4&n=10&k=data&k0=data&kdi0=0&luki=4&n=10&C &sid=45fdcf1cab219561&ssp2=1&stid= 0&t= tpclicked3_hc&tu=u1922429&u=http://www.admin10000.com/document/1183.html&urlid=0" id= "23_nwl ">跨度 樣式=樣式=樣式>數據跨度>a> 跨度
- >); //輸出worker傳送來的資料 }
- script>
- head>
- body>body>
- html>
用Chrome瀏覽器開啟test.html後,控制台輸出 ”hello world” 表示程式執行成功。
透過這個例子我們可以看出使用web worker主要分為以下幾個部分
WEB主線程:
1.透過 worker = new Worker( url ) 載入一個JS檔案來建立一個worker,同時傳回一個worker實例。
2.透過worker.postMessage( data ) 方法來傳送資料給worker。
3.綁定worker.onmessage方法來接收worker傳送過來的資料。
4.可以使用 worker.terminate() 來終止一個worker的執行。
worker新執行緒:
1.透過postMessage( data ) 方法來向主執行緒傳送資料。
2.綁定onmessage方法來接收主執行緒傳送過來的資料。
二:Worker能做什麼
知道如何使用web worker ,那麼它到底有什麼用,可以幫我們解決那些問題呢。我們來看一個fibonacci數列的例子。
大家知道在數學上,fibonacci數列被用遞歸的方法定義:F0=0,F1=1,Fn=F(n-1) F(n-2)(n>=2,n∈N* ),而javascript的常用實作為:
- var fibonacci =function(n).
- return n };
- //fibonacci(36)
- 在chrome中用該方法進行39的fibonacci數列執行時間為19097毫秒 ,而要計算40的時候瀏覽器直接提示腳本忙了。
JavaScript Code
- //fibonacci.js
- var斐波那契 =函數(n) {
- 回傳 n
- };
- onmessage =函數(事件) {
- var n = parseInt(event."寬度:自動;高度:自動;浮動:無;" "寬度:自動;高度:自動;浮動:無;" id="16_nwp">"文字裝飾:無;""文字裝飾:無;" mpid="16" target="_blank" ref="http://cpro.baidu .com/cpro /ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=619521ab1ccffd45&k=data&k0=data&kdi0=0&luki=4n?n&q &seller_id= 1&sid =45fdcf1cab219561&ssp2= 1&time=0&t=tpclicked3_hc&tu=u1922429&u=http://www.admin10000.com/document/1183.html&url=0" id="顏色:#0000ff;字體大小:14px;寬度:自動;高度:自動;浮動:無;"
- >資料< ; /span , 10);
- postMessage(斐波那契(n));
- HTML>
- html>
- 跨度 樣式 樣式 樣式 >樣式「寬度:自動;高度:自動;浮動:無;」 id=「11_nwp=「11_nwp「11_nwp「11_nwp 🎜>>a 樣式=樣式="文字裝飾:無; " mpid="11" 目標 目標目標目標"_blank" href="http://cpro.baidu.com/ cpro/ui uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=619521ab1ccffd45&k=head&k0=head&kdi0=0&luki=6&n=100&k=head&k0=head&kdi0=0&luki=6&n=10&p id=1&sid=45fdcf1cab219561&ssp2= 1&stid=0&t= tpclicked3_hc&tu=u1922429&u=http://www.admin10000.com/document/1183.html&urlid=0" id id id id >> "> 跨度
- 樣式=“顏色:#0000ff;字體大小:14px;寬度:自動;高度:自動;浮動:無;”>頭 頭 頭 頭 頭
- 頭 頭 span>a> 跨度跨度>> 元 http-equiv=http-equiv==類型" 內容="text/html; charset=utf-8"/ 標題>網路工作者斐波那契網路工作者斐波那契> 標題>
- 腳本 類型="text/ 跨度 style="寬度: 自動; 高度:自動; 浮動:無;」idid =“12_nwp”> a 樣式 ="文字裝飾:無;" mpid="12" 目標="_blank" ref > >"http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di= 128&fv=0&is_app=0&jk=619521ab1ccffd45&java=kdf45&pscript=k000&p baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=45fdcf1cab219561&ssp2=1&stid=0&t =tpclicked3_hc&tu=u1922429&stid=0&t =tpclicked3_hc&tu=u1922429&stid=http://www.D.com id="12_nwl">< ;跨度 樣式="顏色:#0000ff;字體大小:14px;寬度:自動;高度:自動;浮動:無;「>javascript跨度>aa 跨度
- >「> 🎜>> 🎜>
- 載入 =函數(){ 函數
- (){
- (){ (){ var worker =new worker.addEventListener('訊息', 函數(事件) { var timer2 = (new Date()).valueOf();
- con中。 「寬度:自動;高度:自動;浮動:無;」 id=「13_nwp” >a 樣式=樣式=樣式=樣式=樣式= mpid="13" ="_blank" href="http://cpro.baidu. com/cpro ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=619521ab1ccffd45&k=data&k0=data&kdi0=0&luki=4000&lu _id=1&sid= 45fdcf1cab219561&ssp2=1&stid =0&t=tpclicked3_hc&tu=u1922429&u=http://www.admin10000.com/document/1183.html&urlid=0" id id >"13_nwl">跨度 樣式 樣式 樣式 樣式 樣式 「顏色:#0000ff;字體大小:14px;寬度:自動;高度:自動;浮動:無;」>資料
- 跨度>a> > >
>,'時間:'timer2,'用時:'(timer2-timer)); }, 錯誤的); - var 計時器 = (new Date()).valueOf(); 🎜 console.log('開始計算:40','時間:' timer );
- setTimeout(function(){
- console.log('計時器
- span可🎜> 「寬度:自動;高度:自動;浮動:無;」 id=「14_nwp 「14_nwp >a 樣式=樣式=樣式=花 mpid="14" 目標 "_blank" href="http://cpro.baidu.com/uicpro /ui/js .php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=619521ab1ccffd45&k=����&k0=����&kdi0=0&luki=10&n seller_id=1&sid =45fdcf1cab219561&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http://www.admin10000.com/document/1183.html&urlid=0" id="14_nwl">跨度 樣式="顏色:#0000ff;字體大小:14px;寬度:自動;高度:自動;浮動:無;">函數>函數span> a
- >
- >
- span >
- 在計算數列時執行了', '時間:' (new Date()).valueOf( ) ); },1000); worker.postMessage(40); console.log('我在計算數列的時候執行了', '時間:' (new Date()).valueOf() ); }
- 腳本>
- 跨度 樣式= 「寬度:自動;高度:自動;浮動:無;」 id=「15_nwp”「15_nwp” >a 樣式=樣式="文字裝飾:無;「 mpid=「15」 目標="_blank" href="http://cpro.baidu.com /cpro /uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=619521ab1ccffd45&k=head&k0=head&kdi0=0&luki=6&n>100&p _id=1&sid=45fdcf1cab219561&ssp2 =1&stid= 0&t=tpclicked3_hc&tu=u1922429&u=http://www.admin10000.com/document/1183.html&urlid=0" id id; "15_nwl">跨度 樣式= 「顏色:#0000ff;字體大小:14px;寬度:自動;高度:自動;浮動:無;」>頭頭跨度>
- a>< ;/>< ;/
- >>
- 身體>
>
- 跨度 樣式=樣式=樣式=「寬度:高度自動;自動; 浮動:無;" id="9_nwp">"9_nwp">>a 樣式="文字裝飾:無;""文字裝飾:無;" mpid="9" 目標=目標= href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id =0&c=新聞&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=619521ab1ccffd45&k=����&k0=����&kdi0=0&luki=2&n=10&p=baidu&q=060110=0&luki=2&n=10&p=baidu&q=06010=0&luki=2&n=10&p=baidu&q=06011078 b219561&ssp2=1&stid=0&t =tpclicked3_hc&tu =u1922429&u=http://www.admin10000.com/document/1183.html&urlid=0" id=id= >跨度 樣式=樣式=樣式
=
跨度>
a
>
- // /aj/webWorker/core.js
- 函數 $E(id) {
- 回傳 document.getElementById(id);
- }
- onload =函數() {
- //透過web worker載入
- $E('workerLoad').onclick = var
- url ='http://js.wcdn./jj/mwhoo. ; var d = (
- newnew var
- worker =new worker.onmessage =函數 (obj) {
- console.log('web worker: '
- }; };
- //透過jsonp載入
- $E('jsonpLoad').onclick =函數
- > var url ='http://js.wcdn.cn/ajmblog/mblogface>'http://js.wcdn.cn/ajmblog/mblogface> ;
- var d = (new new
- STK.core.io.scriptLoader({ 方法:'發表' ,
- url : url,
- onComplete : 函數 () {
- 函數() {
- console.log('jsonp: ' 'jsonp: '
-
'jsonp: ''jsonp: ''jsonp: '
- }
- });
- };
- //透過ajax載入
- $E('ajaxLoad').onclick =函數()>
- var url ='http://js.wcdn./j/mwhoo. ; var
- d = (newnew
- STK.core.io.ajax({
- url : url,
- onComplete : 函數(json) { (json) {
- console.log('ajax: ''ajax: ''ajax: ' 含() - d));
- }
- });
- };
- };
- HTML>
- html>
- 跨度 樣式 樣式 樣式 >樣式「寬度:自動;高度:自動;浮動:無;」 id=「4_nwp」>a 樣式=樣式="文字裝飾:無; " mpid="4" 目標 "_blank" href="http://cpro.baidu.com/ cpro/ui uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=619521ab1ccffd45&k=head&k0=head&kdi0=0&luki=6&n=100&k=head&k0=head&kdi0=0&luki=6&n=10&p id=1&sid=45fdcf1cab219561&ssp2= 1&stid=0&t= tpclicked3_hc&tu=u1922429&u=http://www.admin10000.com/document/1183.html&urlid=0" id="4_nwl ">跨度 樣式=“顏色:#0000ff;字體大小:14px;寬度:自動;高度:自動;浮動:無;”>頭 頭 頭
- 頭 頭 頭 頭 span>a> 跨度跨度>> 元 http-equiv=http-equiv==類型" 內容="text/html; charset=utf-8"/
- 標題>工作範例:載入工作範例:載入跨度 樣式=“寬度:自動;高度:自動;浮動:無;” id="5_nwp">aaa樣式="文本裝飾:無;" mpid= 「5」 目標=「_blank」 href >="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk =619521ab1cc =0&luki=4&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=45fdcf1cab219561&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922第429章&u=http://www.admin10000.com/document/1183.html&urlid=0 " id="5_nwl"> 樣式="顏色:#0000ff;字體大小:14px;寬度:自動;高度:自動浮動:無;">資料跨度>跨度>< ;>< ;> < ; a>跨度> 標題>
- 腳本 src="http: / /js.t.sinajs.cn/STK/js/gaea.1.14.js" 類型="text/< ; 跨度 style="寬度: 自動; 高度:自動; 浮動:無;」idididididididididididid=“6_nwp”> a 樣式="文字裝飾:無;" mpid="6"="6""6" 目標="_blank" href 🎜>"http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di= 128&fv=0&is_app=0&jk=619521ab1ccffd45&nscript&sscript=4521ab1ccffd45&n =baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=45fdcf1cab219561&ssp2=1&stid=0&t =tpclicked3_hc&tu=u1922429&stid=0&t =tpclicked3_hc&tu=u1922429&stid=http://www.D.com > id="6_nwl">< ;跨度 樣式="顏色:#0000ff;字體大小:14px;寬度:自動;高度:自動;浮動:無;「> javascript跨度>a>跨度 >
-
“>腳本>
腳本 類型
=類型 " src = -
"http://js.wcdn.cn/aj/webWorker/core.js"
>腳本> - 頭>
- 身體> 輸入 類型=“按鈕” id="workerLoad" 值
- ="web worker載入">輸入> 🎜>> 輸入 類型=“按鈕” id="jsonpLoad" 值 值>"jsonp載入">輸入>
- 輸入 類型=“按鈕” id="span style="寬:自動; 高度:自動; 浮動:無;」id=「7_nwp」 > a 樣式="文字裝飾:無; > mpid="7" 目標= "_blank" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass= 0&app_id=0&c=news&cf=1001&ch=0&di= 128&fv=0&is_app=0&jk=619521ab1ccffd45&k=ajax&k0=ajax&kdi0=0&luki=8&n=10&pqb&k0=ajax&kdi0=0&luki=8&n=10&pqb&n=1000 =45fdcf1cab219561&ssp2=1&stid =0&t=tpclicked3_hc&tu=u1922429&u=http: //www.admin10000.com/document/ 1183.html&urlid=0" id=id="id="7_nwl">< ;跨度 樣式=樣式="ff🎜>樣式顏色;大小:14px;寬度:自動;高度:自動;浮動:無;“>ajax跨度>a>跨度> 加載”值=“ajax加載”>
- 輸入>
- 身體>
>
複製程式碼
程式碼如下:
After trying several times, I found that the time to load data through jsonp and ajax is not much different, and the loading time of web worker has always been at a high level, so using web worker to load data is still relatively slow, even with large amounts of data. There is no advantage. It may be that it takes time for Worker to initialize new threads. There is no advantage other than being non-blocking during loading.
So can web worker support cross-domain js loading? This time we access the page through http://127.0.0.1/aj/webWorker/worker.html. When clicking the "web worker loading" loading button, Chrome will download There is no response, and an error is prompted under FF6. From this we can know that web worker does not support cross-domain loading of JS, which is bad news for websites that deploy static files to a separate static server.
So web worker can only be used to load json data in the same domain, but ajax can already do this, and it is more efficient and versatile. Let the Worker do what it is good at.
Four: Summary
Web workers look nice, but they are full of devils.
What we can do:
1. You can load a JS to perform a large number of complex calculations without hanging the main process, and communicate through postMessage, onmessage
2. You can load additional script files in the worker through importScripts(url)
3. You can use setTimeout(), clearTimeout(), setInterval(), and clearInterval()
4. You can use XMLHttpRequest to send requests
5. Can access some properties of navigator
What are the limitations:
1. Cannot load JS across domains
2. The code within the worker cannot access the DOM
3. The implementation of Worker in various browsers is not consistent. For example, FF allows the creation of new workers in workers, but Chrome does not allow it.
4. Not every browser supports this new feature

HTML5的關鍵元素包括、、、、、等,用於構建現代網頁。 1.定義頭部內容,2.用於導航鏈接,3.表示獨立文章內容,4.組織頁面內容,5.展示側邊欄內容,6.定義頁腳,這些元素增強了網頁的結構和功能性。

HTML5和H5沒有區別,H5是HTML5的簡稱。 1.HTML5是HTML的第五個版本,增強了網頁的多媒體和交互功能。 2.H5常用於指代基於HTML5的移動網頁或應用,適用於各種移動設備。

HTML5是超文本標記語言的最新版本,由W3C標準化。 HTML5引入了新的語義化標籤、多媒體支持和表單增強,提升了網頁結構、用戶體驗和SEO效果。 HTML5引入了新的語義化標籤,如、、、等,使網頁結構更清晰,SEO效果更好。 HTML5支持多媒體元素和,無需第三方插件,提升了用戶體驗和加載速度。 HTML5增強了表單功能,引入了新的輸入類型如、等,提高了用戶體驗和表單驗證效率。

如何寫出乾淨高效的HTML5代碼?答案是通過語義化標籤、結構化代碼、性能優化和避免常見錯誤。 1.使用語義化標籤如、等,提升代碼可讀性和SEO效果。 2.保持代碼結構化和可讀性,使用適當縮進和註釋。 3.優化性能,通過減少不必要的標籤、使用CDN和壓縮代碼。 4.避免常見錯誤,如標籤未閉合,確保代碼有效性。

H5通過多媒體支持、離線存儲和性能優化提升網頁用戶體驗。 1)多媒體支持:H5的和元素簡化開發,提升用戶體驗。 2)離線存儲:WebStorage和IndexedDB允許離線使用,提升體驗。 3)性能優化:WebWorkers和元素優化性能,減少帶寬消耗。

HTML5代碼由標籤、元素和屬性組成:1.標籤定義內容類型,用尖括號包圍,如。 2.元素由開始標籤、內容和結束標籤組成,如內容。 3.屬性在開始標籤中定義鍵值對,增強功能,如。這些是構建網頁結構的基本單位。

HTML5是構建現代網頁的關鍵技術,提供了許多新元素和功能。 1.HTML5引入了語義化元素如、、等,增強了網頁結構和SEO。 2.支持多媒體元素和,無需插件即可嵌入媒體。 3.表單增強了新輸入類型和驗證屬性,簡化了驗證過程。 4.提供了離線和本地存儲功能,提升了網頁性能和用戶體驗。

H5代碼的最佳實踐包括:1.使用正確的DOCTYPE聲明和字符編碼;2.採用語義化標籤;3.減少HTTP請求;4.使用異步加載;5.優化圖像。這些實踐能提升網頁的效率、可維護性和用戶體驗。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Linux新版
SublimeText3 Linux最新版