如何使间隔计时器重启?

时间:2015-02-05 09:55:30

标签: javascript jquery timer setinterval repeat

首先:我检查类似的问题,但不理解它们。 在堆栈溢出的一些温和的家伙的帮助下,我曾经在我的网站上实现了以下间隔计时器序列。基本上它是一种预告片,它在自动幻灯片中起作用的例子(工作属性作为数组中定义的定时值 - 因此它可以保持灵活性,可以通过稍后更新数组值来改变序列和时间)。 / p>

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 );

现在这一切都很有效。但现在我有了这个想法,而不是在末尾停止拖车滑块以使其自身重复(直到用户通过鼠标点击退出或触摸输入网站的内容)

我很难在这里尝试一切:

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();

但这也不起作用。有人愿意帮助我,让它保持可理解吗?非常感谢!

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

我相信这应该有效:

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

这只是在时间间隔过去后重新启动计时器