javascript的setTimeout以及setInterval休眠问题。
前端码农们在做项目中时候,必定不可少的需要做到轮播效果。但是有些特殊的需求,比如:

需要做到第一个容器内容轮播滚动之后,第二个容器内部再轮播滚动,再第三个容器内容轮播滚动。
这时候我的一开始的思路是:每个容器都看成一个单独的轮播效果,既然是依次的滚动就设定滚动开始时间差,三个setTimeout()分别延迟差。
HTML 代码:
<div id="warp">
<div class="items">
<ul class="island s1">
<li>111</li>
<li>222</li>
<li>333</li>
</ul>
</div>
<div class="items">
<ul class="island s2">
<li>444</li>
<li>555</li>
<li>666</li>
</ul>
</div>
<div class="items">
<ul class="island s3">
<li>777</li>
<li>888</li>
<li>999</li>
<li>000</li>
</ul>
</div> </div>
CSS 代码:
.items{height: 18px;overflow: hidden;margin-bottom: 10px;border-bottom: 1px dashed #999;}
JAVASCRIPT 代码:(基于jquery的实现)
var uls = $("#warp").find(".island"),
lh = uls.find('li').height(),
size = uls.size(),
Global=[];//全局变量
uls.each(function(i,el){
$(el).find('li').first().clone(true).appendTo($(el));
});
/*动画效果*/
function animates(i){
Global[i]==undefined&&(Global[i]=0);
Global[i]++;
_els =uls.eq(i);
var len = _els.find('li').length;
_els.animate({"marginTop":-Global[i]*lh+"px"},600,function(){
if(Global[i] == len-1){
Global[i]=0;
_els.css({"margin-top":"0px"});
}
});
};
function interval(i){
setInterval(function(){
animates(i)
},5000);
};
for(var x=0;x<size;x++){
(function(x){
setTimeout(function(){
interval(x);
},650+x*650);
})(x)};
一开始的时候我发现都是OK的,但是当我切换到别的页面,或者暂时最小化的时候,轮播就变得杂乱无章。这个问题困扰我很久,到公司请教
大牛同事,他说可能是 setInterval休眠问题导致。
经过仔细的查阅资料以及实践,发现当页面最小化时候或者切换网页浏览其他网页等情况时, setInterval是会暂时进入“休眠”状态,但是并不是不执行程序,它会把需要执行的操作放在队列中 ,等到下次窗口一打开的一瞬间把队列里面的全部执行,由于程序处理太快我们大部分时候并没有注意到这个问题。但是你去看所有网站的轮播效果,
假设现在你轮播的是第四张大图,下次打开时候播放的可能是任意的。
再分析上面的程序:
我们让程序分别过650ms, 1300ms,1950ms执行如果窗口一直是这个是本窗口,也就是没有进行休眠。程序可以照常执行。
如果窗口最小化,程序进入休眠,会把队列中的操作在很快时间内一起执行,所以程序一下子就乱啦。
那如何解决这个问题呢?还是想了啦jquery的animate,如果在动画animate的回调中进行递归,进入下次的轮播。那不就完美解决!!
让我们来看程序:
JAVASCRIPT代码:
var uls = $("#warp").find(".island"),
lh = uls.find('li').height(),
size = uls.size(),
i = 0;
uls.each(function(i,el){
$(el).find('li').first().clone(true).appendTo($(el));
});
function animates(i){
var ul = $('.items').eq(i).find('ul');
if(!ul){return false;}
var count = parseInt(ul.attr("count-role")||0);
count++;
var len = ul.find('li').length;
ul.animate({"marginTop":-count*lh+"px"},600,function(){
if(count == len-1){
count=0;
ul.css({"margin-top":"0px"});
}
ul.attr("count-role",count);
animates(++i);
});
};
function interval(){
setInterval(function(){
animates(i)
},5000);
};interval()
这样就完美解决了这个问题。
我猜想可能由于浏览器的特殊性,它的资源有限。所以采用这个策略,也是可以理解的。
javascript的setTimeout以及setInterval休眠问题。的更多相关文章
- Javascript的setTimeOut()和setInterval()的定时器用法
Javascript用来处理延时和定时任务的setTimeOut和setInterval函数应用非常广泛,它们都用来处理延时和定时任务,比如打开网页一段时间后弹出一个登录框,页面每隔一段时间发送异步请 ...
- JavaScript的setTimeout和setInterval的深入理解
发表过一片博客<跟着我用JavaScript写计时器>,比较基础.....有网友说应该写一下setTimeout的原理和机制,嗯,今天就来写一下吧: 直奔主题:setTimeout和set ...
- Javascript中setTimeout和setInterval的区别和使用
在javascript中,window对象有两个主要的定时方法,分别是setTimeout 和 setInterval,其语法基本上相同,但是完成的功能取有区别. setTimeout方法是定时程序, ...
- JavaScript的setTimeout()和setInterval()
1. setTimeout()方法 作用:在制定的毫秒数后调用函数或计算表达式 语法: setTimeout(code,millisec) 实例: function timedMsg() { var ...
- JavaScript 关于setTimeout与setInterval的小研究
说明 在开发功能"轨迹播放"时,遇到了一个情况. 原先同事已经开发了一版,这次有个新功能:点击线上任意一点后可以从点击处重新播放. 看了一下原来的版本,发现同时使用了setTime ...
- JavaScript中setTimeout()和setInterval()的区别
含义: setTimeout()和setInterval()经常被用来处理延时和定时任务.使用setTimeout()处理延时任务,而使用setInterval()方法处理定时任务: setTimeo ...
- JavaScript———从setTimeout与setInterval到AJAX异步
setTimeout与setInterval执行 首先我们看一下以下代码打印结果 console.log(1); setTimeout(function() { console.log(2); },1 ...
- javascript使用setTimeout、setInterval时找不到变量的问题
我们在某个作用域内或者在自己定义的一个类里调用setTimeout.setInterval会经常会遇到找不到某个变量的错误. 比如下面这个例子: window.onload = function(){ ...
- javascript定时器:setTimeout与setInterval
概述: setTimeout:在指定的延迟时间之后调用一个函数或者执行一个代码片段,只执行一次: setInterval:周期性地调用一个函数(function)或者执行一段代码,重复执行: 语法格式 ...
随机推荐
- Logistic回归总结
原文:http://blog.csdn.net/dongtingzhizi/article/details/15962797 Logistic回归总结 作者:洞庭之子 微博:洞庭之子-Bing (2 ...
- Code the Tree
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2292 Accepted: 878 Description A tree ...
- JAVAMAIL手动发送邮件
telnet smtp.sina.com 25ehlo hncu/*ehlo命令是SMTP邮件发送程序与SMTP邮件接收程序建立连接后必须发送的第一条SMTP命令,参数<domain>表示 ...
- css笔记04:属性选择器
1.属性选择器: 带有 title 属性的所有元素设置样式: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN ...
- Android 自学之对话框
Android为我们提供了丰富的对话框支持,提供了四种常用的对话框: AlertDialog:功能丰富.实际应用最广泛的对话框. ProgressDialog:进度对话框,该对话框只用于简单的进度条封 ...
- autoscan; aclocal; autoconf; automake --add-missing; ./configure; make
1.autoscan 在源码目录下执行autoscan,生成configure.scan,重命名为configure.in或者configure.ac,然后编辑文件内容: ============== ...
- CF 13E. Holes 分块数组
题目:点这 跟这题BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 一模一样 分析: 分块数组入门题. 具体的可以学习这篇博文以及做国家集训队2008 - 苏煜<对块状链表的一 ...
- Linux 文件/文件夹操作命令
1 cd命令 命令格式:cd [目录名] (cd和目录之间使用空格隔开) cd 进入用户主目录: cd ~ 进入用户主目录: cd - 返回进入此目录之前所在的目录: cd ...
- MySQL数据库中的触发器
--触发器是一类特殊的监控增删改操作,并产生相应的增删改的操作 --1,监视谁 2,监视动作 3,监视时间(之前或之后) 4,触发的事件 --触发器的简单语法 create trigger 触发器名字 ...
- visual studio 2015预览版系统需求
visual studio 2015预览版的系统需求跟visual studio 2013的一样. 支持visual studio 2015 preview的操作系统:Windows 8.1(x86 ...