Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使浏览器绘制?_Javascript_Dom - Fatal编程技术网

Javascript 如何使浏览器绘制?

Javascript 如何使浏览器绘制?,javascript,dom,Javascript,Dom,假设我有以下客户端代码: var d=document.createElement('div'); d.style.position='absolute'; d.style.width='1em'; d.style.height='1em'; d.style.background='red'; document.body.appendChild(d); for(var i=1e7;i;--i); 它创建一个红方块,并在循环中倒计时。现在,我必须等待倒计时准备就绪,然后才能看到红场。倒计时开始前

假设我有以下客户端代码:

var d=document.createElement('div');
d.style.position='absolute';
d.style.width='1em';
d.style.height='1em';
d.style.background='red';
document.body.appendChild(d);
for(var i=1e7;i;--i);
它创建一个红方块,并在循环中倒计时。现在,我必须等待倒计时准备就绪,然后才能看到红场。倒计时开始前展示广场的最佳方式是什么?我想在超时后执行倒计时:

setTimeout(function(){
    for(var i=1e7;i;--i);
},1);
还是有更好的办法?我不想将代码重新编译成WebWorkers。在我开始一些耗时的线性代码之前,只有一种简单的方式来显示消息


我的现实情况是,我有一个庞大的计算,需要一些时间,我想在它开始之前显示一条消息。

如果这是一个庞大的计算,它可能会锁定你的浏览器,给你的用户带来非常糟糕的体验。如果是这样的话,你可以考虑查看WebWork中的计算,并将完成的消息发布回用户。

更简单地说,您可以使用setTimetout或setInterval执行某些操作,并在默认情况下显示消息:

我们等待DOM准备就绪,显示带有相应等待消息的红色框

$(document).ready(function() {
    var n = 99;
    $("#counter").html("Please Wait"); 

    // Some long calculation; the red box is showing
    var a = 0;
    for(var i = 0; i < 99999; ++i) {
        for(var j = 0; j < 9999; j++) {
            a++;
        }
    }

    var counter = setInterval(function() {
        $("#counter").html(n);
        n--;

        if(n <= 0) {
            clearInterval(counter);
        }

    }, 1000);
});
$(文档).ready(函数(){
var n=99;
$(“#counter”).html(“请稍候”);
//长时间的计算;红色框显示
var a=0;
对于(变量i=0;i<99999;++i){
对于(var j=0;j<9999;j++){
a++;
}
}
变量计数器=设置间隔(函数(){
$(“#counter”).html(n);
n--;

if(n如果您使用html5,您可以使用辅助程序进行异步计算。计算在哪里进行?客户端还是服务器端?(正如akonsu所说,如果是客户端,您应该使用辅助程序)如果工作程序不可能,例如因为使用了一个也可以进行屏幕更新的API,该怎么办?如果您不想使用工作程序,那么将工作分为多个块。在
setInterval
回调函数中运行每个块。您的
div
没有出现的原因是您没有将控制权让给浏览器在你进入长时间的计算之前。如果你在计时器回调中进行此计算,那么它不会产生这种效果。是不是只有我…我看不到任何延迟发生?我们在这里谈论的是纳秒类型的延迟还是什么?我一直假设javascript在继续下一条指令之前完成了一条指令,在这种情况下,平方得到它在循环之前写入屏幕。我缺少什么?这将等待DOM准备就绪。然后进行计算。然后显示请等待一秒钟,最后从99倒数到0。所以这不是我的意思,因为我想看到请在计算之前等待。呃,不,它没有。它设置了“请等待”在计算之前,如代码所示。你自己尝试过吗?我在Chrome 29和Firefox24上尝试过你的代码,它的行为与我描述的一样。代码确实清楚地表明“请稍候”在计算之前设置。但这并不意味着它在计算之前显示。这就是我想要的。当我按“运行”时,我必须等待几秒钟(我将9999转换为99999)计算准备就绪。然后我看到请等待一秒钟,然后是倒计时。我想看到在我按下“运行”后请立即等待。我从您那里了解到您有这种情况。您使用的是什么浏览器?