溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用HTML5的WebWorker

發(fā)布時(shí)間:2021-09-17 18:01:56 來(lái)源:億速云 閱讀:143 作者:柒染 欄目:web開發(fā)

這篇文章將為大家詳細(xì)講解有關(guān)如何使用HTML5的WebWorker,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

Web Workers 是 HTML5 提供的一個(gè)javascript多線程解決方案,我們可以將一些大計(jì)算量的代碼交由web Worker運(yùn)行而不凍結(jié)用戶界面。
一:如何使用Worker

  Web Worker的基本原理就是在當(dāng)前javascript的主線程中,使用Worker類加載一個(gè)javascript文件來(lái)開辟一個(gè)新的線程,起到互不阻塞執(zhí)行的效果,并且提供主線程和新線程之間數(shù)據(jù)交換的接口:postMessage,onmessage。

  那么如何使用呢,我們看一個(gè)例子:
 

JavaScript Code復(fù)制內(nèi)容到剪貼板

  1. //worker.js   

  2. onmessage =function (evt){   

  3.   var d = evt.data;//通過(guò)evt.data獲得發(fā)送來(lái)的數(shù)據(jù)   

  4.   postMessage( d );//將獲取到的數(shù)據(jù)發(fā)送會(huì)主線程   

  5. }  

  HTML頁(yè)面:test.html

 

XML/HTML Code復(fù)制內(nèi)容到剪貼板

  1. <!DOCTYPE HTML>  

  2. <html>  

  3. <<span style="width: auto; height: auto; float: none;" id="20_nwp"><a style="text-decoration: none;" mpid="20" target="_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=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=45fdcf1cab219561&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1183%2Ehtml&urlid=0" id="20_nwl"><span style="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">head</span></a></span>>  

  4.  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>  

  5.  <script type="text/<span style="width: auto; height: auto; float: none;" id="21_nwp"><a style="text-decoration: none;" mpid="21" target="_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=javascript&k0=javascript&kdi0=0&luki=9&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=45fdcf1cab219561&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1183%2Ehtml&urlid=0" id="21_nwl"><span style="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">javascript</span></a></span>">  

  6. //WEB頁(yè)主線程   

  7. var worker =new Worker("worker.js"); //創(chuàng)建一個(gè)Worker對(duì)象并向它傳遞將在新線程中執(zhí)行的腳本的URL   

  8.  worker.postMessage("hello world");     //向worker發(fā)送數(shù)據(jù)   

  9.  worker.onmessage =function(evt){     //接收worker傳過(guò)來(lái)的數(shù)據(jù)<span style="width: auto; height: auto; float: none;" id="22_nwp"><a style="text-decoration: none;" mpid="22" target="_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=%BA%AF%CA%FD&k0=%BA%AF%CA%FD&kdi0=0&luki=2&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=45fdcf1cab219561&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1183%2Ehtml&urlid=0" id="22_nwl"><span style="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">函數(shù)</span></a></span>  

  10.    console.log(evt.<span style="width: auto; height: auto; float: none;" id="23_nwp"><a style="text-decoration: none;" mpid="23" target="_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=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=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1183%2Ehtml&urlid=0" id="23_nwl"><span style="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">data</span></a></span>);              //輸出worker發(fā)送來(lái)的數(shù)據(jù)   

  11.  }   

  12.  </script>  

  13.  </head>  

  14.  <body></body>  

  15. </html>  

  用Chrome瀏覽器打開test.html后,控制臺(tái)輸出 ”hello world” 表示程序執(zhí)行成功。

  通過(guò)這個(gè)例子我們可以看出使用web worker主要分為以下幾部分

  WEB主線程:

  1.通過(guò) worker = new Worker( url ) 加載一個(gè)JS文件來(lái)創(chuàng)建一個(gè)worker,同時(shí)返回一個(gè)worker實(shí)例。

  2.通過(guò)worker.postMessage( data ) 方法來(lái)向worker發(fā)送數(shù)據(jù)。

  3.綁定worker.onmessage方法來(lái)接收worker發(fā)送過(guò)來(lái)的數(shù)據(jù)。

  4.可以使用 worker.terminate() 來(lái)終止一個(gè)worker的執(zhí)行。

  worker新線程:

  1.通過(guò)postMessage( data ) 方法來(lái)向主線程發(fā)送數(shù)據(jù)。

  2.綁定onmessage方法來(lái)接收主線程發(fā)送過(guò)來(lái)的數(shù)據(jù)。
  二:Worker能做什么

  知道了如何使用web worker ,那么它到底有什么用,可以幫我們解決那些問(wèn)題呢。我們來(lái)看一個(gè)fibonacci數(shù)列的例子。

  大家知道在數(shù)學(xué)上,fibonacci數(shù)列被以遞歸的方法定義:F0=0,F(xiàn)1=1,F(xiàn)n=F(n-1)+F(n-2)(n>=2,n&isin;N*),而javascript的常用實(shí)現(xiàn)為:

