2010-01-04 141 views
0

我使用的eval()在javascript來評價的JS代碼顯著量(不只是JSON,但的函數調用)。在通話期間瀏覽器凍結,即用戶不能滾動瀏覽器或點擊任何內容。有沒有辦法解決這個凍結問題?瀏覽器凍結()

+2

你將不得不放棄比這更詳細。哪個瀏覽器?你的代碼是什麼樣的? – 2010-01-04 22:53:42

回答

4

在大多數瀏覽器的JavaScript運行在UI線程上,所以它會阻止用戶界面爲你描述。要取消阻止的UI是給JS分解成更小的部分,並與setTimeout的把它們串起來(這給線程的控制權交還給瀏覽器UI渲染)的最佳方式

0

你要打破你功能分成較小的部分。我建議將它們與setTimeout結合起來。

在現代瀏覽器中有web workers,可以計算在後臺的數據。

+0

在setTimeout內的每行代碼之後,UI呈現是否恢復? 時候,說,加載初始頁面時,瀏覽器中執行了大量的JavaScript爲什麼不結冰發生呢? – 2010-01-04 23:11:34

+0

這取決於瀏覽器。我相信只有當它是a)最大化CPU時,UI纔會凍結b)javascript操縱HTML/CSS。你應該做自己的測試,我沒有任何數據支持我的說法。 – 2010-01-04 23:15:00

+1

加載初始頁面時執行JavaScript時,UI *會阻止*。大多數JavaScript並不需要那麼長時間,所以希望你不會注意到它。 – bobince 2010-01-04 23:43:56

1

您也可以嘗試通過注入新的腳本到頁面執行代碼:

function executeCode(code) { 
    var element = document.createElement('script'); 
    element.type = 'text/javascript'; 

    try { 
     element.appendChild(document.createTextNode(code)); 
     document.body.appendChild(element); 
    } 
    catch (e) { 
     element.text = code; 
     document.body.appendChild(element); 
    } 
} 

var code = 'alert("hello world");'; 
executeCode(code);