在运行客户端代码时显示加载gif图像

问题描述:

假设loading css类附加到包含动画gif图像的div(the classic spinner)。在运行客户端代码时显示加载gif图像

$(document).ready(function(){ 

    $(".button").click(function(event){ 
    $(".loading").show(); 
    // time-consuming code running in the browser 
    $(".loading").hide();  
    return false; 
    }); 

}); 

我们已经习惯了看到了微调图像旋转,同时在客户端做一个AJAX请求到服务器,使控制JavaScript引擎,可动画微调,直到Ajax请求的回调回报。

然而,在上面的例子中,没有AJAX参与和“耗时码”位于在客户端,这意味着JavaScript引擎不能动画GIF,同时在客户端上做一些昂贵的工作。

我知道JavaScript中没有(本地)线程,因此如何在执行一些JavaScript代码时显示并旋转微调器?

+0

在显示和隐藏之间调用你的耗时代码... – brso05 2014-11-14 16:18:28

+0

你正在运行什么类型的“耗时”代码?在客户端执行大量的操作是不寻常的,因为它将有效地冻结浏览器,直到该循环完成。 – 2014-11-14 16:20:11

+0

@ brso05如果我这样做,gif图像将不会显示,或者如果显示,它将显示为冻结,即不旋转。 – 2014-11-14 16:21:24

如果情况与您所说的一样,这将是一种罕见的情况,将Web工作人员使用起来是有意义的。很可能你想要以一种可以显示一个冻结的GIF或者尝试根据超时执行部分工作的方式来实现它们,从而允许JavaScript调用堆栈偶尔完成,以便它可以进行UI更新。

与IE10和高达兼容,和几乎一切: https://developer.mozilla.org/en-US/docs/Web/Guide/Performance/Using_web_workers

超时步骤,给你一个想法是随机的,不完整的例子:

function doPartialWork() { 

    //// do one "step" of the complex logic. 

    // If complete, run a callback (and terminate without starting the timer) 
    if (complete) { 
     runCallback(); 
    } 
    else { 
     // Start another slice of work on the next processing cycle 
     setTimeout(doPartialWork, 1); 
    } 
} 

Google员工:如果上面的链接打破了,搜索“网络工作者”的资源。

+0

使用'setTimeout'将任务分割为时间片实际上是一个合理的解决方案:) – 2014-11-14 16:46:57

+0

如果任务完成,您需要停止计时器链接,但是...将'setTimeout'放在'else' 。 – 2014-11-14 16:54:39

+0

@TrueBlueAussie确实。这甚至不是我示例函数中缺少的一半。它的基本思想真的就在那里。 – Katana314 2014-11-14 16:56:29