我有一个自定义幻灯片对象来执行名称在网站上指示的常用内容.除非我在Chrome中切换标签并返回网站标签,否则一切正常.当发生这种情况时,幻灯片放映并开始淡化图像,而不考虑给定的setInterval间隔.找不到与此相关的任何问题,所以我想至少知道代码或软件问题是否存在问题.
这是代码(与jQuery一起使用):
$(function() {
// slideshow
var slideshow = {
id : false,
current : 0,
count : 0,
interval : false,
init : function(data) {
if (!data)
return false;
$.each(data, $.proxy(
function(index, value) {
this[index] = data[index];
}, this)
);
this.count = this.images.length;
for (x=1;x<=this.count;x++)
$('#slider ul.nav').append('<li></li>');
$('#slider ul.nav li').live('click', function()
{
slideshow.click(this);
});
$('#slider ul.nav li:eq(0)').addClass('on');
$('#slider ul.nav').css('width', (15*this.count)+'px');
return true;
},
start : function () {
slideshow.id = setInterval(function() { slideshow.action(); }, slideshow.options.interval);
},
stop : function() {
clearInterval(slideshow.id);
},
action : function() {
slideshow.current < (slideshow.count-1) ? slideshow.current++ : slideshow.current = 0;
$('#slider img').fadeOut('normal', function() {
$('#slider img').attr('src', slideshow.images[slideshow.current].url);
$('#slider ul.nav li').removeClass('on');
$('#slider ul.nav li:eq('+slideshow.current+')').addClass('on');
$('#slider div.title').html(slideshow.images[slideshow.current].title);
$('#slider div.description').html(slideshow.images[slideshow.current].description);
$('#slider a.more').attr('href', slideshow.images[slideshow.current].target);
}).fadeIn('normal');
return true;
},
click : function(o) {
slideshow.stop();
var index = $('#slider ul.nav li').index(o);
slideshow.current = index;
$('#slider img').fadeOut('normal', function() {
$('#slider img').attr('src', slideshow.images[index].url);
$('#slider ul.nav li').removeClass('on');
$(o).addClass('on');
$('#slider div.title').html(slideshow.images[index].title);
$('#slider div.description').html(slideshow.images[index].description);
$('#slider a.more').attr('href', slideshow.images[index].target);
}).fadeIn('normal');
slideshow.start();
return true;
},
};
slideshow.init(slider);
slideshow.start();
});
解决方法:
我倾向于使用setInterval()重复使用setTimeout() – 因此setInterval()会出现很多问题,并且您不知道浏览器的繁忙程度以及间隔是否真实.
浏览器不会完全遵守您选择的超时或间隔.这主要是为了安全;防止大量事件搞乱浏览器正常运行的能力. Chrome更适合更准确地兑现计时器,例如,当选项卡在后台(see this answer)时,它仍会显着降低计时器的速度.
如果你在现有的slideshow.action()调用期间设置了一个带有setTimeout的新计时器,那么当浏览器无法跟上时,你就不会让事件排队,但是当浏览器是能够这样做.
您仍然可以使用计时器ID停止计时器,该ID将经常更改.