触发setInterval在点击发生一次
triggering setInterval on click happens once
我有一个div,它的背景图像每隔5秒改变一次,我有一个next按钮,它应该清除setInterval定时器并将背景更改为下一个并再次触发setInterval但是当我点击next按钮时,它会将背景更改为下一个,但不会再次触发setInterval。
HTML代码:<div id="slideshow">
</div>
<a href="" id="arrow_right"><i class="fa fa-angle-right"></i></a>
CSS代码:#slideshow {
height:100%;
width:100%;
background: url(../css/img/bg/slide1.jpg) no-repeat;
background-position: center center;
background-size: cover;
}
JS代码:
$(document).ready(function() {
var i = 1;
function bgrepeat(x){
if(typeof(x)==='undefined') {
$('#slideshow').fadeOut(500, function () {
$('#slideshow').css('background-image','url(ui/css/img/bg/slide' + i + '.jpg)');
$('#slideshow').fadeIn(500);
});
i++;
if(i == 5) {
i = 1;
}
} else {
$('#slideshow').fadeOut(500, function () {
$('#slideshow').css('background-image','url(ui/css/img/bg/slide' + x + '.jpg)');
$('#slideshow').fadeIn(500);
});
x++;
if(x == 5) {
x = 1;
}
}
};
var timer = setInterval(bgrepeat , 5000);
var bg = $('#slideshow').css('background-image');
bg = bg.split('slide');
var bgpath = bg[1];
bgpath = bgpath.replace('.jpg")','');
bgpath = parseInt(bgpath,10);
$('#arrow_right').click(function(e) {
e.preventDefault();
bgpath++;
if(bgpath == 5) {
bgpath = 1;
}
$('#slideshow').fadeOut(500, function () {
$('#slideshow').css('background-image','url(ui/css/img/bg/slide' + bgpath + '.jpg)');
$('#slideshow').fadeIn(500);
});
clearInterval(timer);
timer2 = setInterval(bgrepeat(bgpath) , 5000);
});
});
您需要向setInterval
传递一个函数,而不是其调用的结果。
timer2 = setInterval(function() {
bgrepeat(bgpath)
}, 5000);
两个问题:
-
你用的是
timer2
,而你应该用timer
-
你是调用
bgrepeat(bgpath)
并将其返回值传递给setInterval
,你不是将bgrepeat(bgpath)
传递给setInterval
:你可以这样做:
timer = setInterval(bgrepeat.bind(null, bgpath), 5000);
Function#bind
创建了一个新函数,当调用该函数时,它将使用给定的this
值(第一个参数,我们可以使用null
)和您给它的任何其他参数调用原函数。这是ES5的一个特性;如果你需要支持IE8这样的老引擎,可以搜索"Function bind shim"或"Function bind polyfill"来查找shim/polyfill。
相关文章:
- setInterval 只在对象方法上运行一次
- 如何在 window.setInterval 中每分钟运行一次 getJSON 函数
- setInterval()序列中的setTimeout()只触发一次
- Javascript只使用setInterval()调用一个子函数一次
- 我想在窗口加载后只调用一次JavaScript setInterval函数
- JS setInterval() 只触发一次
- setInterval 只运行一次
- setInterval 只运行一次
- 如果 else 条件在下一次使用 setInterval 传递后发生
- Javascript 函数 setInterval() 只工作一次
- 循环动画javascript,SetInterval只工作一次
- 为什么 SetInterval 不起作用(它只工作一次)
- 为什么 setInterval 回调只执行一次
- setInterval in setTimout 在 angularjs 控制器中只触发一次
- setInterval-如何只激发一次
- setInterval()是如何工作的?我可以用它每小时更换一次图像吗
- setTimeOut/setInterval只运行一次
- 如何只运行一次setInterval()
- 运行一次setInterval,然后停止
- Javascript:只运行一次 setInterval