setInterval() is only running once... WTF is going on?
SO is asking for more details but providing a JSFiddle is about as descriptive as I can be? I've tried using an anonymous function and now a callback. I just don't get it? :-/
HTML
<script src="http://code.jquery.com/jquery-2.1.3.min.js"></script>
<div id="qanda-timer-container">
<div class="qanda-timer">
<span id="qanda-time-remaining"></span>
</div>
</div>
JS
function intervalFunc(thinkingTime, answerTime)
{
jQuery('#qanda-time-remaining').text(''+(thinkingTime - 1));
}
function enableTimer(time)
{
var intervalID;
var hasThinkingTime = true;
var thinkingTime = time;
var hasAnswerTime = true;
var answerTime = 10;
if(hasThinkingTime && hasAnswerTime)
{
setInterval( intervalFunc(thinkingTime, answerTime), 1000);
}
setTimeout(function(){
clearInterval(intervalID);
}, time * 1000);
}
enableTimer(30);
You need to wrap the interval handler in a function:
intervalId = setInterval( function() { intervalFunc(thinkingTime, answerTime) }, 1000);
Your code as posted is calling the function and passing the result to setInterval()
. The interval timer isn't running at all!
After you do that, you'll need to fix the problem of maintaining the descending time value. Currently you pass the variable as a parameter and subtract one from it, but you don't update the original variable.
function intervalFunc(thinkingTime, answerTime)
{
jQuery('#qanda-time-remaining').text(''+(thinkingTime));
}
Then change the setInterval
setup:
intervalId = setInterval( function() { intervalFunc(--thinkingTime, answerTime) }, 1000);
}
Your code doesn't work because of this line:
setInterval( intervalFunc(thinkingTime, answerTime), 1000);
Change it into this:
setInterval( function(){
intervalFunc(thinkingTime, answerTime);
}, 1000);
You need to provide a function to setInterval()
, while you are providing undefined
.
This is why it doesn't run.
Running code:
function enableTimer(time) { var elem = jQuery('#qanda-time-remaining'), interval = setInterval( function(){ if(time/1 == time/1 && time) //if(!isNaN(time) && time>0) { elem.text( time-- ); } else { clearInterval(interval); elem.text(0); } }, 1000); } enableTimer(5);
<script src="http://code.jquery.com/jquery-2.1.3.min.js"></script> <div id="qanda-timer-container"> <div class="qanda-timer"> <span id="qanda-time-remaining"></span> </div> </div>
I have simplified your code to the extreme and is so much easy to read.
You can set a new parameter to which you provide a function that will run after the time is up:
function enableTimer(time, fn) { var elem = jQuery('#qanda-time-remaining'), interval = setInterval( function(){ if(time/1 == time/1 && time) //if(!isNaN(time) && time>0) { elem.text( time-- ); } else { clearInterval(interval); elem.text(0); if( fn instanceof Function )//if fn is a function { fn();//call it } } }, 1000); } enableTimer(5, function(){ alert('Time\\'s up!'); });
<script src="http://code.jquery.com/jquery-2.1.3.min.js"></script> <div id="qanda-timer-container"> <div class="qanda-timer"> <span id="qanda-time-remaining"></span> </div> </div>
Here is a working example: http://jsfiddle.net/689nauny/3/
Your issue was partly with scope and in general how you decremented the count down variable
var thinkingTime = undefined;
var answerTime = undefined;
var intervalID = undefined;
function enableTimer(time) {
var hasThinkingTime = true;
thinkingTime = time;
var hasAnswerTime = true;
answerTime = 10;
if (hasThinkingTime && hasAnswerTime) {
intervalID = setInterval(function () {
thinkingTime -= 1;
jQuery('#qanda-time-remaining').text('' + (thinkingTime));
}, 1000);
}
setTimeout(function () {
clearInterval(intervalID);
}, time * 1000);
}
enableTimer(30);
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.