09-07-2014, 04:45 PM
Bonjour !
Me voici face à un problème qui selon moi est censé être résolu mais étrangement ne l'est pas, je pense donc manquer de connaissance sur le fonctionnement exact de ce que je vais vous exposer.
Problème : Afficher une liste de constructions en cours avec pour chacune leurs compteur de temps restant respectif.
Interprétation : Faire un nombre indéfini de fois un setInterval sur ce même nombre de fonction décrémentant le temps restant pour chaque construction (Le nombre de constructions en cours étant donc ce nombre indéfini).
Code (Du moins les parties utiles) :
Me voici face à un problème qui selon moi est censé être résolu mais étrangement ne l'est pas, je pense donc manquer de connaissance sur le fonctionnement exact de ce que je vais vous exposer.
Problème : Afficher une liste de constructions en cours avec pour chacune leurs compteur de temps restant respectif.
Interprétation : Faire un nombre indéfini de fois un setInterval sur ce même nombre de fonction décrémentant le temps restant pour chaque construction (Le nombre de constructions en cours étant donc ce nombre indéfini).
Code (Du moins les parties utiles) :
Code PHP :
<?php
print("Construction en cours : </br>");
while($listeconstruction = $result->fetch_assoc())
{
$tempsPasse = microtime(true) - $listeconstruction['depart'];
$tempsRestant = (int)($listeconstruction['duree'] - $tempsPasse);
print($listeconstruction['nom']."
Temps Restant : <span id=\"duree".$listeconstruction['id']."\"></span>");
}
Jusqu'à là j'affiche donc la liste de mes construction sans rien, pas de soucis.
Voici le javascript
Code :
<script type="text/javascript">
var tempsRestant = parseFloat('<?php echo $tempsRestant; ?>');
var i = ('<?php echo $listeconstruction["id"]; ?>');
window["tempsConstruction"+i] = tempsRestant;
//alert("La fonction crée va être celle de l'id"+i);
window['temps'+i] = function(o)
{
alert("Le temps décrémenté est celui de l'id :"+o);
window["tempsConstruction"+o]--;
if(window["tempsConstruction"+o]<=0)
{
document.getElementById('duree'+o).innerHTML = "Terminé";
document.location.href="batiment.php?finish=true";
}
else
document.getElementById('duree'+o).innerHTML =
secondsToTime(parseInt(window["tempsConstruction"+o]));
}
alert("La fonction intervalée va etre l'id :"+i);
setInterval(function() { window['temps'+i](i); }, 1000);
</script>
Voilà, en gros j'essaye de faire en sorte que si j'ai 3 constructions, ce soit 3 fonctions
temps1, temps2 et temps3 qui s'activent et qui agissent chacune sur respectivement tempsConstruction1, tempsConstruction2, tempsConstruction3.
Pourquoi ne pas tout simplement avoir fait une seule fonction qui en fonction du paramètre changerai ce span là ? Eh bien j'ai commencé par ça, mais comme le résultat n'était pas celui attendu, j'ai "supposé" que des setInterval sur des fonctions du même nom s'annulaient, d'où cette méthode.
Résultats :
Avec une seule construction, tout marche bien.
Avec plus d'une, seulement la dernière de la liste est décrémentée (du nombre de constructions en cours) Mes alert m'indiquent effectivement que c'est le dernier id qui est pris en compte, alors que pourtant chaque fonction est censée agir sur un id propre (l'utilisation des window[variable])
Y a t'il un quelconque mécanisme obscur dont je ne connaîtrais pas l'existence provoquant cela ? Ai-je loupé quelque chose de très simple ? Je suis presque sûr d'avoir bien vérifié la portée de chaque variable incriminée, d'où mon incompréhension, et qui plus est, mon post sur ce forum.
Cordialement !