来自另一个选项卡时,Jquery setInterval太快
我有一个使用jquery的setIntervall()函数无限滑动图像的网站。
在Chrome 13中调用该页面时,我切换到另一个选项卡几秒钟后返回,图像滑动发生得更快,好像它试图跟上它没有切换到另一个选项卡的位置。
我该如何解决这个问题?
$(window).load(function() { setInterval(nextSlide, 3500); }); function nextSlide(){ offset += delta; $("#slideContent").animate({left: -1 * offset}, 1000); }
解:
我选择了jfriend00的第一个建议。 现在我在窗口变为非活动状态时关闭计时器。
可以在这里找到这样做的简单代码。
一开始我想为所有的错误道歉 – 我的英语并不完美。
您的问题的解决方案可能非常简单:
$(window).load(function() { setInterval(nextSlide, 3500); }); function nextSlide(){ offset += delta; $("#slideContent").stop(true,true).animate({left: -1 * offset}, 1000); }
非活动浏览器选项卡缓冲一些setInterval或setTimeout函数。 stop(true,true) – 将停止所有缓冲的事件并仅执行immadietly上一次动画。 Firefox> 5.0中也会出现此问题 – 阅读本文: Firefox 5 – 更改
window.setTimeout()方法现在钳制在非活动选项卡中每秒发送不超过一次超时。 此外,它现在将嵌套超时限制为HTML5规范允许的最小值:4 ms(而不是用于钳位的10 ms)。
在这里你可以阅读,动画如何工作 – 它多次触发setInterval函数。 动画如何在jQuery中真正起作用
当选项卡页面在后台时,最新版本的Chrome显然会减慢setInterval的操作,然后当您将该页面向前移动时,它会尝试赶上。
在Chromium博客上,Google表示:
在即将发布的Chrome 11版本中,我们计划减少CPU消耗,即使对于使用setTimeout和setInterval的页面也是如此。 对于后台选项卡,我们打算每秒运行每个独立计时器不超过一次。 此更改已在Chrome开发者频道和金丝雀版本中实施。
您的间隔是3.5秒,但动画本身可能使用更短的计时器。
解决问题的可能方法:
- 窗口不可见时停止计时器/动画。 窗口变为可见时重新启动计时器/动画。
- 而不是setInterval,使用setTimeout,然后每次触发时重置setTimeout以创建自己的重复间隔 – 尽管在你的情况下,可能是jQuery使用定时器是问题 – 我不知道。
- 减慢你的计时器,这样他们就不会碰到这个(再次可能是jQuery内部而不是你自己的计时器)。
最好的选择可能是找出何时停止然后重新启动动画。
类似的问题: Chrome:超时/间隔在后台标签中暂停? 。
仅供参考,Chrome提供了用于检测网页可见性的新实验API。 您可以在此处阅读相关内容: http : //code.google.com/chrome/whitepapers/pagevisibility.html 。 当您的页面可见但没有焦点时,它有助于解决问题。
嘿,你在使用Jquery 1.6吗?
这可能是原因,因为1.6使用requestAnimationFrame进行动画制作。 您可能需要检查此页面以替换setInterval,clearInterval
http://blog.blenderbox.com/2011/06/24/jquery-1-6-1-and-setinterval/
代码: https ://gist.github.com/1002116 [编辑:更新源代码,edit2:由于firefox错误,目前无法使用firefox。 – 我已经降级到JQuery 1.5]
来自博主:
然后,在调用setInterval(func,poll)的地方,现在调用requestInterval(func,poll)。 在你调用clearInterval(interval)的地方,你现在调用clearRequestInterval(interval);
您是否尝试过根本不使用setInterval
或setTimeout
,只是使用animate
函数的complete
function来启动下一张幻灯片? delay
函数设置为2500(即,从setInterval
的3500中减去的animate为1000)。 我没有尝试使用Chrome,所以如果有效,请告诉我。
var slider = function(n){ $("#slideContent").delay(2500).animate({left: -1 * n * delta}, 1000, function(){slider(n+1)} ); }; slider(1);
尝试setInterval()
它的工作原理