成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發 前端
在Web開發的時候經常會遇到瀏覽器不響應事件進入假死狀態,甚至彈出“腳本運行時間過長“的提示框,如果出現這種情況說明你的腳本已經失控了。

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

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

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

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

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

現在如果遇到了這種情況,我們可以做的不僅僅是優化 代碼,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的時候會出現“Could not get domain!”的錯誤,關于這個可以參考:https://bugzilla.mozilla.org/show_bug.cgi?id=682450 對比上面的兩種實現方式,當計算值達到100億的時候,普通做法耗時已經很長,且一般會卡死了。

 

 

webWorkers在Chrome15下的效果

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

如下圖所示:

 

 

普通方法在Chrome15下的效果

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

原文:http://tech.it168.com/a2011/1205/1283/000001283392.shtml

【編輯推薦】

  1. 使用HTML 5制作物理游戲
  2. 51CTO技術沙龍第十七期:HTML 5應用開發經驗分享
  3. HTML 5 Canvas(畫布)教程之圖像處理
  4. 用HTML 5打造斯諾克桌球俱樂部
  5. 使用HTML 5、CSS3和jQuery增強網站用戶體驗
責任編輯:陳貽新 來源: 江柳清的博客
相關推薦

2012-04-23 13:43:02

HTML5瀏覽器

2012-05-28 13:09:12

HTML5

2012-05-07 14:24:15

HTML 5Web App

2018-12-06 09:00:00

LinuxWeb瀏覽器

2017-03-10 19:30:58

Web開發

2020-10-14 09:45:29

Web開發瀏覽器

2012-05-17 09:45:30

2009-05-11 09:16:33

騰訊TT瀏覽器

2013-11-22 09:58:36

2012-11-20 18:00:29

HTML5IE10瀏覽器

2011-05-11 18:00:10

HTML5兼容性

2011-07-01 13:11:22

Web

2012-05-08 11:35:01

傲游HTML5

2015-03-10 13:48:06

HTML5開發者HTML5

2010-04-01 13:03:10

2012-02-10 10:26:55

手機瀏覽器HTML5

2012-05-05 09:17:03

2011-08-03 17:53:03

注冊表編輯器

2012-05-27 20:21:40

2023-03-06 07:43:05

JavaScripDebugger
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费一级做a爰片久久毛片潮喷 | 国产一区欧美 | 成人欧美一区二区三区在线播放 | 日韩欧美精品在线 | 国产一区二区三区视频 | 精精久久| 精品久久久久久久久久久院品网 | 亚洲欧美日韩在线 | 国产精品久久久久久一区二区三区 | 精品国产免费人成在线观看 | 亚洲一区在线日韩在线深爱 | 中文字幕av网站 | 久久精品 | av黄色片在线观看 | 日韩免费中文字幕 | 国产jizz女人多喷水99 | 成人午夜免费福利视频 | 国产成人a亚洲精品 | 日韩视频免费 | 黄色一级免费 | 一区中文字幕 | 欧美久 | 国产精品久久久久aaaa九色 | 欧美黄a| 永久精品 | 亚洲欧美在线观看 | 成人精品久久久 | 久久久久国产精品www | av在线播放国产 | 午夜一级黄色片 | 免费国产一区二区视频 | 成人免费在线视频 | 午夜久草 | 久久日韩精品 | 日韩视频在线免费观看 | 国产日韩在线观看一区 | 日韩日韩日韩日韩日韩日韩日韩 | 国产电影一区二区在线观看 | 亚洲综合二区 | 久久欧美高清二区三区 | 国产欧美视频一区二区三区 |