Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1168 connectés 

  FORUM HardWare.fr
  Programmation
  HTML/CSS

  [JS] SetInterval et variables globales

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[JS] SetInterval et variables globales

n°1213801
benji_100
Posté le 03-10-2005 à 17:16:27  profilanswer
 

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
mood
Publicité
Posté le 03-10-2005 à 17:16:27  profilanswer
 

n°1213815
benji_100
Posté le 03-10-2005 à 17:35:57  profilanswer
 

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

n°1213833
omega2
Posté le 03-10-2005 à 17:57:18  profilanswer
 

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
n°1213837
benji_100
Posté le 03-10-2005 à 18:04:17  profilanswer
 

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...

n°1213841
omega2
Posté le 03-10-2005 à 18:12:22  profilanswer
 

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:

n°1213847
benji_100
Posté le 03-10-2005 à 18:19:17  profilanswer
 

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

n°1213852
omega2
Posté le 03-10-2005 à 18:22:42  profilanswer
 

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
n°1213860
omega2
Posté le 03-10-2005 à 18:39:05  profilanswer
 

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
n°1213878
benji_100
Posté le 03-10-2005 à 19:06:06  profilanswer
 

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

n°1213902
omega2
Posté le 03-10-2005 à 20:21:14  profilanswer
 

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.

mood
Publicité
Posté le 03-10-2005 à 20:21:14  profilanswer
 

n°1214004
benji_100
Posté le 03-10-2005 à 23:22:22  profilanswer
 

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
n°1214068
gatsusat
Posté le 04-10-2005 à 06:16:10  profilanswer
 

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é.
 

n°1214205
benji_100
Posté le 04-10-2005 à 11:36:05  profilanswer
 

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.

n°1214212
gatsusat
Posté le 04-10-2005 à 11:40:12  profilanswer
 

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

n°1214216
benji_100
Posté le 04-10-2005 à 11:44:50  profilanswer
 

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:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  HTML/CSS

  [JS] SetInterval et variables globales

 

Sujets relatifs
Visibilités des variables$_SERVER['PHP_SELF'] qui prend en compte les variables
Variables qui se vide toute seuleFonction avec 2 variables?
Probleme avec un setIntervalVariables
deux variables dans une url (débutant)Nom de variables dynamiques en ASP...
Quel est la syntaxe pour utiliser les variables dans une fonctionManipulation sur le type des variables
Plus de sujets relatifs à : [JS] SetInterval et variables globales


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR