Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.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 如何在JS中强制重新绘制?_Javascript_Html_Repaint - Fatal编程技术网

Javascript 如何在JS中强制重新绘制?

Javascript 如何在JS中强制重新绘制?,javascript,html,repaint,Javascript,Html,Repaint,我正在努力实现的目标: 用户单击一个元素 屏幕显示“正在计算”屏幕 系统执行耗时的数学计算 屏幕显示结果(“完成”) 以下是代码: <div id ="di" onclick="calc()">initial</div> <script> function calc() { var n,a=0; document.getElementById('di').textContent="calculation in progress"; for(n=0;n<

我正在努力实现的目标:

  • 用户单击一个元素
  • 屏幕显示“正在计算”屏幕
  • 系统执行耗时的数学计算
  • 屏幕显示结果(“完成”)
  • 以下是代码:

    <div id ="di" onclick="calc()">initial</div>
    <script>
    
    function calc()
    {
    var n,a=0;
    document.getElementById('di').textContent="calculation in progress";
    for(n=0;n<1000000000;n++) // Here's the time consuming calculation
        {
        a=a+n; // for clarity's sake, I removed a complicated math formula here
        }
    document.getElementById('di').textContent="done "+a;
    }
    </script>
    
    首字母
    函数计算()
    {
    var n,a=0;
    document.getElementById('di').textContent=“正在进行计算”;
    
    对于(n=0;n,您需要等待一毫秒或与工作人员一起进行计算

    第一个示例可能是最简单的,与其直接调用
    calc
    ,不如创建一个新函数

    function caller() {
         // insert "calculation in progress" in the body
        setTimeout(calc, 1);
    }
    

    然后调用调用者

    您需要等待一毫秒或与工作者一起进行计算

    第一个示例可能是最简单的,与其直接调用
    calc
    ,不如创建一个新函数

    function caller() {
         // insert "calculation in progress" in the body
        setTimeout(calc, 1);
    }
    

    然后调用调用者

    IMO一种简单的处理方法是通过计时器函数在“小”块中执行计算,例如:

    function calcFractal(x0, y0, x1, y1) {
        ... compute the fractal for the tile (x0, y0)-(x1, y1) ...
    }
    
    var x = 0, y = 0;
    
    function nextTile() {
        calcFractal(x, y, x+tw, y+th);
        x += tw;
        if (x >= width) {
            x = 0;
            y += th;
        }
        if (y < height) setTimeout(nextTile, 0);
    }
    
    nextTile();
    
    函数计算分形(x0,y0,x1,y1){
    …计算瓷砖(x0,y0)-(x1,y1)的分形。。。
    }
    变量x=0,y=0;
    函数nextile(){
    计算分形(x,y,x+tw,y+th);
    x+=tw;
    如果(x>=宽度){
    x=0;
    y+=th;
    }
    如果(y<高度)设置超时(nextile,0);
    }
    nextTile();
    
    这允许您显示进度(例如,包括低分辨率的分形、计算百分比)和允许中断(例如,在停止按钮上单击
    onclick
    事件)


    如果平铺不是很小,那么开销是可以接受的,仍然可以保持页面对重新绘制和用户交互的合理响应。

    我认为一个简单的处理方法是通过计时器功能在“小”块中执行计算,例如:

    function calcFractal(x0, y0, x1, y1) {
        ... compute the fractal for the tile (x0, y0)-(x1, y1) ...
    }
    
    var x = 0, y = 0;
    
    function nextTile() {
        calcFractal(x, y, x+tw, y+th);
        x += tw;
        if (x >= width) {
            x = 0;
            y += th;
        }
        if (y < height) setTimeout(nextTile, 0);
    }
    
    nextTile();
    
    函数计算分形(x0,y0,x1,y1){
    …计算瓷砖(x0,y0)-(x1,y1)的分形。。。
    }
    变量x=0,y=0;
    函数nextile(){
    计算分形(x,y,x+tw,y+th);
    x+=tw;
    如果(x>=宽度){
    x=0;
    y+=th;
    }
    如果(y<高度)设置超时(nextile,0);
    }
    nextTile();
    
    这允许您显示进度(例如,包括低分辨率的分形、计算百分比)和允许中断(例如,在停止按钮上单击
    onclick
    事件)


    如果平铺不是很小,那么开销是可以接受的,仍然保持页面对重绘和用户交互的合理响应。

    因为现代浏览器可能会延迟重绘以获得更好的帧速率,因此具有
    setTimeout
    的版本可能无法在超时太低的情况下工作

    如果可能的话,你需要使用。如果不可行,那么@Bálint answer应该可以工作,但超时要大得多(在我的Firefox测试中,它开始工作时的超时时间接近20-30)。实际超时值取决于浏览器(可能也取决于系统)


    由于现代浏览器可能会延迟重画以获得更好的帧速率,因此具有
    setTimeout
    的版本可能无法在超时太低的情况下工作

    如果可能的话,你需要使用。如果不可行,那么@Bálint answer应该可以工作,但超时要大得多(在我的Firefox测试中,它开始工作时的超时时间接近20-30)。实际超时值取决于浏览器(可能也取决于系统)


    您还需要在
    setTimeout
    调用之前设置di div文本,以便它实际更新您的意思?它仍然不起作用:初始函数调用者(){setTimeout(calc,1);}函数calc(){var n,a=0;document.getElementById('di')。textContent=“calculation in progress”;for(n=0;n@Zack等同于above@Bálint-我确实读过它们,并粘贴了更新的代码。你能确认我是否做得正确吗?它的行为仍然与你的建议之前相同。@插入“正在进行计算”setTimeout之前调用方函数中的文本。您还需要在
    setTimeout
    调用之前设置di div文本,以便它实际更新您的意思是什么?它仍然不起作用:初始函数调用方(){setTimeout(calc,1);}function calc(){var n,a=0;document.getElementById('di')。textContent=“计算中”;对于(n=0;n@Zack等同于above@Bálint-我确实阅读了它们,并粘贴了更新后的代码。您能确认我是否正确吗?它的行为仍然与您的建议之前相同。@在setTimeout之前,在调用方函数中插入“calculation in progress”文本。