0

我有一个特定的页面,它使用了许多必须由 Javascript 例程初始化的小部件(大约 400 个,这是一个复杂的小部件)。这需要一些时间(在较慢的机器上甚至需要 20 秒)。现在我想我可以显示一个进度指示器(一个带有百分比标签的简单文本字段),而不是页面,但我发现即使我不断更新它,正在进行的任务也会阻止一切,我看不到任何更新。所以一切都保持冻结,直到繁重的 javascript 任务完成。我什至做了以下实验,但也冻结了(Firefox 说脚本完成时间太长......):

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 需要线程尽快... :)

有任何想法吗?

4

3 回答 3

1

我可以假设脚本是从 onLoad 事件中执行的,这样用户在运行时就不会坐在空白页上吗?

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

如果它是一个面向公众的网站,请尽量减少体验页面所必需的 JavaScript 数量。以及每个小部件需要的初始化量。套用史密斯特工的话说:如果没有人等着看,手风琴折叠树有什么用?

于 2009-07-15T11:50:44.860 回答
0

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

如果不这样做,您可以使用 C 的协程设计模式。

问候。

于 2009-07-15T11:56:51.590 回答
0

这行得通,假设你必须调用 b 来启动它并有一个 id = "pip" 的 div

<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>
于 2009-07-15T13:50:27.267 回答