How do I correctly use setInterval and clearInterval to switch between two different functions?
Solution 1
You need to capture the return value from setInterval( ... )
into a variable as that is the reference to the timer:
var interval;
var count = 0;
function onloadFunctions()
{
countUp();
interval = setInterval(countUp, 200);
}
/* ... code ... */
function countUp()
{
document.getElementById("here").innerHTML = count;
count++;
if(count === 10)
{
clearInterval(interval);
countUp();
interval = setInterval(countUp, 200);
}
}
Solution 2
@Claude, you are right, the other solution I proposed was too different from original code. This is another possible solution, using setInterval
and switching functions:
function onloadFunctions() {
var count = 0;
var refId = null;
var target = document.getElementById("aux");
var countUp = function() {
target.innerHTML = count;
count ++;
if(count >= 9) {
window.clearInterval(refId);
refId = window.setInterval(countDown, 500);
}
}
var countDown = function() {
target.innerHTML = count;
count --;
if(count <= 0) {
window.clearInterval(refId);
refId = window.setInterval(countUp, 500);
}
}
refId = window.setInterval(countUp, 500);
}
Solution 3
clearInterval(this);
. You can't do that. You need to save the return value from setInterval
.
var interval;
function onloadFunctions()
{
countUp();
interval = setInterval(countUp, 200);
}
var count = 0;
function countUp()
{
document.getElementById("here").innerHTML = count;
count++;
if(count == 10)
{
clearInterval(interval);
countDown();
interval = setInterval(countDown, 200);
}
}
function countDown()
{
document.getElementById("here").innerHTML = count;
count--;
if(count == 0)
{
clearInterval(interval);
countUp();
interval = setInterval(countUp, 200);
}
}
Solution 4
try this:
...
<body onload = "onloadFunctions();">
<script>
var cup, cdown; // intervals
var count = 0,
here = document.getElementById("here");
function onloadFunctions() {
cup = setInterval(countUp, 200);
}
function countUp() {
here.innerHTML = count;
count++;
if(count === 10) {
clearInterval(cup);
cdown = setInterval(countDown, 200);
}
}
function countDown() {
here.innerHTML = count;
count--;
if(count === 0) {
clearInterval(cdown);
cup = setInterval(countUp, 200);
}
}
</script>
From 0 - 9, up and down: <div id = "here"></div>
</body>
you could also create a single reference to #here
element. Use always ===
instead of ==
Ian Campbell
π΅ πΌπππππππ. π ππππ. π€ ππππππ.
Updated on April 08, 2020Comments
-
Ian Campbell about 4 years
For practice I am trying to display a number that increments from 0 - 9, then decrements from 9 - 0, and infinitely repeats.
The code that I have so far seems to be close, but upon the second iteration thesetInterval
calls of my 2 respective functionscountUp
andcountDown
seem to be conflicting with each other, as the numbers displayed are not counting in the intended order... and then the browser crashes.
Here is my code:<!DOCTYPE html> <html> <head> <title>Algorithm Test</title> </head> <body onload = "onloadFunctions();"> <script type = "text/javascript"> function onloadFunctions() { countUp(); setInterval(countUp, 200); } var count = 0; function countUp() { document.getElementById("here").innerHTML = count; count++; if(count == 10) { clearInterval(this); countDown(); setInterval(countDown, 200); } } function countDown() { document.getElementById("here").innerHTML = count; count--; if(count == 0) { clearInterval(this); countUp(); setInterval(countUp, 200); } } </script> From 0 - 9, up and down: <div id = "here"></div> </body> </html>
-
Claude about 12 yearsIf I was writing my own code, I might prefer a solution such as yours. But, the questioner is trying something for practice -- namely hopping back and forth between two different functions. You didn't actually answer his question.
-
ChandlerQ about 11 yearsNice implementation with closure, like it.
-
Flavio almost 6 yearsIt answers the 3 parts of the question. (1) How do I correctly setInterval (2) and clearInterval (3) to switch between two different functions?
-
Flavio almost 6 yearsWhen the count satisfies the condition in the IF statement the two different functions countUp() and countDown() clear the previous interval, sets a new interval, which switches to the opposite count function. -- if you run this in node it works perfectly.