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休眠问题。

时间: 2024-12-09 08:50:54

javascript的setTimeout以及setInterval休眠问题。的相关文章

javascript中setTimeout和setinterval的区别是?

setTimeout只运行一次,也就是说设定的时间到后就触发运行指定代码,运行完后即结束.如果运行的代码中再次运行同样的setTimeout命令,则可循环运行. setinterval是循环运行的,即每到设定时间间隔就触发指定代码.这是真正的定时器. serinterval使用简单,而setTimeout则比较灵活,可以随时推出循环,而且可以设置为按不固定的时间间隔来运行,比如第一次1秒,第二次2秒,第三次3秒...... setTimeout  定义和用法:  setTimeout()方法用于

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

Javascript用来处理延时和定时任务的setTimeOut和setInterval函数应用非常广泛,它们都用来处理延时和定时任务,比如打开网页一段时间后弹出一个登录框,页面每隔一段时间发送异步请求获取最新数据等等.但它们的应用是有区别的. setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式,而setInterval()则是在每隔指定的毫秒数循环调用函数或表达式,直到clearInterval把它清除.也就是说setTimeout()只执行一次,setInterval()

javascript使用setTimeout、setInterval时找不到变量的问题(1)

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

javascript定时器:setTimeout与setInterval

概述: setTimeout:在指定的延迟时间之后调用一个函数或者执行一个代码片段,只执行一次: setInterval:周期性地调用一个函数(function)或者执行一段代码,重复执行: 语法格式及示例: setTimeout: var timer=setTimeout(function(){ //要执行的代码 code },delay); * delay 是延迟的毫秒数 (一秒等于1000毫秒),函数的调用会在该延迟之后发生.但是实际的延迟时间可能会稍长一点 * code  是delay毫

【JavaScript】setTimeout与setInterval

setTimeout经常与setInterval混用,这东西常见于定时调用一段函数,比如在<[JavaScript]一个同步于本地时间的动态时间>(点击打开链接)中一个简单的setInterval时钟,你也可以写成如下的代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.d

JavaScript定时器 setTimeout与setInterval 浅析

一. 前情提要 1)JavaScript 是运行在单线程的执行环境中的 2)由浏览器安排事件的执行顺序 二.setTimeout 使用场景: 设定代码在未来的某个时间执行,而执行的时机是不能保证的. 工作方式: 在特定的时间过去之后将时间插入执行队列,注意,并不是立即执行 三.重复的定时器 setInterval 使用场景: 在设定的时间段内在代码执行队列中插入一段待执行代码 注意: 当有定时器中的代码正在执行时,会跳过这次插入 缺点:即使跳过了某些间隔代码的执行,在定时器代码执行时间比设定的时

JavaScript定时机制setTimeout与setInterval研究

JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感, 例如 setTimeout(function() { alert('你好!'); }, 0); setInterval(callbackFunction, 100); 认为setTimeout中的问候方法会立即被执行,因为这并不是凭空而说,而是JavaScript API文档明确定义第二个参数意义为隔多少毫秒后,回调方法就会被

setTimeout,setInterval运行原理

function a() { setTimeout(function(){alert(1)},0); alert(2); } a(); 和其他的编程语言一样,Javascript中的函数调用也是通过堆栈实现的.在执行函数a的时候,a先入栈,如果不给alert(1)加setTimeout,那么alert(1)第2个入栈,最后是alert(2).但现在给alert(1)加上setTimeout后,alert(1)就被加入到了一个新的堆栈中等待,并"尽可能快"的执行.这个尽可能快就是指在a的

Javascript 笔记与总结(2-13)定时器 setTimeout 和 setInterval

定时器可以让 js 效果每隔几秒钟执行一次或者 n 秒之后执行某一个效果.定时器不属于 javascript,是 window 对象提供的功能. setTimeout 用法: window.setTimeout('语句',毫秒); //指定毫秒后执行一次语句 [例] <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>D