久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

HTML 5 Web開發(fā):防止瀏覽器假死的方法

一個瀏覽器至少存在三個線程:js引擎線程(處理js)、GUI渲染線程(渲染頁面)、瀏覽器事件觸發(fā)線程(控制交互)。

JavaScript引擎是基于事件驅動單線程執(zhí)行的,JS引擎一直等待著任務隊列中任務的到來然后加以處理,瀏覽器無論再什么時候都只有一個JS線程在運行JS程序。

GUI 渲染線程負責渲染瀏覽器界面,當界面需要重繪(Repaint)或由于某種操作引發(fā)回流(reflow)時,該線程就會執(zhí)行。但需要注意 GUI渲染線程與JS引擎是互斥的,當JS引擎執(zhí)行時GUI線程會被掛起,GUI更新會被保存在一個隊列中等到JS引擎空閑時立即被執(zhí)行。

事件觸發(fā)線程,當一個事件被觸發(fā)時該線程會把事件添加到待處理隊列的隊尾,等待JS引擎的處理。這些事件可來自JavaScript引擎當前執(zhí)行的代碼塊如setTimeOut、也可來自瀏覽器內核的其他線程如鼠標點擊、AJAX異步請求等,但由于JS的單線程關系所有這些事件都得排隊等待JS引擎處理。

了解了瀏覽器的內核處理方式就不難理解瀏覽器為什么會進入假死狀態(tài)了,當一段JS腳本長時間占用著處理機就會掛起瀏覽器的GUI更新,而后面的事件響應 也被排在隊列中得不到處理,從而造成了瀏覽器被鎖定進入假死狀態(tài)。另外JS腳本中進行了DOM操作,一旦JS調用結束就會馬上進行一次GUI渲染,然后才 開始執(zhí)行下一個任務,所以JS中大量的DOM操作也會導致事件響應緩慢甚至真正卡死瀏覽器,如在IE6下一次插入大量的HTML。而如果真的彈出了“腳本 運行時間過長“的提示框則說明你的JS腳本肯定有死循環(huán)或者進行過深的遞歸操作了。

現(xiàn)在如果遇到了這種情況,我們可以做的不僅僅是優(yōu)化 代碼,html5的webWorkers提供了js的后臺處理線程的API,它允許將復雜耗時的單純js邏輯處理放在瀏覽器后臺線程中進行處理,讓js線 程不阻塞UI線程的渲染。這個線程不能和頁面進行交互,如獲取元素、alert等。多個線程間也是可以通過相同的方法進行數據傳遞。

直接看代碼:

例子:用戶輸入一個數字,進行加法運算(+=)

以前的做法:

  1. <!DOCTYPE HTML> 
  2. <html lang="en"> 
  3. <head> 
  4.     <meta charset="UTF-8"> 
  5.     <title>webworkers--calculate</title></head> 
  6. <body> 
  7.     <input id="num" name="num" type="text"/> 
  8.     <button onclick = "calculate()">計算</button><br /> 
  9.     <div id="result" style="color:red;"></div> 
  10.     <div id="time" style="color:red;"></div> 
  11.     <script type="text/javascript" src="calculate.js"></script> 
  12.     <script type="text/javascript">        function calculate(){  
  13.             data1 = new Date().getTime();  
  14.             var num = document.getElementById("num").value;  
  15.             var val = parseInt(num,10);  
  16.             var result =0;  
  17.             for(var i =0; i<num;i++){  
  18.                 result += i;  
  19.             }  
  20.             data2 = new Date().getTime();  
  21.             document.getElementById("result").innerHTML ="計算結果:"+result;  
  22.             document.getElementById("time").innerHTML ="普通 耗時:"+ (data2 - data1)+"ms";  
  23.         }  
  24.     </script> 
  25. </body> 
  26. </html> 

使用webWorkers以后:

