日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
HTML5Web開發(fā):防止瀏覽器假死的方法

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

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

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

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

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

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

直接看代碼:

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

以前的做法:

 
 
 
 
  1.  
  2.  
  3.  
  4.      
  5.     webworkers--calculate 
  6.  
  7.      
  8.     計算 
  9.     
 
  •     
  •  
  •      
  •      
  •  
  •  
  • 使用webWorkers以后:

    calculate.html

     
     
     
     
    1.  
    2.  
    3.      
    4.     webworkers--calculate 
    5.  
    6.  
    7.      
    8.     計算 
    9.     
     
  •     
  •  
  •      
  •      
  •  
  •  
  • calculate.js

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

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

    webWorkers在Chrome15下的效果

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

    如下圖所示:

    普通方法在Chrome15下的效果

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

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


    新聞名稱:HTML5Web開發(fā):防止瀏覽器假死的方法
    網(wǎng)址分享:http://www.5511xx.com/article/djidohs.html