Bonjour, je m'exerce sur la gestion du temps en Js, je débute et je bloque complètement. je voudrai stopper mon timer au click d'un bouton stop
Je sais que pour le stop clearInterval me permettrai de le stopper je vois pas ou l'utiliser. Si vous pouvez me donner des conseils ou des pistes je vous en remercie d'avance.
document.getElementById("start_timer").addEventListener("click",function(){
let seconds = 1200;
const countdownTimer = setInterval(
function(){
const minutes = Math.round((seconds - 30) / 60); // (1200 - 30) / 60) = 19.5 //math round permet d'arrondir à 20
let remainingSeconds = seconds % 60; // 500 modulo 60 = 20
if(remainingSeconds < 10) {
remainingSeconds = "0" + remainingSeconds; // on ajoute un 0 en chaine de caractère , en fait c'est une question de format 10 min 5 sec => 10 min 05 sec
}
document.getElementById("countdown").innerHTML = + minutes + " minutes" + ":" +remainingSeconds + " secondes";
if(seconds == 0) { // si var seconds = 0 alors le minuteur est terminé et affiche un message.
clearInterval(countdownTimer); // Permet d'annuler une action répétée minutée initiée via un appel à setInterval().
document.getElementById("countdown").innerHTML = "fin du compte à rebours"; // si les secondes sont = 0 alors affiche "fin du compte à rebours"
}
else{
seconds --; // si les secondes ne sont pas à zéro alors on décremente.
}
},1000); // / l'interval du décompte est de 1000 millisecondes soit 1 seconde.
});
- Edité par SophieGuichard 17 janvier 2020 à 11:04:23
class Chronometre{
constructor(minutes,secondes){
this.minutes = minutes;
this.secondes = secondes;
}
updateChrono(){
const minutes = Math.round((seconds - 30) / 60); // (1200 - 30) / 60) = 19.5 //math round permet d'arrondir à 20
let remainingSeconds = seconds % 60; // 500 modulo 60 = 20
if(remainingSeconds < 10) {
remainingSeconds = "0" + remainingSeconds; // on ajoute un 0 en chaine de caractère , en fait c'est une question de format 10 min 5 sec => 10 min 05 sec
}
document.getElementById("countdown").innerHTML = + minutes + " minutes" + ":" +remainingSeconds + " secondes";
if(seconds == 0) { // si var seconds = 0 alors le minuteur est terminé et affiche un message.
clearInterval(countdownTimer); // Permet d'annuler une action répétée minutée initiée via un appel à setInterval().
document.getElementById("countdown").innerHTML = "fin du compte à rebours"; // si les secondes sont = 0 alors affiche "fin du compte à rebours"
}
else{
seconds --; // si les secondes ne sont pas à zéro alors on décremente.
}
}
start(seconds = this.secondes){
const countdownTimer = setInterval(
function(){
updateChrono();
},1000); // / l'interval du décompte est de 1000 millisecondes soit 1 seconde.
}
stop(){
alert(this.secondes)
}
}
var chronos = [];
document.getElementById("start_timer").addEventListener("click",function(){
var chronometre = new Chronometre(0,10);
chronos.push(chronometre);
chronometre.start();
});
document.getElementById("stop").addEventListener("click",function(){
chronos[0].stop();
});
j'ai un petit soucis par contre j'ai une erreur "updateChrono() is not defined"
Le plus simple pour ta problématique Sophie, c'est d'utiliser une variable global en combinaison avec une fonction on/off.
Je t'ai fait un exemple ici:
var intervalID, //Variable global qui recevra l'id de l'interval
isStart= false, //Variable global qui indique l'état du chronomètre (en marche ou non)
second= 0; //Le nombre de seconde écoulé (enfin pour être exacte, le nombre d’exécution de l'interval) *voir en fin de message
const action_ival= function() {
//ici les actions que tu souhaite effectuer dans ton interval
second++;
console.log(`${second}s écoulé !`);
};
const chrono= function(act) {
if(act==="start") {
intervalID= window.setInterval(action_ival, 1000);
} else {
window.clearInterval(intervalID);
}
};
document.getElementById("start_timer").addEventListener("click", function() {
//on vérifie si le chrono n'est pas lancé (isStart)
if(isStart===false) {
isStart= true;
chrono("start");
}
});
document.getElementById("end_timer").addEventListener("click", function() {
//on vérifie si le chrono est lancé (isStart)
if(isStart===true) {
isStart= false;
chrono("end"); //NB: comme je suis feignant j'utilise un else dans
//la fonction chrono donc je pourrais mettre n'importe quoi du
//moment que ce n'est pas "start"
}
});
Ce n'est que mon avis, mais comme tu débute, je te déconseille de te lancer tout de suite dans les classes (mieux vaut être un peu a l'aise avec le javascript avant de s'y lancer) sache tout de même que les classes ne sont rien de plus que des fonctions (spéciales) un peu jolies (un article ici, pour plus d'info).
Tout a l'heure (plus haut), j'ai parler de nombre d’exécution plutôt que nombre de seconde, parce que setInterval peut dériver un peu voici un bon article qui résume ce qu'il y a à savoir sur les temps en javascript: How JavaScript Timers Work
Edit: Après, si ton chrono est fait pour des petit temps (genre 5-6minute) le fait qu'il y ai une possibilité d'un léger décalage n'est pas très gênant (pour avoir une seconde de décalage, avec une dérive de 4ms [la maximal dont j'ai entendu parler] il faut 250 exécutions (4 minutes et 10 seconde) et encore, c'est en partant du principe que le moteur javascript n'as pas pu corriger la dérive tout seul (parce que le moteur essaye coûte que coûte d'espacer l'interval de pile le temps indiquer)
Oui effectivement opter pour la poo est une meilleure solution je suis totalement d'accord. Cependant j'ai beaucoup de mal à l'utiliser. Je comprends le principe et l'utilité offerte par la Poo, mais quand il s'agit de l'appliquer concrètement je suis un peu perdue. J'ai pour le moment essayé de refaire pas mal de tutos de cours utiliser la documentation (MDN) mais j'ai toujours pas vraiment d'avancer.
Par exemple j'ai testé de créer un script de signature électronique en place via l'élément Canvas, pour le procédural ça va mais pour le mettre en Poo je bloque totalement. En tout cas merci à vous pour vos réponses je vais regarder ça en détail pour essayer de bien comprendre.
Bonne journée.
- Edité par SophieGuichard 20 janvier 2020 à 12:05:31
Gestion d'un timer au clic de bouton
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
!