如何在进行密集计算的同时保持动画gif的运行
How to keep animated gif running while doing intense calculations
我有一个页面,它用Javascript进行一些密集而持久的计算。我想有一个加载动画,告诉用户正在取得进展。我现在有一个动画gif,但在运行Javascript时,整个浏览器窗口都会冻结(gif不会播放(。然后,当它完成时,它就会解冻。计算必须在客户端进行,因此不能在服务器上进行。
有没有一种方法可以防止Javascript在进行计算时冻结页面并停止播放动画?
您还可以使用HTML5 webworkers
(维基百科(在后台运行长时间运行的脚本。这就像javascript的多线程。
它将在除IE之外的最新浏览器中工作。
发现一个使用网络工作者的游戏查看
您可以将工作分成小块,并使用setTimeout
开始下一次迭代,一旦第一次迭代完成,浏览器就有机会更新用户界面。(这是因为浏览器使用一个单独的线程,所以如果它忙于做js,就不能做其他事情(
Javascript处理是单线程的,因此当您的代码正在运行时,不会运行其他动画代码。
您需要将处理设置为批量运行。我不知道你在处理什么,但如果你正在做一些可以很容易划分的事情,那么你可以处理前N个项目,然后使用setTimeout来安排下一个区块在几毫秒内运行。这样,你就给了浏览器时间去做其他需要做的事情。
您可能不再需要它了,但为了防止其他人在谷歌上搜索它,这里有另一个简单的解决方案:
*请注意,只有当这个巨大的脚本执行是由长时间的迭代循环引起时,它才会起作用
-让你的循环像这样:
function AsyncLoop(i, lastLoop, parameters) {
setTimeout(function () {
if (i < lastLoop) {
//whatever you wanna do here
window.console.log('iteration ' + i + ': ' + parameters[i].whatevs);
i++;
AsyncLoop(i, lastLoop, parameters);
}
}, 0);
}
-然后称之为:
AsyncLoop(0, incredblyLongObjectArray.length, incredblyLongObjectArray);
这里有一个小技巧,不使用参数(这样更容易理解(,并带有一个检测所需脚本是否已完成执行的功能:
https://jsfiddle.net/or1mrmer/
如果浏览器冻结,则表示您正在做一些严肃的工作。
解决这个问题的唯一方法是在脚本执行的每秒钟增加100毫秒的睡眠时间。请查看javascript setInterval()
调用。
CSS3动画通常会继续运行,即使JavaScript被阻止(用Chrome 40.0测试(
因此,您可以使用SpinKit或spin.js等库来可视化计算正在进行。
但是,请注意CSS3动画的可用性:
caniuse.com
消除安卓CSS动画神话
我在这里用一个功能示例(带有简单的进度指示器(回答了这个问题。
它使用"yield",当你只想给其他进程一个时间片时,它的使用(和修改现有的JS循环(非常简单,而且它比网络工作者(我也使用过(更容易设置,尤其是如果你已经有一个与全局变量交互的循环。
- 动画、计时和运行循环等问题
- HTML5(Bootstrap)通过函数调用运行动画
- 为什么我的脚本正在运行动画,但没有显示它
- 画布动画似乎不会以60帧/秒的速度运行
- 找不到在 create-js 中运行的动画,未列出任何错误
- 在动画运行时获取矩形的坐标
- 防止请求动画帧一直运行
- 在使用 jQuery 单击不相关的按钮后,如何防止特定动画运行
- jQuery 动画运行一次
- 动画运行完毕后重新启动动画
- 动画运行速度较慢,并且在chrome中没有重新加载页面就不能重播
- requestAnimationFrame动画运行得越来越慢
- YUI:在动画运行时停止事件处理程序的触发
- 动画运行时更新动画速度
- 如何保持横幅动画运行,而改变网页
- Velocity JS动画运行时忽略单击事件
- jQuery动画运行了很多次
- jQuery javascript:当窗口被调整大小时,我如何停止正在进行的动画运行
- 防止在当前动画运行时跳到下一个动画的开头
- 链接点击计数动画运行一次