JavaScript Code復(fù)制內(nèi)容到剪貼板

  1.     

  2. var fibonacci =function(n) {   

  3.     return n <2? n : arguments.callee(n -1) + arguments.callee(n -2);   

  4. };   

  5. //fibonacci(36)  

  在chrome中用該方法進(jìn)行39的fibonacci數(shù)列執(zhí)行時(shí)間為19097毫秒 ,而要計(jì)算40的時(shí)候?yàn)g覽器直接提示腳本忙了。

  由于javascript是單線程執(zhí)行的,在求數(shù)列的過(guò)程中瀏覽器不能執(zhí)行其它javascript腳本,UI渲染線程也會(huì)被掛起,從而導(dǎo)致瀏覽器進(jìn)入僵死狀態(tài)。使用web worker將數(shù)列的計(jì)算過(guò)程放入一個(gè)新線程里去執(zhí)行將避免這種情況的出現(xiàn)。具體看例子:
 

JavaScript Code復(fù)制內(nèi)容到剪貼板

  1. //fibonacci.js   

  2. var fibonacci =function(n) {   

  3.     return n <2? n : arguments.callee(n -1) + arguments.callee(n -2);   

  4. };   

  5. onmessage =function(event) {   

  6.     var n = parseInt(event.<span style="width: auto; height: auto; float: none;" id="16_nwp"><a style="text-decoration: none;" mpid="16" target="_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=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=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1183%2Ehtml&urlid=0" id="16_nwl"><span style="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">data</span></a></span>, 10);   

  7.     postMessage(fibonacci(n));   

  8. };  

  HTML頁(yè)面:fibonacci.html
 

XML/HTML Code復(fù)制內(nèi)容到剪貼板

  1. <!DOCTYPE HTML>  

  2. <html>  

  3. <<span style="width: auto; height: auto; float: none;" id="11_nwp"><a style="text-decoration: none;" mpid="11" target="_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=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=45fdcf1cab219561&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1183%2Ehtml&urlid=0" id="11_nwl"><span style="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">head</span></a></span>>  

  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>  

  5. <title>web worker fibonacci</title>  

  6. <script type="text/<span style="width: auto; height: auto; float: none;" id="12_nwp"><a style="text-decoration: none;" mpid="12" target="_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=javascript&k0=javascript&kdi0=0&luki=9&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=45fdcf1cab219561&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1183%2Ehtml&urlid=0" id="12_nwl"><span style="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">javascript</span></a></span>">  

  7.   onload =function(){   

  8.       var worker =new Worker('fibonacci.js');     

  9.       worker.addEventListener('message', function(event) {   

  10.         var timer2 = (new Date()).valueOf();   

  11.            console.log( '結(jié)果:'+event.<span style="width: auto; height: auto; float: none;" id="13_nwp"><a style="text-decoration: none;" mpid="13" target="_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=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=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1183%2Ehtml&urlid=0" id="13_nwl"><span style="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">data</span></a></span>, '時(shí)間:'+ timer2, '用時(shí):'+ ( timer2  - timer ) );   

  12.       }, false);   

  13.       var timer = (new Date()).valueOf();   

  14.       console.log('開始計(jì)算:40','時(shí)間:'+ timer );   

  15.       setTimeout(function(){   

  16.           console.log('定時(shí)器<span style="width: auto; height: auto; float: none;" id="14_nwp"><a style="text-decoration: none;" mpid="14" target="_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=%BA%AF%CA%FD&k0=%BA%AF%CA%FD&kdi0=0&luki=2&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=45fdcf1cab219561&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1183%2Ehtml&urlid=0" id="14_nwl"><span style="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">函數(shù)</span></a></span>在計(jì)算數(shù)列時(shí)執(zhí)行了', '時(shí)間:'+ (new Date()).valueOf() );   

  17.       },1000);   

  18.       worker.postMessage(40);   

  19.       console.log('我在計(jì)算數(shù)列的時(shí)候執(zhí)行了', '時(shí)間:'+ (new Date()).valueOf() );   

  20.   }     

  21.   </script>  

  22. </<span style="width: auto; height: auto; float: none;" id="15_nwp"><a style="text-decoration: none;" mpid="15" target="_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=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=45fdcf1cab219561&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1183%2Ehtml&urlid=0" id="15_nwl"><span style="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">head</span></a></span>>  

  23. <body>  

  24. </body>  

  25. </html>  

  在Chrome中打開fibonacci.html,控制臺(tái)得到如下輸出:
 
