我有一个特定的页面,该页面使用了许多必须由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需要尽快线... :)

有任何想法吗?

有帮助吗?

解决方案

我可以假设脚本是从Onload事件中执行的,以便用户在运行时不会坐在空白页面上?

如果是的,那么我建议将脚本分为单独的函数,创建这些功能的数组,通过该数组进行迭代并评估功能,并在每个N函数之后更新进度指标。

而且,如果这是一个面向公共的网站,请尝试最大程度地减少体验页面绝对必要的JavaScript数量。以及每个小部件需要的初始化量。用史密斯(Smith)解释:如果没有人等待看见它们,雅阁折叠的树木有什么好处?

其他提示

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

如果不,您可以使用C的Coroutines设计模式。

问候。

这起作用了,假设您必须致电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>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top