[英]JavaScript - Restart setTimeout timer in a recursive function
我正在尝试在 css 和 js 中制作自动幻灯片。 我有一个在指定时间后无限循环图像数组(在幻灯片中)的函数。
function autoSlide(){
carouselSlide.style.transition = "transform 1s ease-in-out";
counter++;
carouselSlide.style.transform = 'translateX(' + (-size * counter) + 'px)';
t = setTimeout("autoSlide()", time);
}
但是如果我通过按下按钮手动更改幻灯片,我想重置计时器time
。 我试过这个,但没有用:
function autoSlide(){
carouselSlide.style.transition = "transform 1s ease-in-out";
counter++;
carouselSlide.style.transform = 'translateX(' + (-size * counter) + 'px)';
nextBtn.addEventListener('click',()=>{
clearTimeout(t);
})
t = setTimeout("autoSlide()", time);
}
任何帮助将非常感激。
谢谢。
我没有看到您在函数范围之外定义区间变量,因此它可能会丢失。 另外,这不应该是setInterval
与setTimeout
吗? 您可以使用任何一种,但如果您的目标是无限重复直到某个条件,则setInterval
更合适
let interval = setInterval(autoSlide, time); // variable being initialized outside function scope
nextBtn.addEventListener('click',()=>{
clearInterval(interval);
interval = setInterval(autoSlide, time)
})
function autoSlide(){
carouselSlide.style.transition = "transform 1s ease-in-out";
counter++;
carouselSlide.style.transform = 'translateX(' + (-size * counter) + 'px)';
// ... presumably other logic to progress your slideshow every 'time'
}
一种方法是在您单击时重新创建计时器。 不仅要删除计时器,还要重新创建它。
nextBtn.addEventListener('click',()=>{
clearTimeout(t);
t = setTimeout(autoSlide, time);
})
ps:学习总是好的,但不要尝试太多重新发明轮子。 使用此示例: https : //owlcarousel2.github.io/OwlCarousel2/demos/basic.html响应式、自动、触摸支持等...
请使用setInterval
而不是setTimeout
。 像这样:
function autoSlide(){
carouselSlide.style.transition = "transform 1s ease-in-out";
counter++;
carouselSlide.style.transform = 'translateX(' + (-size * counter) + 'px)';
}
var t = setInterval(autoSlide, time)
nextBtn.addEventListener('click',()=>{
clearInterval(t);
t= setInterval(autoSlide, time)
})
如果这是一个轮播,您希望您的超时时间相同,但在您单击按钮时重置计数器。
这是一个函数,它设置你的计时器和按钮,并返回一个控制超时的闭包(一个在返回后保留其前一个词法环境中的信息的函数)。
function handler() { const time = 1000; let counter = 0; const button = document.addEventListener('click', () => counter = 0); return function loop() { // Your transform code goes here console.log(counter); counter++; setTimeout(loop, time); } } // autoSlide is the returned function const autoSlide = handler(); autoSlide();
<button>Stop the sliding!</button>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.