開始計(jì)算:40 時(shí)間:1316508212705
我在計(jì)算數(shù)列的時(shí)候執(zhí)行了 時(shí)間:1316508212734
定時(shí)器

XML/HTML Code復(fù)制內(nèi)容到剪貼板

  1. <span style="width: auto; height: auto; float: none;" id="9_nwp"><a style="text-decoration: none;" mpid="9" target="_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=%BA%AF%CA%FD&k0=%BA%AF%CA%FD&kdi0=0&luki=2&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=45fdcf1cab219561&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1183%2Ehtml&urlid=0" id="9_nwl"><span style="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">函數(shù)</span></a></span>  

在計(jì)算數(shù)列時(shí)執(zhí)行了 時(shí)間:1316508213735
結(jié)果:102334155 時(shí)間:1316508262820 用時(shí):50115

  這個(gè)例子說(shuō)明在worker中執(zhí)行的fibonacci數(shù)列的計(jì)算并不會(huì)影響到主線程的代碼執(zhí)行,完全在自己獨(dú)立的線程中計(jì)算,只是在計(jì)算完成之后將結(jié)果發(fā)回主線程。

  利用web worker我們可以在前端執(zhí)行一些復(fù)雜的大量運(yùn)算而不會(huì)影響頁(yè)面的展示,并且不會(huì)彈出惡心的腳本正忙提示。

  下面這個(gè)例子使用了web worker來(lái)計(jì)算場(chǎng)景中的像素,場(chǎng)景打開時(shí)是一片一片進(jìn)行繪制的,一個(gè)worker只計(jì)算一塊像素值。

  http://nerget.com/rayjs-mt/rayjs.html
  三:Worker的其他嘗試

  我們已經(jīng)知道Worker通過(guò)接收一個(gè)URL來(lái)創(chuàng)建一個(gè)worker,那么我們是否可以利用web worker來(lái)做一些類似jsonp的請(qǐng)求呢,大家知道jsonp是通過(guò)插入script標(biāo)簽來(lái)加載json數(shù)據(jù)的,而script元素在加載和執(zhí)行過(guò)程中都是阻塞式的,如果能利用web worker實(shí)現(xiàn)異步加載將會(huì)非常不錯(cuò)。

  下面這個(gè)例子將通過(guò) web worker、jsonp、ajax三種不同的方式來(lái)加載一個(gè)169.42KB大小的JSON數(shù)據(jù)

 

JavaScript Code復(fù)制內(nèi)容到剪貼板

  1. // /aj/webWorker/core.js   

  2. function $E(id) {   

  3.     return document.getElementById(id);   

  4. }   

  5. onload =function() {   

  6.     //通過(guò)web worker加載   

  7.     $E('workerLoad').onclick =function() {   

  8.         var url ='http://js.wcdn.cn/aj/mblog/face2';   

  9.         var d = (new Date()).valueOf();   

  10.         var worker =new Worker(url);   

  11.         worker.onmessage =function(obj) {   

  12.             console.log('web worker: '+ ((new Date()).valueOf() - d));   

  13.         };   

  14.     };   

  15.     //通過(guò)jsonp加載   

  16.     $E('jsonpLoad').onclick =function() {   

  17.         var url ='http://js.wcdn.cn/aj/mblog/face1';   

  18.         var d = (new Date()).valueOf();   

  19.         STK.core.io.scriptLoader({   

  20.             method:'post',   

  21.             url : url,   

  22.             onComplete : function() {   

  23.                 console.log('jsonp: '+ ((new Date()).valueOf() - d));   

  24.             }   

  25.         });   

  26.     };   

  27.     //通過(guò)<span style="width: auto; height: auto; float: none;" id="8_nwp"><a style="text-decoration: none;" mpid="8" target="_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&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=45fdcf1cab219561&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1183%2Ehtml&urlid=0" id="8_nwl"><span style="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">ajax</span></a></span>加載   

  28.     $E('ajaxLoad').onclick =function() {   

  29.         var url ='http://js.wcdn.cn/aj/mblog/face';   

  30.         var d = (new Date()).valueOf();   

  31.         STK.core.io.ajax({   

  32.             url : url,   

  33.             onComplete : function(json) {   

  34.                 console.log('ajax: '+ ((new Date()).valueOf() - d));   

  35.             }   

  36.         });   

  37.     };   

  38. };  

  HTML頁(yè)面:/aj/webWorker/worker.html

 

