我有一个使用jquery的setIntervall()函数无限滑动图像的网站。
在Chrome 13中调用该页面时,我会切换到另一个标签,几秒钟后返回,图像滑动发生得更快,好像它试图保持到原来的位置,如果它没有切换到另一个标签
我该如何解决这个问题?
$(window).load(function() {
setInterval(nextSlide, 3500);
});
function nextSlide(){
offset += delta;
$("#slideContent").animate({left: -1 * offset}, 1000);
}
解决方案:
我选择了jfriend00的第一个建议。现在,当窗口变为非活动状态时,我会关闭计时器。
可以找到这样做的简单代码here。
答案 0 :(得分:16)
一开始我想为所有的错误道歉 - 我的英语并不完美。
您的问题的解决方案可能非常简单:
$(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 - changes
window.setTimeout()方法现在限制发送不超过一个 非活动选项卡中的每秒超时。此外,它现在夹紧嵌套 超时到HTML5规范允许的最小值:4 ms(而不是用于钳位的10 ms)。
在这里你可以阅读,动画如何工作 - 它多次触发setInterval函数。 How animate really works in jQuery
答案 1 :(得分:3)
当标签页在后台时,Chrome的最新版本显然会降低setInterval的操作速度,然后当您将该页面向前移动时,它会尝试赶上。
在Chromium博客上,Google表示:
在即将推出的Chrome 11版本中,即使是使用setTimeout和setInterval的网页,我们也计划减少CPU消耗。对于后台选项卡,我们打算每秒运行每个独立计时器不超过一次。此更改已在Chrome开发者频道和金丝雀版本中实施。
您的间隔为3.5秒,但动画本身可能使用更短的计时器。
解决问题的可能方法:
最好的选择可能是找出何时停止然后重新开始动画。
类似的问题:Chrome: timeouts/interval suspended in background tabs?。
仅供参考,Chrome提供了用于检测网页可见性的新实验API。你可以在这里阅读:http://code.google.com/chrome/whitepapers/pagevisibility.html。当页面可见但没有焦点时,它有助于解决问题。
答案 2 :(得分:0)
您是否尝试过根本不使用setInterval
或setTimeout
,但只需使用complete
功能的animate
功能启动下一张幻灯片? delay
函数设置为2500(即,从setInterval
的3500中减去的动画为1000)。我没有尝试使用Chrome,所以如果有效,请告诉我。
var slider = function(n){
$("#slideContent").delay(2500).animate({left: -1 * n * delta},
1000,
function(){slider(n+1)}
);
};
slider(1);
答案 3 :(得分:0)
嘿,你在使用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);
答案 4 :(得分:0)
尝试使用setInterval()
<script type="text/javascript" src="js/jquery-1.5.js"></script>
<script type="text/javascript">
var i=1;
$(document).ready(function(){
slideShow();
$("#next").click(function(){
slideShow();
});
});
function slideShow(){
if(i<3){
$("#slide-container").animate({ left:"+=35px" }, { duration:500})
$("#slide-container").animate({ left:"-=735px" }, { duration:250})
i++;
}
else {
$("#slide-container").animate({ left:"+=1400px" }, { duration:1000})
i=1;
}
setTimeout('slideShow()',2000);
}
</script>