[JS] SetInterval et variables globales

SetInterval et variables globales [JS] - HTML/CSS - Programmation

Marsh Posté le 03-10-2005 à 17:16:27    

Bonjour,
Bon comme j'lavais dis, j'ai creusé, j'ai pas trouvé, donc me revoilou.
Alors j'ai commencé à faire un chti snake gentillement sans se presser juste pour m entrainer, et ca tombe bien, j'ai un probleme :) J'vais pouvoir apprendre qqch ! Quelle chance :pt1cable:  
 
J'vous file le code, il est long mais pas dûr,  après il y aura 2 ou 3 explications :
 

Code :
  1. <html>
  2. <head>
  3. <script type="text/javascript">
  4. function p(t){ document.write(t+"<br/>" ); }
  5. //nombres de cases et leurs tailles seon X et Y
  6. var Nx,Ny,Tx,Ty;
  7. Nx=30;
  8.  Tx=20;
  9. Ny=20;
  10.  Ty=20;
  11. //création de la grille
  12. grille = new Array (Nx);
  13. for (i=0 ; i<Nx ; i++){
  14.  grille[i] = new Array (Ny);
  15. }
  16. function drawGrille(){
  17.  var i,j;
  18.  for (i=0 ; i<Nx ; i++)
  19.   for (j=0 ; j < Ny ; j++)
  20.    document.write("<div style='height:"+Ty+"px;width:"+Tx+"px;top:"+(j*Ty)+"px;left:"+(i*Tx)+"px;background-color:#eaeaea;position:absolute;'>&nbsp;</div>" );
  21. }
  22. </script>
  23. </head>
  24. <body>
  25. <script type = "text/javascript">
  26.  drawGrille();
  27.  setInterval("drawGrille();",1000);
  28. </script>
  29. </body>
  30. </html>


 
Voila.
Je créé une grille et sa fonction d affichage, qui va etre appelée toutes les sec.
 
Le probleme est simple :
l'affichage se fait une fois  et la deuxieme fois, le script plante sous IE, et sous FF ca me met : "Ny undefined" dans la fonction drawGrille (ligne 25) !
Voila, je comprend pas pourquoi il reconnais tres bien Ny au premier passage et pas au second. Elle a pas disparue  :heink:  !!
 
SVP ne répondez que si vous avez vraiment qqch d'interressant à proposer qui fera avancer le schmilblik. Après on verra pour la propreté du code.
 
Merci  :bounce:
 
edit : simplification massive du code


Message édité par benji_100 le 04-10-2005 à 00:06:23
Reply

Marsh Posté le 03-10-2005 à 17:16:27   

Reply

Marsh Posté le 03-10-2005 à 17:35:57    

Si vous aussi vous trouvez ca bizarre, tapez "1"

Reply

Marsh Posté le 03-10-2005 à 17:57:18    

Et si t'enléve le premier appel à drawGrille, (celui en dehors du setInterval) ca plante dés le premier coup ou toujours au second?


Message édité par omega2 le 03-10-2005 à 17:57:56
Reply

Marsh Posté le 03-10-2005 à 18:04:17    

Judicieuse question : ca plante direct au premier.
Interressant ... mais ca m'a pas aidé à trouver la faille. T'as une idée?
 
Ce qui m'etonne c'est que le Nx lui passe sans probleme...

Reply

Marsh Posté le 03-10-2005 à 18:12:22    

Je sais pas pourquoi il bloque sur Ny et pas Nx, mais déjà, si t'apelle jamais la premiére fonction les variables risquent pas d'exister. :lol:

Reply

Marsh Posté le 03-10-2005 à 18:19:17    

La fonction p(t) ??? Elle sert à rien elle... J crois que t as mal lu le code.

Reply

Marsh Posté le 03-10-2005 à 18:22:42    

EDIT : J'ai dit une grosse conerie, je me suis eu j'ai eu l'impression que ca marchait alors que ca plantait pareil. :( Je me suis fait avoir par les { }


Message édité par omega2 le 03-10-2005 à 18:27:32
Reply

Marsh Posté le 03-10-2005 à 18:39:05    

J'ai compris pourquoi ca plante au Ny et pas au Nx.
On arrive dans la boucle, premier passage on affecte 0 à i
ensuite, on arrive dans la seconde boucle, premier passage on affecte 0 à j.
ensuite, on affiche le div.
Ensuite, on incrémente j et on le compare à Ny et là ... plantage.
Finalement, si ca plante pas au Nx, c'est qu'on l'a pas encore utilisé.
 
Il va faloir faire passer les variables en paramettre de la fonction vu que visiblement setinterval bloque les variables globales.
 
EDIT : Voilà une version qui à l'air de marcher :