XML/HTML Code復(fù)制內(nèi)容到剪貼板

  1. <!DOCTYPE HTML>  

  2. <html>  

  3. <<span style="width: auto; height: auto; float: none;" id="4_nwp"><a style="text-decoration: none;" mpid="4" target="_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=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=45fdcf1cab219561&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1183%2Ehtml&urlid=0" id="4_nwl"><span style="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">head</span></a></span>>  

  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>  

  5. <title>Worker example: load <span style="width: auto; height: auto; float: none;" id="5_nwp"><a style="text-decoration: none;" mpid="5" target="_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=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=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1183%2Ehtml&urlid=0" id="5_nwl"><span style="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">data</span></a></span></title>  

  6. <script src="http://js.t.sinajs.cn/STK/js/gaea.1.14.js" type="text/<span style="width: auto; height: auto; float: none;" id="6_nwp"><a style="text-decoration: none;" mpid="6" target="_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=javascript&k0=javascript&kdi0=0&luki=9&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=45fdcf1cab219561&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1183%2Ehtml&urlid=0" id="6_nwl"><span style="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">javascript</span></a></span>"></script>  

  7. <script type="text/javascript" src="http://js.wcdn.cn/aj/webWorker/core.js"></script>  

  8. </head>  

  9. <body>  

  10.     <input type="button" id="workerLoad" value="web worker加載"></input>  

  11.     <input type="button" id="jsonpLoad" value="jsonp加載"></input>  

  12.     <input type="button" id="<span style="width: auto; height: auto; float: none;" id="7_nwp"><a style="text-decoration: none;" mpid="7" target="_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&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=45fdcf1cab219561&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1183%2Ehtml&urlid=0" id="7_nwl"><span style="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">ajax</span></a></span>Load" value="ajax加載"></input>  

  13. </body>  

  14. </html>  

  設(shè)置HOST
 

代碼如下:

127.0.0.1 js.wcdn.cn 

  通過(guò) http://js.wcdn.cn/aj/webWorker/worker.html 訪問(wèn)頁(yè)面然后分別通過(guò)三種方式加載數(shù)據(jù),得到控制臺(tái)輸出:
 

代碼如下:

web worker: 174
jsonp: 25
ajax: 38

  多試幾次發(fā)現(xiàn)通過(guò)jsonp和ajax加載數(shù)據(jù)的時(shí)間相差不大,而web worker的加載時(shí)間一直處于高位,所以用web worker來(lái)加載數(shù)據(jù)還是比較慢的,即便是大數(shù)據(jù)量情況下也沒(méi)任何優(yōu)勢(shì),可能是Worker初始化新起線程比較耗時(shí)間。除了在加載過(guò)程中是無(wú)阻塞的之外沒(méi)有任何優(yōu)勢(shì)。

  那么web worker是否能支持跨域js加載呢,這次我們通過(guò)http://127.0.0.1/aj/webWorker/worker.html 來(lái)訪問(wèn)頁(yè)面,當(dāng)點(diǎn)擊 ”web worker加載” 加載按鈕時(shí)Chrome下無(wú)任何反映,F(xiàn)F6下提示錯(cuò)誤。由此我們可以知道web worker是不支持跨域加載JS的,這對(duì)于將靜態(tài)文件部署到單獨(dú)的靜態(tài)服務(wù)器的網(wǎng)站來(lái)說(shuō)是個(gè)壞消息。

所以web worker只能用來(lái)加載同域下的json數(shù)據(jù),而這方面ajax已經(jīng)可以做到了,而且效率更高更通用。還是讓W(xué)orker做它自己擅長(zhǎng)的事吧。
  四:總結(jié)

  web worker看起來(lái)很美好,但處處是魔鬼。

  我們可以做什么:

  1.可以加載一個(gè)JS進(jìn)行大量的復(fù)雜計(jì)算而不掛起主進(jìn)程,并通過(guò)postMessage,onmessage進(jìn)行通信

  2.可以在worker中通過(guò)importScripts(url)加載另外的腳本文件

  3.可以使用 setTimeout(), clearTimeout(), setInterval(), and clearInterval()

  4.可以使用XMLHttpRequest來(lái)發(fā)送請(qǐng)求

  5.可以訪問(wèn)navigator的部分屬性

  有那些局限性:

  1.不能跨域加載JS

  2.worker內(nèi)代碼不能訪問(wèn)DOM

  3.各個(gè)瀏覽器對(duì)Worker的實(shí)現(xiàn)不大一致,例如FF里允許worker中創(chuàng)建新的worker,而Chrome中就不行

  4.不是每個(gè)瀏覽器都支持這個(gè)新特性

關(guān)于如何使用HTML5的WebWorker就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI