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

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

開(kāi)發(fā) 前端
在Web開(kāi)發(fā)的時(shí)候經(jīng)常會(huì)遇到瀏覽器不響應(yīng)事件進(jìn)入假死狀態(tài),甚至彈出“腳本運(yùn)行時(shí)間過(guò)長(zhǎng)“的提示框,如果出現(xiàn)這種情況說(shuō)明你的腳本已經(jīng)失控了。

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

JavaScript引擎是基于事件驅(qū)動(dòng)單線程執(zhí)行的,JS引擎一直等待著任務(wù)隊(duì)列中任務(wù)的到來(lái)然后加以處理,瀏覽器無(wú)論再什么時(shí)候都只有一個(gè)JS線程在運(yùn)行JS程序。

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

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

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

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

直接看代碼:

例子:用戶輸入一個(gè)數(shù)字,進(jìn)行加法運(yùn)算(+=)

以前的做法:

  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()">計(jì)算</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 ="計(jì)算結(jié)果:"+result;  
  22.             document.getElementById("time").innerHTML ="普通 耗時(shí):"+ (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()">計(jì)算</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 ="計(jì)算結(jié)果:"+data;  
  20.                 document.getElementById("time").innerHTML ="workers 耗時(shí):"+ (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服務(wù)器中, 如果使用的是localhost請(qǐng)用高版本的chrome瀏覽器打開(kāi),firefox瀏覽器在處理localhost的時(shí)候會(huì)出現(xiàn)“Could not get domain!”的錯(cuò)誤,關(guān)于這個(gè)可以參考:https://bugzilla.mozilla.org/show_bug.cgi?id=682450 對(duì)比上面的兩種實(shí)現(xiàn)方式,當(dāng)計(jì)算值達(dá)到100億的時(shí)候,普通做法耗時(shí)已經(jīng)很長(zhǎng),且一般會(huì)卡死了。

 

 

webWorkers在Chrome15下的效果

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

如下圖所示:

 

 

普通方法在Chrome15下的效果

可見(jiàn)webWorkers在未來(lái)的web應(yīng)用中還是非常有價(jià)值的。

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

【編輯推薦】

  1. 使用HTML 5制作物理游戲
  2. 51CTO技術(shù)沙龍第十七期:HTML 5應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)分享
  3. HTML 5 Canvas(畫(huà)布)教程之圖像處理
  4. 用HTML 5打造斯諾克桌球俱樂(lè)部
  5. 使用HTML 5、CSS3和jQuery增強(qiáng)網(wǎng)站用戶體驗(yàn)
責(zé)任編輯:陳貽新 來(lái)源: 江柳清的博客
相關(guān)推薦

2012-04-23 13:43:02

HTML5瀏覽器

2012-05-07 14:24:15

HTML 5Web App

2012-05-28 13:09:12

HTML5

2018-12-06 09:00:00

LinuxWeb瀏覽器

2017-03-10 19:30:58

Web開(kāi)發(fā)

2020-10-14 09:45:29

Web開(kāi)發(fā)瀏覽器

2012-05-17 09:45:30

2013-11-22 09:58:36

2009-05-11 09:16:33

騰訊TT瀏覽器

2012-11-20 18:00:29

HTML5IE10瀏覽器

2011-05-11 18:00:10

HTML5兼容性

2011-07-01 13:11:22

Web

2015-03-10 13:48:06

HTML5開(kāi)發(fā)者HTML5

2010-04-01 13:03:10

2012-02-10 10:26:55

手機(jī)瀏覽器HTML5

2012-05-05 09:17:03

2012-05-08 11:35:01

傲游HTML5

2012-05-27 20:21:40

2011-08-03 17:53:03

注冊(cè)表編輯器

2023-03-06 07:43:05

JavaScripDebugger
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 高清18麻豆| 欧美aⅴ| 亚洲在线免费观看 | 亚洲成人av | 日本亚洲精品成人欧美一区 | 国产丝袜一区二区三区免费视频 | 在线免费看毛片 | 国产精品久久久久久久久久 | 亚洲成人精品一区 | 91超碰在线观看 | 日韩一级免费大片 | 欧美日韩精品一区二区三区蜜桃 | 亚洲视频在线观看 | 久在线| 久久久精品久 | 久久久久中文字幕 | www.久久艹 | 午夜免费网 | 91久久久www播放日本观看 | 特级一级黄色片 | 国产在线观| 欧美日韩一区在线 | 亚洲精品免费视频 | 国产精品123区 | 日韩精品在线看 | 欧美亚洲在线 | 天天爽夜夜爽精品视频婷婷 | 在线 丝袜 欧美 日韩 制服 | 91麻豆精品国产91久久久久久久久 | 国内精品99 | 欧美日本在线观看 | 视频一区二区中文字幕日韩 | 国产精品99久久久久久www | 国产日韩一区二区三区 | 精品一区二区三区四区五区 | 97在线观视频免费观看 | 黑色丝袜三级在线播放 | 福利视频一区二区 | 国产男女猛烈无遮掩视频免费网站 | av一级| 欧美综合一区 |