JeuWeb - Crée ton jeu par navigateur

Version complète : Timer qui saute des secondes voir minutes
Vous consultez actuellement la version basse qualité d’un document. Voir la version complète avec le bon formatage.
Bonjour, Alors un petit problème de javascript sur ce code :


function Timer(Element)
{

var TimeD = document.getElementById(Element).innerHTML;
var tmp = TimeD.split(":");
var time = parseInt(tmp[0])*3600+parseInt(tmp[1])*60+parseInt(tmp[2]);
time -= 1 ;
var H = 0;
var M = 0;
var S = 0;
var timer="";

H = Math.floor(time / 3600 ) ;
M = Math.floor( (time - (H * 3600 ) )/ 60 ) ;
S = time % 60 ;

if(H<10){timer += "0"+H+":"; } else { timer += H+":"; }
if(M<10){timer += "0"+M+":"; } else { timer += M+":"; }
if(S<10){timer += "0"+S+""; } else { timer += S+""; }


document.getElementById(Element).innerHTML = timer ;

if(H == 0)
{
if(M == 0)
{
if(S == 0)
{
location.reload();
}
}
}
}


Le contexte, ce timer intervient quand une construction est en cours, afin d'afficher le temps restant, ce script est rappelé chaque seconde.

Le problème vient qu'il passe en général les 09 à 59.

Je pense que cela vient des lignes :

H = Math.floor(time / 3600 ) ;
M = Math.floor( (time - (H * 3600 ) )/ 60 ) ;
S = time % 60 ;

Mais je ne vois pas l'erreur :triste3:

Merci d'avance.
Modifie :

if(H == 0){
if(M == 0){
if(S == 0){
location.reload();
}
}
}
par :


setTimeout("Timer('" + Element + "')",1000);

Cela devrait fonctionner sans problème.

Petit conseil en passant : attention au nom de tes variables Wink
Les If imbriquées n'influent pas le timer.
Il s'agit de recharger la page pour que le code php finalise la construction.

^^
Oui effectivement je n'avais pas prêté attention.

Ton code n'indique pas l'appel de ton timer, le problème peut aussi venir de là Wink

Même si cela n'a rien avoir, j'éviterais de réduire de 1 seconde à chaque appel préférant utiliser l'objet Date. Si le navigateur de la personne est un peu lente, il va y avoir une mauvaise synchronisation entre la date afficher et la fin de ta construction.
et si il se déconnecte avant d'avoir terminé sa construction? Le fait de gérer ça coté client n'est pas une excellente idée...
Deux choses :
1. Tu devrais commenter ton code Wink
2. Utilise alert() ou windows.write() pour savoir ce que valent tes variables après chaque modification, ça permettra de savoir à quelle étape ça saute.
3. C'est plus que probablement un problème avec parseInt (bug javascript) que tu peux remplacer par parseFloat Wink
Merci à vous,
Et surtout à toi Holy, Ton numéro 3 est correct.

Le probléme venait de la fonction parseInt qui est buggé pour la chaine '08'.
La Solution consiste à forcer le parseInt en base 10 ==>
parseInt('Chaine',10);

@Hideaki : Le temps utiliser comme départ du timer est celui qu'il reste avant la fin de la construction. Il est calculer par le php à partir de l'enregistrement de construction et le temps actuel du serveur.

Ce script est appelé par une autre page où se trouve le "SetTimeout". Ayant Besoin de plusieurs timer à la fois ( un par construction en cours ) je charge ce script et règle mes SetTimeout Dynamiquement.

@NicoMSEvent : Le Javascript ne valide pas la fin de la construction , il fait recharger la page quand le temps restant est à 0. C'est une fonction php appelé dans le début de la page qui se charge de vérifier si des construction sur le compte sont à finaliser ou pas.

Voila, Merci de votre aide, car le bug du parseInt ne me serait jamais venu à l'esprit.

J'ai retravaillé le script en m'apercevant que je le compliquer inutilement :


//Timer
function Timer(Element)
{
//Récupération du temps dans la div Element
var TimeD = document.getElementById(Element).innerHTML;
var tmp = TimeD.split(":");
//Mise en place de l'heure,minute,seconde
var H = parseInt(tmp[0],10);
var M = parseInt(tmp[1],10);
var S = parseInt(tmp[2],10);
//Initialisation de la variable texte timer
var timer="";
//Controle de "format"
if(M == 0){ H = H - 1; M = 60; }
if(S == 0){ M = M - 1; S = 60;}
//Décompte d'une seconde. ( Script appeler toutes les 1 secondes )
S = S - 1 ;
//Mise en forme du temps
if(H<10){timer += "0"+H+":"; } else { timer += H+":"; }
if(M<10){timer += "0"+M+":"; } else { timer += M+":"; }
if(S<10){timer += "0"+S+""; } else { timer += S+""; }

//Affichage nouveau temps dans la div Element
document.getElementById(Element).innerHTML = timer ;

//Rechargement de la page, la construction est censé être a terme
if(H == 0)
{
if(M == 0)
{
if(S == 0)
{
location.reload();
}
}
}
}

Et cela fonctionne impec ^^