Code :
  1. <html>
  2. <head>
  3. <script type="text/javascript">
  4.     function p(t){ document.write(t+"<br/>" ); }
  5.     //nombres de cases et leurs tailles seon X et Y  
  6.     var Nx,Ny,Tx,Ty;
  7.     Nx=30;
  8.         Tx=20;
  9.     Ny=20;
  10.         Ty=20;
  11.    
  12.     //création de la grille  
  13.     grille = new Array (Nx);
  14.     for (i=0 ; i<Nx ; i++){
  15.         grille[i] = new Array (Ny);
  16.     }
  17.    
  18.     function drawGrille(Nx,Ny,Tx,Ty){
  19.         var i,j;
  20.         for (i=0 ; i<Nx ; i++)
  21.             for (j=0 ; j < Ny ; j++)
  22.                 document.write("<div style='height:"+Ty+"px;width:"+Tx+"px;top:"+(j*Ty)+"px;left:"+(i*Tx)+"px;background-color:#eaeaea;position:absolute;'>&nbsp;</div>" );
  23.    
  24.     } 
  25.      
  26. </script>
  27. </head>
  28. <body>
  29.     <script type = "text/javascript">
  30.         setInterval("drawGrille(Nx,Ny,Tx,Ty);",1000);
  31.     </script>
  32. </body>
  33. </html>


Message édité par omega2 le 03-10-2005 à 18:42:28
Reply

Marsh Posté le 03-10-2005 à 19:06:06    

Bien vu pour le Nx ! nice nice nice:)

Citation :

Il va faloir faire passer les variables en paramettre de la fonction vu que visiblement setinterval bloque les variables globales.


T'as une idée du pourquoi du comment ? Normalement les variables globales accessibles dans le contexte de déclaration de la fonction sont toujours valables pour la fonction meme lorsque l'on a quitté ce contexte.
 
PS :ok sous ie, sablier infini sous FF .. o.O

Reply

Marsh Posté le 03-10-2005 à 20:21:14    

J'imagine que les gas de firefox ont considéré que le thread du setInterval à un contexte différent du thread principal.
 
Quand au sablier, ca montre juste qu'il y a un script qui tourne. ;) mais moi aussi je trouve ça domage qu'ils aient utilisé le même sablier que pour les téléchargements.

Reply

Marsh Posté le 03-10-2005 à 20:21:14   

Reply

Marsh Posté le 03-10-2005 à 23:22:22    

pourquoi seulement FF? IE aussi fesait nimporte quoi.
Et j'en suis pas sur. Doit y avoir un truc qd meme c est bizarre je trouve... C est pas logique que les spécs parlent pas de contexte de ca...
Ya pas un expert JS qui connait les ristournes des SetInterval et setTimeOut? (j crois pas hein :()


Message édité par benji_100 le 03-10-2005 à 23:23:44
Reply

Marsh Posté le 04-10-2005 à 06:16:10    

de toute manière benji
de la facon que tu rafraichie ta grille c'est débile.
là tu va réécrire ta grille toute les secondes
alors que le plus simple serait de modifier les éléments à l'interieurs (effacer ce qui n'ont plus lieu d'etre et reafficher ce border.
 
et puis normalement ta grille ya ke ca dedans <div id="grille"></div>
 
SetIntervalle, ca ne s'appelle qu'une seule fois
et automatiquement un timer est lancé et celui-ci va lancer toutes les 2 Secondes (par exemple) la fonction
 
http://www.toutjavascript.com/refe [...] l&parent=6
 
SetTimeOut appelera 1 seule fois une fonction après un temps donné.
 

Reply

Marsh Posté le 04-10-2005 à 11:36:05    

Je sais tout ca getsu, mais j'avoue que là, le probleme qui m interresse est pourquoi les fonctions appelées par serinterval/settimeout perdent le contexte global dans lequel elle ont été déclarées.

Reply

Marsh Posté le 04-10-2005 à 11:40:12    

parce que tu fais un document.write sur tout ton document dislexyque des pseudos !!!!!
 
vire moi ton document.write et fait quelque chose de plus propre et de moins crassous steuplé. et puis ta po besoin de faire un redessin de la grille, c'est stupide

Reply

Marsh Posté le 04-10-2005 à 11:44:50    

Désolé Gatsu, j viens de voir que j ai massacré ton pseudo aussi sur l autre topic. D ou le brulage de maison Eûreka ! :pt1cable:  
 
Serieusement j vais pas simplifier le code la mais tu as dis qqch de pertinent puisque je sais que si je met un alert au lieu du document.write, ca marche. Alors c est à cause du document.write mais pourquoi? Développe ton idée stp :jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed