javascript - 如何让间隔定时器自动重新启动?

标签 javascript jquery timer setinterval repeat

首先:我查了类似的问题,但是没看懂。 在堆栈溢出的一些好心人的帮助下,我曾经在我的网站上实现了以下间隔计时器序列。基本上,它是一种预告片,在自动幻灯片中工作示例(工作属性为数组中定义的计时值 - 因此它可以保持灵活,可以通过稍后更新数组值来更改顺序和计时)。

JS:

var trailer = [1,3,4,2, …]  // works contained in automatic trailer
// define here individual properties of each work
var works = { 
    1:  { …, time: 95 },
    2:  { …, time: 150 },
    3:  { …, time: 105 },
    4:  { …, time: 50 }, 
    …
};

//automatic trailer show timer
var timeFrames = {};
var currentWork = trailer[0];
var time = 0;

for ( var i = 1; i < trailer.length; i++ ) {    
    var previousWork = trailer[i-1];    
    var currentWork = trailer[i];   
    var addTime = works[previousWork]['time'];
    time = time + addTime;
    timeFrames[time] = currentWork;
};
var maxStep = time + 90;

var timer;
var timerPaused = false;
var stepSize = 100;
var currentStep = 0;

var intervalTimer = function() {

    if ( !timerPaused ) { currentStep ++; }
    if ( !!timeFrames[currentStep] ) {

        fadeTrailerWorks( timeFrames[currentStep] );
        workChart = timeFrames[currentStep];    
    }
    if ( currentStep >= maxStep ) {

        timer = window.clearInterval(timer);
        currentStep = 0;        
    }
}

在 documentReady 下的某个位置,它被称为:

// start automatic trailer fader                        
timer = window.setInterval( intervalTimer, stepSize );

现在这一切都运行得非常好。但现在我有了一个想法,而不是在最后停止预告片 slider 以使其不断重复(直到用户通过鼠标单击或触摸输入网站内容退出)

我很难在这里尝试我能想象到的一切:

if ( currentStep >= maxStep ) { 

    // instead of: timer = window.clearInterval(timer);
    currentStep = 0;        
}

并且陷入了各种各样的麻烦:计时器在重复之前暂停了很长时间,计时器重复得越来越快等等......

我想这最终是一个非常简单的行添加,但由于我很确定不完全理解这段代码,所以我需要一些帮助!提前致谢! 我知道这个问题非常具体,可能对很多人没有帮助。为此我深表歉意。

编辑:

好的。因此,假设这个计时器不太正确,我尝试用自己的方式重写它(以便理解和学习一些东西),但我无法超越它:-(我尝试过:

var trailer = [1,3,4,2, …]  // works contained in automatic trailer
// individual properties of each work
var works = { 
    1:  { …, time: 95 },
    2:  { …, time: 150 },
    3:  { …, time: 105 },
    4:  { …, time: 50 }, 
…
};
// get the time property of each work and store it in an array
var trailerTimes = [];
for ( var index in trailer ) {
    trailerTimes.push( works[trailer[index]]['time'] );
}
// timer function
var timer = function() {        

    if ( !timerPaused && steps < trailerTimes.length ) {
        // do something here
        setTimeout( function() {                
            timer();
        }, trailerTimes[steps] );   
    }
    steps ++
}
timer();

但这也不起作用。有人愿意在这里帮助我并使其易于理解吗?非常感谢!

最佳答案

一个想法是停止计时器,重置计数器并再次启动计时器

if ( currentStep >= maxStep ) { 
    timer = window.clearInterval(timer);
    currentStep = 0;    
    timer = window.setInterval( intervalTimer, stepSize );    
}

关于javascript - 如何让间隔定时器自动重新启动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28340913/

相关文章:

javascript - zIndex 在组件中不起作用

JavaScript 函数到 AngularJS

javascript - 在 Wordpress 中提交 Hubspot 表单后下载 pdf 文件

javascript - 如何向下滚动到动态添加的 ul 中的最后一个 li 项?

javascript - GIF 在页面加载时卡住

jquery - 动态显示更改 iframe 滚动

javascript - 使用 css 将 div 从一个父级移动到另一个父级

c# - 在 C# 中,我应该在哪里保存计时器的引用?

java - 添加计时器并显示标签文本

c# - Windows 服务上的多个计时器未正确触发