Bonjour,
je reviens à la charge avec XHR et mon horloge, il y a un fonctionnement qui m'échappe.
J'ai un problème de portée de variable et il semble qu'avec un objet XHR, les règles normales à propos des variables globales/locales ne fonctionnent pas de la même manière : est-ce que quelqu'un aurait une explication où un lien vers une doc appropriée que je n'aurais pas trouvée.
Explications.
Mon but est basique : je crée une horloge dans un coin de page, horloge que je veux synchroniser périodiquement avec l'heure du serveur. Souhaitant le faire sans recharger toute la page, j'utilise un objet XHR. Jusque là, rien de compliqué. Ma fonction tourne de façon récursive avec un setTimeout toutes les secondes de façon à afficher l'heure au format HH:mn:sc. Je n'ai pas besoin de la date du jour.
Voici la fonction complète :
/**
* Fonction de rotation de l'horloge
* La fonction reçoit en paramètre l'heure courante sous forme de nombre de secondes ((HH * 3600) + (mn * 60) + sc)
*/
function horloge(nbSecondes)
{
var ts;
var msgDebug = '';
var temporisation = 1000;
/* Recalage toutes les cinq secondes */
if((ts % 5) == 0)
{
getXhr();
/* On définit ce qu'on va faire quand on aura la réponse */
xhr.onreadystatechange = function()
{
/* On ne fait quelque chose que si on a tout reçu et que le serveur est ok */
if(xhr.readyState == 4)
{
if(xhr.status == 200)
{
ts = parseInt(xhr.responseText);
document.getElementById('AfficheHeure').innerHTML = 'Origine : '+ nbSecondes +'<br />\nRecalage : '+ ts;
msgDebug = 'Heure rechargée par XHR :<br \/>\n'+ ts;
}
else
{
msgDebug = 'Statut retour '+ xhr.status;
}
}
else
{
}
}
xhr.open("GET", xhr_secondes);
xhr.send(null);
document.getElementById('controle').innerHTML = 'Point de contrôle <em>ts<\/em> :<br \/>\n'+ ts;
document.getElementById('msg_delai').innerHTML = 'Nouveau point de référence (1) <em>ts<\/em> :<br \/>\n'+ ts;
}
else
{
ts = (nbSecondes == 86400) ? 0 : nbSecondes
msgDebug = 'On utilise l\'heure de la boucle normale :<br \/>\n'+ ts;
document.getElementById('msg_delai').innerHTML = 'Nouveau point de référence (2) <em>ts<\/em> :<br \/>\n'+ ts;
}
afficherHeure(parseInt(ts));
ts++;
document.getElementById('msg_debug').innerHTML = msgDebug;
setTimeout('horloge("'+ ts +'")', temporisation);
}
J'ai ajouté un paquet de messages pour afficher un peu ce qui se passe. Voici la nature du problème. Ma variable ts est théoriquement globale à l'intérieur de cette fonction. Ça reste purement théorique puisque dans la pratique, toutes les 5 secondes (délai défini uniquement pour les besoins de test) elle devrait être ajustée via l'appel XHR et redéfinie à la ligne 22 de ce bout de code. Le problème, c'est précisément que cette valeur ne semble pas sortir des accolades du if() entre les lignes 21 et 25 : et je ne comprends pas pourquoi.
D'autre part, je ne saisis pas le fonctionnement de onreadystatechange : l'affichage obtenu me met simultanément les messages des lignes 23 et 28, cette dernière affichant toujours la valeur 1 mais jamais 4, et je ne vois jamais le message de la ligne 24.
Et enfin, comment recaler la valeur de ma variable
ts globalement dans ma fonction à partir d'un XHR ?