2010-01-04 103 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); 
相关问题