Erreur JS que je ne comprend pas....

[Résolu]
Signaler
Messages postés
23
Date d'inscription
vendredi 11 novembre 2005
Statut
Membre
Dernière intervention
23 février 2006
-
Messages postés
23
Date d'inscription
vendredi 11 novembre 2005
Statut
Membre
Dernière intervention
23 février 2006
-
Bonjour,

Voila j'étais en train de faire un script pour faire un horloge avec l'heure du serveur, donc je me fait un petit script qui compte les secondes qui passe (avec la gestion des minutes et des heures) ensuite je me dit que le meilleur moyen d'avoir l'heure du serveur, de la façon la plus simple, c'est de créer le document javascript depuis le serveur en PHP... Jusque là, je suis plutot content de moi, j'ai trouvé seul ce que je voulais.

Et donc, le tout me donne ça:
<?php //Script JS pour horloge serveur

//On définit le type de fichier à la sorti
header('Content-type: text/javascript');

echo '//Script Horloge
//Par Hawks_TTF, le 19/02/06

//Merci de laisser l\'entête

var heure = ', date('H'), ';
var minute = ', date('i'), ';
var seconde = ', date('s'), ';
var Interval;
var Affichage;

function Horloge(){
//Partie calcul du temps
if(seconde < 60) seconde++; if(seconde 60){minute++; seconde 0;} if(minute 60){heure++; minute 0;} if(heure 24) heure 0;

//Partie affichage du temps
Affichage = heure;
Affichage += ((minute < 10) ? ":0" : ":") + minute;
Affichage += ((seconde < 10) ? ":0" : ":") + seconde;
if (document.getElementById){
document.getElementById("Horloge").innerHTML = Affichage;
}else if (document.all){
document.all["Horloge"].innerHTML = Affichage;}

//Interval de temps entre les rafraichissements
Interval = setInterval("Horloge()",1000);}

//Lance l\'horloge au démarrage
window.onload = Horloge();';
?>

Je ne pense pas avoir besoin d'expliquer, c'est assez parlant....

Seulement voila, lorsque le script est en ligne, il me dit que document.getElementById("Horloge") n'a pas de propriétés....

Je ne comprend pas pourquoi!

Voila, je vous demande deux choses:
.1. M'aider à comprendre cette erreur....
.2. M'aider à régler le problème sur ce script

Voila, si vous pouvez répondre à au moins une des deux questions, n'hésitez pas, merci.

12 réponses

Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
36
j'ai sucré l'aspect php

<html>
<head>
<script>
var heure = '20';
var minute = '07';
var seconde = '00';
var Interval;
var Affichage = '';


function HorlogeServeur(){
if(seconde < 60)
{
seconde++;
}
else
{ minute++;
seconde = 0;
} if(minute 60){heure++; minute 0;} if(heure 24) heure 0;
Affichage = heure;
Affichage += ((minute < 10) ? ":0" : ":") + minute;
Affichage += ((seconde < 10) ? ":0" : ":") + seconde;
document.getElementById("horloge").innerHTML = Affichage;


//Interval de temps entre les rafraichissements
Interval = setInterval("HorlogeServeur()", 1000);
}


//Lance l\'horloge au démarrage
window.onload = HorlogeServeur;
</script>
</head>


[var..now;frm='hh:nn:ss']

</html>

en rouge ??? pas du php, ni du javascript.

Cordialement. Bul. ~ Mon Site qu'il est à Moi ~<FO>

</FO>
</S< body>
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
36
Bonjour,
1° et la balise avec name=Horloge ? où est-elle ?
2° une balise et une fonction avec le même nom
( Horloge ) ça va poser des problèmes.
3° je ne pense pas que ce soit la bonne méthode
en effet setInterval ( ou setTimeout ) n'est pas
assez précis pour que le déclenchement de la
fonction se fasse toutes les secondes pile poil,
il y aura assez rapidement un décalage.
Cordialement. Bul. ~ Mon Site qu'il est à Moi ~<FO>
</FO>
</S< body>
Messages postés
23
Date d'inscription
vendredi 11 novembre 2005
Statut
Membre
Dernière intervention
23 février 2006

