2009-07-15 67 views
0

我有一个特殊的页面,它使用了很多必须由Javascript例程初始化的小部件(大约400,这是一个复杂的部件)。这需要一些时间(在较慢的机器上甚至需要20秒)。现在我想我可以显示进度指示器(带有百分比标签的简单文本字段),而不是页面,但是我发现即使我连续更新它,正在进行的任务也会阻止所有内容,并且我看不到更新。所以一切都会一直冻结,直到大量的JavaScript任务完成。我甚至做了以下实验,但冻结以及(和firefox说该脚本正在太长,无法完成...):使用Javascript监视长任务

function a(){ 
    for (var i = 0; i < 5000000000000000; i++){ 
     abb = i;   
    } 
} 

var abb; 

function c(){ 
    var ef = document.getElementById("pip"); 
    ef.innerHTML = abb; 

} 

function b(){ 

    setInterval(c, 50); 
    setTimeout(a, 1000); 
} 

是来找我的唯一的解决办法是要打破长期工作在片断和更新标签....但我想知道是否有另一种解决方案!上帝,JS需要尽快线程:) :)

任何想法?

回答

1

我可以假定脚本正在执行onLoad事件,以便用户在运行时不坐在空白页面上?

如果是,那么我建议将脚本分解为单独的函数,创建这些函数的数组,遍历该数组并遍历函数,并在每个N函数后更新进度指示器。

如果它是一个面向公众的网站,请尽量减少绝对需要体验页面的JavaScript数量。以及每个小部件所需的初始化数量。解释史密斯代理人:如果没有人等待看到他们,那么手风琴式折叠树有什么好处?

+0

+1当然!我想这件事时,其他一切都失败 – ATorras 2009-07-15 11:59:24

0

如果您想要线程,您可以使用LiveConnect并创建真正的Java线程(如果安全管理器允许的话)。

如果你不能使用C的协程设计模式。

问候。

0

这个工作,它假设你要调用B开始它,并有一个div id为“点子”

<html> 
<head> 
    <script type="text/javascript"> 

    var i; 
    var state = 0; 

    function a(){ 

     switch(state){ 

     case 0: 
      i = 0; 
     case 1: 
      i++; 
      for (; i < 5000000000000000; i++){ 
       abb = i; 
       if (i%1000 == 0){ 
        setTimeout(a, 1); 
        state = 1;    
        return;    
       }     
      } 
     break; 
     } 
    } 

    var abb; 

    function c(){ 
     var ef = document.getElementById("pip"); 
     ef.innerHTML = abb; 

    } 

    function b(){ 

     setInterval(c, 50); 
     setTimeout(a, 1000); 
    } 

    </script> 
</head> 
<body onload="javascript:b();"> 
    <div id = "pip">test</div> 
</body> 
</html>