腳本造成ie運行速度減慢的解決


      最近在項目中,某些頁面需要一直向服務器發送請求,獲取最新的數據展示在頁面,實現方式是通過setInterval實現的,但是在使用了一段時間之后,瀏覽器偶然就會報出“運行的腳本造成ie運行速度減慢,是否要停止運行此腳本”之類的提示。網上查了下,當瀏覽器認為當前運行的腳本處於失控狀態的時候,就會給出類似的提示,但是各家瀏覽器判斷腳本失控的原則各不相同。

IE:通過js引擎運行的腳本數量決定,當運行腳本的行數大於500萬行的時候,ie就會給出提示,當然,這不是必然的,這有賴於ie對於失控腳本的檢查頻率。

其他的瀏覽器,多是通過一段腳本運行的時間判斷腳本是否失控,關於這方面詳細的內容,可以參考這篇文章。

http://www.cnblogs.com/yuzhongwusan/archive/2012/06/07/2540952.html

      知道了提示出現的原因,如何解決呢,前台不斷的向后台發送請求,請求回來的數據又經過處理展現,這些都是需要javascript腳本來執行的,不斷循環下去,總有一個時刻,代碼量積攢達到500萬行。但是只要我們能夠將IE對代碼行數的計數器重置,理論上就永遠不會達到代碼行數的上限。

有兩種方式可以達到上述目的:

  1. setTimeout

使用setTimeout將要執行的方法包起來,每次循環的時候,調用setTimeout都會采用一個新的計數器,這樣理論上應該能減少每個計數器的代碼行數總量。

    2.   采用事件機制

要執行的代碼通過事件來觸發,可以通過手動或者自動的click之類解決。事件機制為什么能解決這個問題,是因為IE的代碼計數器對事件處理函數里面的代碼重新計數,已經跟當前控制流的代碼計數器分開了。

 

考慮到目前我的代碼是在不斷的循環請求執行,使用setTimeout更加方便,故對setTimeout的處理方式進行了測試。

打印的數字為:<span id="test"></span>

<script>
var count = jQuery("#test");
for(var j=0;j<1930000;j++){
    if(j%10000 == 0){
            count.text(j);
    }
}

/*在ie瀏覽器中,如果下方代碼去掉setTimeout,則會報腳本失控的提示,加上之后,即不報。但是,即使加了setTimeout,下方的代碼循環的次數也遠遠達不到上方循環的次數,測試時發現,下方循環9000次還正常,改成10000次,又會報腳本失控。
*/
//setTimeout(function(){
    for(var j=0;j<9000;j++){
        if(j%100 == 0){
                count.text(j);
        }
    }    
//},1);
</script>

經過測試,setTimeout似乎是對ie的代碼計數行數產生了影響,但是並未像我預期的那樣,行數重置后,又可以循環將近200萬次,具體原因還不清楚。

**********************************************

感謝linkFly給出的意見,以前一直搞不懂為什么我的程序使用setInterval不斷執行時會導致瀏覽器運行緩慢,查了資料后,以為是因為IE的javascript引擎對代碼行數的限制。看了linkFly的回復,又在網上查了查,原來setInterval和setTimeout在瀏覽器最小化或者切換到別的TAB頁的時候,仍然會不斷的執行,只不過會將setInterval和setTimeout內部具體要執行的部分放到隊列中去,待下次瀏覽器頁面回到active狀態的時候,會一次將隊列中的全部執行。結合我的程序,每次setInterval里都會發送兩個ajax請求,並且對返回結果會進行一些處理,30秒執行一次,假設瀏覽器最小化的時間是半個小時,那在窗口再次active時,一下會發送120個請求,而且我的頁面上,還不止一個setInterval,這么計算一下,還真是恐怖,IE報運行緩慢也就可以理解了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM