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

需要做到第一个容器内容轮播滚动之后,第二个容器内部再轮播滚动,再第三个容器内容轮播滚动。

这时候我的一开始的思路是:每个容器都看成一个单独的轮播效果,既然是依次的滚动就设定滚动开始时间差,三个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休眠问题。的更多相关文章

  1. Javascript的setTimeOut()和setInterval()的定时器用法

    Javascript用来处理延时和定时任务的setTimeOut和setInterval函数应用非常广泛,它们都用来处理延时和定时任务,比如打开网页一段时间后弹出一个登录框,页面每隔一段时间发送异步请 ...

  2. JavaScript的setTimeout和setInterval的深入理解

    发表过一片博客<跟着我用JavaScript写计时器>,比较基础.....有网友说应该写一下setTimeout的原理和机制,嗯,今天就来写一下吧: 直奔主题:setTimeout和set ...

  3. Javascript中setTimeout和setInterval的区别和使用

    在javascript中,window对象有两个主要的定时方法,分别是setTimeout 和 setInterval,其语法基本上相同,但是完成的功能取有区别. setTimeout方法是定时程序, ...

  4. JavaScript的setTimeout()和setInterval()

    1. setTimeout()方法 作用:在制定的毫秒数后调用函数或计算表达式 语法: setTimeout(code,millisec) 实例: function timedMsg() { var ...

  5. JavaScript 关于setTimeout与setInterval的小研究

    说明 在开发功能"轨迹播放"时,遇到了一个情况. 原先同事已经开发了一版,这次有个新功能:点击线上任意一点后可以从点击处重新播放. 看了一下原来的版本,发现同时使用了setTime ...

  6. JavaScript中setTimeout()和setInterval()的区别

    含义: setTimeout()和setInterval()经常被用来处理延时和定时任务.使用setTimeout()处理延时任务,而使用setInterval()方法处理定时任务: setTimeo ...

  7. JavaScript———从setTimeout与setInterval到AJAX异步

    setTimeout与setInterval执行 首先我们看一下以下代码打印结果 console.log(1); setTimeout(function() { console.log(2); },1 ...

  8. javascript使用setTimeout、setInterval时找不到变量的问题

    我们在某个作用域内或者在自己定义的一个类里调用setTimeout.setInterval会经常会遇到找不到某个变量的错误. 比如下面这个例子: window.onload = function(){ ...

  9. javascript定时器:setTimeout与setInterval

    概述: setTimeout:在指定的延迟时间之后调用一个函数或者执行一个代码片段,只执行一次: setInterval:周期性地调用一个函数(function)或者执行一段代码,重复执行: 语法格式 ...

随机推荐

  1. LSM Tree解析

    引言 众所周知传统磁盘I/O是比较耗性能的,优化系统性能往往需要和磁盘I/O打交道,而磁盘I/O产生的时延主要由下面3个因素决定: 寻道时间(将磁盘臂移动到适当的柱面上所需要的时间,寻道时移动到相邻柱 ...

  2. ASP.NET MVC 4 让数据库自动迁移

    今天实际测试了下这个方法,可以保持数据库与实体类同步,同时不会出现数据库迁移的提示.但是只能更改实体类来改变数据库,而不能改数据库来改变实体类.所以这才是Code frist,如果通过改数据库表来改动 ...

  3. URAL 1136 Parliament 二叉树水题 BST后序遍历建树

    二叉树水题,特别是昨天刚做完二叉树用中序后序建树,现在来做这个很快的. 跟昨天那题差不多,BST后序遍历的特型,找到最后那个数就是根,向前找,比它小的那块就是他的左儿子,比它大的那块就是右儿子,然后递 ...

  4. 改变linux shell前景色和背景色

    作者:马 岩(Furzoom) (http://www.cnblogs.com/furzoom/)版权声明:本文的版权归作者与博客园共同所有.转载时请在明显地方注明本文的详细链接,未经作者同意请不要删 ...

  5. [未完成]plugin.xml文件

    此文章部分转自:http://fxzcollege6.iteye.com/blog/2013055 关于plugin.xml文件我还总结过一篇文章:http://www.cnblogs.com/Dre ...

  6. iOS用AVAudioPlayer播放m4a音频

    音频文件sound.m4a放到Supporting Files目录 引用头文件 #import <AVFoundation/AVFoundation.h> 定义一个全局的属性: @prop ...

  7. Lombok(1.14.8) - @Log

    @Log @Logs,生成一个日志对象. package com.huey.lombok; import lombok.extern.java.Log; @Log public class LogEx ...

  8. sublime text使用技巧

    常用快捷键 Ctrl + L  选择整行(按住-继续选择下行) Ctrl + KK  从光标处删除至行尾 Ctrl + Shift+K  删除整行 Ctrl + Shift+D  复制光标所在整行,插 ...

  9. 把mvc4彻底搞定(一)

    1 .net web开发方式 webform开发 asp.net mvc开发 2 请求模式 webform方式:客户端向服务端请求一个aspx页面,服务端生成一个页面对象类,调用这个页面对象类的PR方 ...

  10. JSP之session

    index.jsp: <form id="form1" name="form1" method="post" action=" ...