compte à rebours javascript avec les boutons start et stop
je dois faire un compte à rebours simple de 5 à zéro, avec les boutons pour démarrer et arrêter le compteur. La seule chose que je ne sais pas, c'est pourquoi mon compteur ne s'arrête pas.
le code est présenté ci-dessous:
function clock() {
var myTimer = setInterval(myClock, 1000);
var c = 5;
function myClock() {
document.getElementById("demo").innerHTML = --c;
if (c == 0) {
clearInterval(myTimer);
alert("Reached zero");
}
}
}
<p id="demo">5</p>
<button onclick="clock()">Start counter</button>
<button onclick="clearInterval(myTimer)">Stop counter</button>
3 réponses
voilà, vous aviez juste besoin de rendre myTimer
global. J'ai aussi réparé un bug où après avoir redémarré le minuteur, il ne montrera pas 5.
var myTimer;
function clock() {
myTimer = setInterval(myClock, 1000);
var c = 5;
function myClock() {
document.getElementById("demo").innerHTML = --c;
if (c == 0) {
clearInterval(myTimer);
alert("Reached zero");
}
}
}
<p id="demo">5</p>
<button onclick="clock(); document.getElementById('demo').innerHTML='5';">Start counter</button>
<button onclick="clearInterval(myTimer);">Stop counter</button>
myTimer
s'entend uniquement de la fonction. Une solution consiste à le rendre mondial.
var myTimer;
function clock() {
myTimer = setInterval(myClock, 1000);
var c = 5;
function myClock() {
document.getElementById("demo").innerHTML = --c;
if (c == 0) {
clearInterval(myTimer);
alert("Reached zero");
}
}
}
<p id="demo">5</p>
<button onclick="clock()">Start counter</button>
<button onclick="clearInterval(myTimer)">Stop counter</button>
Rapide et sale " réponse
var myTimer;
function clock() {
myTimer = setInterval(myClock, 1000);
var c = 5;
function myClock() {
document.getElementById("demo").innerHTML = --c;
if (c == 0) {
clearInterval(myTimer);
alert("Reached zero");
}
}
}
<p id="demo">5</p>
<button onclick="clock()">Start counter</button>
<button onclick="clearInterval(myTimer)">Stop counter</button>
timer
dans votre fonction (parce que sa déclaration, var
, à l'intérieur de votre fonction) ne peut être accédé qu'à l'intérieur de votre fonction. Déplacer la déclaration var
en dehors de votre fonction la rend globale.
meilleure solution
mais mettre les choses dans la portée globale est (la plupart du temps) une mauvaise idée . Si.....il y a un meilleur moyen:
var myTimerObj = (function(document){
var myTimer;
function start() {
myTimer = setInterval(myClock, 1000);
var c = 5;
function myClock() {
document.getElementById("demo").innerHTML = --c;
if (c == 0) {
clearInterval(myTimer);
alert("Reached zero");
}
}
}
function end() {
clearInterval(myTimer)
}
return {start:start, end:end};
})(document);
<p id="demo">5</p>
<button onclick="myTimerObj.start()">Start counter</button>
<button onclick="myTimerObj.end()">Stop counter</button>
la meilleure solution utilise un modèle de module révélateur et tiendra le timer
à l'intérieur d'une portée privée, Tl;Dr il arrête le timer
polluant la portée globale.