calculate.html

  1. <!DOCTYPE HTML> 
  2. <html lang="en"><head> 
  3.     <meta charset="UTF-8"> 
  4.     <title>webworkers--calculate</title> 
  5. </head> 
  6. <body> 
  7.     <input id="num" name="num" type="text"/> 
  8.     <button onclick = "calculate()">計算</button><br /> 
  9.     <div id="result" style="color:red;"></div> 
  10.     <div id="time" style="color:red;"></div> 
  11.     <script type="text/javascript" src="calculate.js"></script> 
  12.     <script type="text/javascript"> 
  13.         var worker = new Worker("calculate.js");  
  14.         var data1 =0;  
  15.         var data2 =0;  
  16.         worker.onmessage = function(event){  
  17.                 var data = event.data;  
  18.                 data2 = new Date().getTime();  
  19.                 document.getElementById("result").innerHTML ="計算結果:"+data;  
  20.                 document.getElementById("time").innerHTML ="workers 耗時:"+ (data2 - data1)+"ms";  
  21.             };  
  22.          function calculate(){  
  23.             data1 = new Date().getTime();  
  24.             var num = document.getElementById("num").value;   
  25.            var val = parseInt(num,10);  
  26.             worker.postMessage(val);  
  27.         }  
  28.     </script> 
  29. </body> 
  30. </html> 

calculate.js

  1. onmessage = function(event){  
  2.     var num = event.data;  
  3.     var result = 0;  
  4.     for(var i = 0; i<num;i++){  
  5.         result += i;  
  6.     }  
  7.     postMessage(result);  
  8. }; 

webWorker需要將代碼放入web服務器中, 如果使用的是localhost請用高版本的chrome瀏覽器打開,firefox瀏覽器在處理localhost的時候會出現(xiàn)“Could not get domain!”的錯誤,關于這個可以參考:https://bugzilla.mozilla.org/show_bug.cgi?id=682450 對比上面的兩種實現(xiàn)方式,當計算值達到100億的時候,普通做法耗時已經很長,且一般會卡死了。

HTML 5 Web開發(fā):防止瀏覽器假死的方法 三聯(lián)

webWorkers在Chrome15下的效果

更正:getTime()返回的應該是毫秒(ms),而不是秒(s)。

如下圖所示:

普通方法在Chrome15下的效果

可見webWorkers在未來的web應用中還是非常有價值的。

【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業(yè)用途。如損害你的權益請聯(lián)系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

這篇文章主要介紹了有關HTML5頁面在iPhoneX適配問題,需要的朋友可以參考下
本篇文章主要介紹了html5中canvas圖表實現(xiàn)柱狀圖的示例,本文使用canvas來實現(xiàn)一個圖表,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
Adobe公司出品的多媒體處理軟件產品線較多,涵蓋了音視頻編輯、圖像處理、平面設計、影視后期等領域。這篇文章主要介紹了Adobe Html5 Extension開發(fā)初體驗圖文教程,非常不錯,需要的朋
這篇文章主要介紹了基于HTML5的WebGL經典3D虛擬機房漫游動畫,需要的朋友可以參考下
這篇文章主要介紹了手機端用rem+scss做適配的詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
本篇文章主要介紹了canvas 實現(xiàn) github404動態(tài)效果的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
主站蜘蛛池模板: 国产精品欧美一区二区三区不卡 | 视频一区二区在线观看 | 中文字幕一级毛片视频 | 国产视频一区在线观看 | 久久国产精品精品国产色婷婷 | 欧美日韩亚洲一区 | www.性色| 91精品国产综合久久久久久 | 欧美在线观看一区 | 日本在线一区二区 | 亚洲精品一区二区三区丝袜 | 亚洲一区二区三区免费视频 | 91精品国产色综合久久不卡蜜臀 | 免费的一级视频 | 嫩草一区二区三区 | 日韩精品一区二区久久 | 天天影视网天天综合色在线播放 | 中国av在线免费观看 | 欧美老妇交乱视频 | 欧美激情亚洲天堂 | 精品久久久久久红码专区 | 99久久久国产精品免费消防器 | av永久免费 | 精品综合 | 亚洲国产高清高潮精品美女 | 日韩欧美一区二区三区四区 | 国产日韩av一区二区 | 亚洲视频一区在线观看 | 日韩久久久久久 | 天天影视网天天综合色在线播放 | www.日韩高清 | 中文字幕在线免费观看 | 暖暖日本在线视频 | 羞羞视频网 | 亚洲欧美综合 | 毛片av免费看 | 特级黄一级播放 | 免费a网站 | 91精品一区二区三区久久久久久 | 久久91av | 亚洲男人天堂 |