Merci d'avoir répondu.

Alors
1° La voila:
[var..now;frm='hh:nn:ss']

Le contenu est l'heure du serveur donné par un moteur de template, ce qui explique la forme que ça a. Ca me permet ainsi de donner l'heure du chargement, à ceux qui n'activent pas le javascript.
Pour ceux qui se poserait la question, il n'y a pas d'autre id="horloge", et le div est dans un autre div (avec id="main")

2° C'est vrai, je n'avais même pas remarqué! Je m'en vais de ce pas changer ça...

3° Que propose tu alors? (désolé mais j'ai une connaissance trés limité du javascript, alors je vais avec ce que j'ai)

Aprés avoir vu un pb de casse entre l'ID du div et la fonction, et le changement du nom de la fonction en HorlogeServeur() j'ai toujours le même problème.... Damned!
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
36
>>

ben oui, mais dans le script on utilise Horloge, et ce n'est
pas la même chose ( oui je sais c'est pénible ).
>>Que propose tu alors ?
est-il véritablement nécessaire d'être synchro avec le serveur ?
c'est déjà une véritable question.
si c'est absolument nécessaire ( ?? je ne vois pas pourquoi ) ==>
calculer le décalage entre le serveur et la machine client
dans un 1er temps, et sur le déclenchement de la fonction
faire heure de la machine client + ( ou - ) décalage.
Cordialement. Bul. ~ Mon Site qu'il est à Moi ~<FO>
</FO>
</S< body>
Messages postés
23
Date d'inscription
vendredi 11 novembre 2005
Statut
Membre
Dernière intervention
23 février 2006

Oui, j'ai remarqué le pb de casse, et je l'ai corrigé (c'est même marqué plus haut) mais ça ne fonctionne toujours pas.... (oui c'est pénible, surtout quand on le sais et qu'on se fait avoir avec...)

Donc maintenant, la fonction s'appel HorlogeServeur() et j'ai ça pour chercher le div:
document.getElementById("horloge").innerHTML = Affichage

Sinon, pour la synchro avec le serveur, non c'est nécessaire d'être synchro à la seconde pres, maintenant, la durée de vie d'un page ne devrait pas dépassé 5min (site pas encore en ligne, et utilisateur changera surement souvent de page) du coup l'écart induit par setInterval sera minime, et de toute façon, cette horloge est là surtout pour avoir un ordre d'idée de l'heure (bah oui, si on coupe le javascript, on a pas l'heure exacte) Donc je pense que ça va resté comme ça, plus simple... (à vrai dire la première version, du code utilisait le décalage entre l'heure serveur et l'heure local, mais j'ai pas réussit à faire tourner le script, et j'ai eu l'idée de faire un compteur de seconde....)
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
36
>>je l'ai corrigé mais ça ne fonctionne toujours pas.
on peut voir la dernière version ? extrait, mais complet !
( script et div )
>>à vrai dire la première version, du code utilisait le décalage entre l'heure serveur
>>et l'heure local, mais j'ai pas réussit à faire tourner le script, et j'ai eu l'idée de
>>faire un compteur de seconde
à toi de voir, chacun fait comme il aime.
>>si on coupe javascript
ben là il faudrait tout voir, si ça se trouve plus rien ne marche...
on peut prévoir une solution de repli entre <noscript> et </noscript>

Cordialement. Bul. ~ Mon Site qu'il est à Moi ~<FO>

</FO>
</S< body>
Messages postés
23
Date d'inscription
vendredi 11 novembre 2005
Statut
Membre
Dernière intervention
23 février 2006

Bien sur... Voila

<?php //Script JS pour horloge serveur

//On dfinit le type de fichier la sorti
header('Content-type: text/javascript');

echo '//Script Horloge
//Par Tiross, le 19/02/06

//Merci de laisser l\'entête

var heure = ', date('H'), ';
var minute = ', date('i'), ';
var seconde = ', date('s') - 1, ';
var Interval;
var Affichage = \'\';

function HorlogeServeur(){
//Partie calcul du temps
if(seconde < 60) seconde++; if(seconde 60){minute++; seconde 0;} if(minute 60){heure++; minute 0;} if(heure 24) heure 0;

//Partie affichage de l\'heure
Affichage = heure;
Affichage += ((minute < 10) ? ":0" : ":") + minute;
Affichage += ((seconde < 10) ? ":0" : ":") + seconde;
if(document.all){
document.all["horloge"].innerHTML = Affichage;
}else if(document.getElementById){
document.getElementById("horloge").innerHTML = Affichage;}

//Interval de temps entre les rafraichissements
Interval = setInterval("HorlogeServeur()", 1000);}

//Lance l\'horloge au démarrage
window.onload = HorlogeServeur();';
?>

Y'a quelque petit truc qui ont changé, mais c'est sans importance (comme le décale de la première seconde..)
Petite question, je viens de voir que les accent avait disparu, je les ai remis mais il ne change rien, non? (ils sont en commentaire)

Pour le coté HTML,
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>[var.titre]</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="images/style.css" />
<script type="text/javascript" src="script/horloge.php"></script>
<script type="text/javascript" src="script/tooltip.js"></script>
</head>

[...]

[var..now;frm='hh:nn:ss']

[...]
</html>

J'ai coupé le code, le reste se sont d'autre div (avec tous avec des id différents)
Le charset a été changé hier, pour faire des essais, avant il était en iso-8859-1.
Pour le deuxième script, il n'agit uniquement sur un div appellé bulle. (enfin l'id c'est bulle)

Voila pour le code....

Par contre, je n'ai pas compris ton dernier point sur la coupure JS. Ce que je disait, c'est juste que si JS est coupé, le div contiendra uniquement l'heure du rafraichissement de la page, comme on peut le voir.

Merci de t'intéresser à mon problème
Messages postés
23
Date d'inscription
vendredi 11 novembre 2005
Statut
Membre
Dernière intervention
23 février 2006

Merci bultez



Je ne comprend toujours pas pourquoi mon code ne marchait pas..... Et
puis, lorsque je copie ton code, ça marche, si je modifie le mieux pour
le rendre identique au tiens, ça ne marche plus! Bref, je suis vraiment
perdu....





Par contre, j'ai du modifié la condition sur les secondes, il comptait
la 60e seconde avant le changement, et la méthode d'interval, j'ai mit
setTimeout. Lorsque j'avais SetInterval, au bout de 3sec, il y avait un
décalage de 1sec, et au bout de 10sec, Firefox plantait..... Serait tu
m'expliquer pourquoi?





Enfin pour te répondre, ce que tu as mis en rouge, "Le contenu est
l'heure du serveur donné par un moteur de template, ce qui explique la
forme que ça a." (dixit moi même à mon deuxième message )

En gros, ça équivaut à <?php echo date('H:i:s'); ?> sauf que
c'est donné par le moteur à template, et pas "directement" par PHP...
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
36
quelques erreurs :
>>window.onload = HorlogeServeur();';
pas de ( )
>>var heure = ', date('H'), ';
, ni du html, ni du javascript ni du php
date('H')
';
...
plusieurs remarques
°SetInterval ne doit être fait qu'une seule fois, ou alors
remplacé par setTimeout.
°le contrôle des minutes/heures ne doit l'être
que si on les modifie. par exemple :
if( seconde < 60 )
{
seconde++;
}
else
{ minute++;
seconde = 0;
if(minute >= 60)
{
heure++;
minute = 0;
if(heure >= 24)
{
heure = 0;
}
}
}

° moteur de template ? c'est quoi que ça veut dire ça ?

si encore des difficultés nous donner la page html/javascript
résultante, sinon on ne peut rien voir nous.
Cordialement. Bul. ~ Mon Site qu'il est à Moi ~<FO>
</FO>
</S< body>
Messages postés
23
Date d'inscription
vendredi 11 novembre 2005
Statut
Membre
Dernière intervention
23 février 2006

>>var heure = ', date('H'), ';
, ni du html, ni du javascript ni du php

Si du php, la fonction date(masque, timestamp)
Cette fonction permet l'affichage d'une date ou/et d'une heure correspondant au timestamp indiqué, si le timestamp n'est pas fournit, la fonction prend celui du moment où la fonction est appelé.
Ici, le masque est H, ce qui veux dire l'heure, il aurait pu être 'H:i:s' pour avoir l'heure sous la forme 16:33:43....
Les virgules sont la pour éviter de concaténé, c'est un peu comme si on coupait l'echo, pour en ouvrir un autre.... (la concaténation pourrait être utilisé mais il me semble que cette méthode est plus rapide dans ce cas précis)

° moteur de template ? c'est quoi que ça veut dire ça ?

Pour simplifié, template => un modèle, moteur à template => ce qui gère l'affichage des templates
Exemple, les forum phpbb utilisent des templates, utilité? Comme ça le forum est codé d'un coté, et l'affichage de l'autre. Permet ici, de pouvoir modifier l'affichage, sans touché au fichier php du forum, et inversement, on peux mettre à jour les fichiers phpbb sans avoir à repassé derrière pour ajuster son affichage...
Je sais, tu doit te dire que le CSS est suffisant pour modifier l'affichage, cepandant le principe des templates, c'est de pouvoir même changer l'HTML si on veux (en plus du CSS) Enfin, moi je m'en sert surtout car je ne suis pas seul sur ce projet et que donc ça permettra de mieux séparé les codes et l'affichage.
Si ce que je dit n'est pas suffisant ou tu veux en savoir plus, http://fr.wikipedia.org/wiki/Template
Si ça peux aidé en cas de recherche, quelque nom, phplib (moteur des forums phpbb), smarty, TinyButStrong (ou TBS)...

Sinon je vais essayé d'imbriqué les contrôles

Merci de ton aide
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
36
var heure = '<?php echo date('H');?> ';
ça ce serait du PHP.
et comme le générateur de php qui générera du html/javascript
que tu utilise, nous, on n'en dispose pas, pour aider il nous
faudra le php résultant, et mieux, la page html finale.
Cordialement. Bul. ~ Mon Site qu'il est à Moi ~<FO>
</FO>
</S< body>
Messages postés
23
Date d'inscription
vendredi 11 novembre 2005
Statut
Membre
Dernière intervention
23 février 2006

Non, car date() est dans un echo.... donc je ne peux pas ouvrir une autre balise php! (oui regarde bien, l'echo je le ferme qu'à la fin!)

Par contre, je comprend pas trop la suite....
Je sais que tu parle de ça
//On définit le type de fichier à la sorti
header('Content-type: text/javascript');

Et donc pour te dire, je ne sais plus où j'avais vu qu'il fallait toujours déclarer lorsqu'on ne faisait pas une page en HTML (exemple quand on utilise la librairie GD on déclare que le prduit sera une image) Donc lorsque j'ai eu l'idée de faire ça, je me suis dit qu'il fallait que je le fasse aussi.... Maintenant j'avoue, c'est peut être pas utilise, au final, il sortira surement du texte.
Pour le fichier généré, c'est tout simple, adieu le header, adieu l'echo. Les seuls lignes qui sont vraiment dynamique (coté serveur) sont
var heure = ', date('H'), ';
var minute = ', date('i'), ';
var seconde = ', date('s') - 1, ';

Qui resortent tel que
var heure = 14;
var minute = 32;
var seconde = 15;

Pour l'HTML, je vois pas en quoi il t'aidera? Si c'est pour la balise script, elle est plus haut, elle a pas changé....

PS: il me semble que de façon rigureuse, il faudrait un header même pour les pages html, maintenant, je racconte peut être de grosses conneries.... (mais bon c'est comme ça qu'on apprend)