Passer les arguments d'un Array dans un setTimeout.

Passer les arguments d'un Array dans un setTimeout. - HTML/CSS - Programmation

Marsh Posté le 01-11-2007 à 19:29:35    

Comment est-t-il possible de transmettre la valeur de l'argument de l'Array à un setTimeout chaque fois que la boucle s'effectue?
Présentement "fst[i]" et "snd[i]" renvoient "undefined".
 

Code :
  1. <input type="button" value="Test" onclick="fst=new Array(130,240,182,91);snd=new Array(108,154,111,170);acts(this)">
  2. <script language="JavaScript" type="text/javascript">
  3. <!--
  4. function acts(xw){
  5. var q=0;
  6. for (var i=0; i<fst.length; i++){
  7. setTimeout(function(){Gfight_1(xw,fst[i])},q);q+=1100;
  8. setTimeout(function(){Dfight_1(xw,snd[i])},q);q+=1100;
  9.      }
  10. }
  11. // -->
  12. </script>

Reply

Marsh Posté le 01-11-2007 à 19:29:35   

Reply

Marsh Posté le 01-11-2007 à 19:33:47    

Code :
  1. setTimeout(Gfight_1, q, xw, fst[i])


[:petrus dei]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 02-11-2007 à 00:23:34    

masklinn a écrit :

Code :
  1. setTimeout(Gfight_1, q, xw, fst[i])


[:petrus dei]

 

sur firefox ouais :/
c ets pour ca que j avais eu besoin de ton aide :o
ie accepte que deux parametres: une fonction et la duree du timeout
en sachant que la fonction doit etre une string qui ne prend qu un argument au maximum
donc obligé de passer par une lambda avec tout le bordel de scope qui en decoule :D


Message édité par mIRROR le 02-11-2007 à 00:24:36

---------------
« The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell
Reply

Marsh Posté le 02-11-2007 à 00:31:27    

Donc je vais être obliger de distribuer mes arguments à des nom de variables fixes avec une boucle?

Reply

Marsh Posté le 02-11-2007 à 00:33:57    

darkkrab a écrit :

Donc je vais être obliger de distribuer mes arguments à des nom de variables fixes avec une boucle?


 
pika ?


---------------
« The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell
Reply

Marsh Posté le 02-11-2007 à 00:38:49    

Code :
  1. <script language="JavaScript" type="text/javascript">
  2. function acts(xw){
  3. var q=0;
  4. for (var i=0; i<fst.length; i++){
  5. setTimeout((function() {  return function(){Gfight_1(xw,fst[i])} }() ),q);q+=1100;
  6. setTimeout((function() { return  function(){Dfight_1(xw,snd[i])}  }() ),q);q+=1100;
  7.      }
  8. }
  9. </script>



Message édité par gatsu35 le 02-11-2007 à 00:39:08
Reply

Marsh Posté le 02-11-2007 à 00:45:28    

Malheureusement, on obtient le même résultat que le script initial.

Reply

Marsh Posté le 02-11-2007 à 00:48:47    

si tu fais alert(fst) ca donne quoi [:petrus dei]


---------------
« The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell
Reply

Marsh Posté le 02-11-2007 à 01:14:21    

http://img456.imageshack.us/img456/1489/nouveauimagebitmapmf1.png

Reply

Marsh Posté le 02-11-2007 à 01:25:52    

Code :
  1. <script language="JavaScript" type="text/javascript">
  2. function acts(xw){
  3. var q=0;
  4. for (var i=0; i<fst.length; i++){
  5. setTimeout((function() {  return function(x){Gfight_1(xw,x)} }(fst[i]) ),q);q+=1100;
  6. setTimeout((function() { return  function(y){Dfight_1(xw,y)}  }(snd[i]) ),q);q+=1100;
  7.      }
  8. }
  9. </script>


 
si j ai bien compris ca devrait marcher comme ca mais je suis pas sur  :whistle:  


---------------
« The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell
Reply

Marsh Posté le 02-11-2007 à 01:25:52   

Reply

Marsh Posté le 02-11-2007 à 08:08:10    

mIRROR a écrit :

Code :
  1. <script language="JavaScript" type="text/javascript">
  2. function acts(xw){
  3. var q=0;
  4. for (var i=0; i<fst.length; i++){
  5. setTimeout((function() {  return function(x){Gfight_1(xw,x)} }(fst[i]) ),q);q+=1100;
  6. setTimeout((function() { return  function(y){Dfight_1(xw,y)}  }(snd[i]) ),q);q+=1100;
  7.      }
  8. }
  9. </script>


 
si j ai bien compris ca devrait marcher comme ca mais je suis pas sur  :whistle:  


yep :o


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 02-11-2007 à 10:36:28    

[:dockbchris]


---------------
« The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell
Reply

Marsh Posté le 02-11-2007 à 11:12:14    

mirror you are the best, et sinon j'arrive à 11h30 ce matin mon biquet barbu

Reply

Marsh Posté le 02-11-2007 à 11:20:45    

\o/


---------------
« The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell
Reply

Marsh Posté le 04-11-2007 à 18:55:47    

Ça ne fonctionne pas encore, désolé.
 
Résultat voulu : 130,108,240,154,182,111,91,170
IE : undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined
FF : Chiffres aléatoires
NN : Chiffres aléatoires
 
Pour tester :

Code :
  1. <html>
  2. <head>
  3. </head>
  4. <body>
  5. <input type="button" value="Fight" onclick="fst=new Array(130,240,182,91);snd=new Array(108,154,111,170);acts(this)" />
  6. <div id="test"></div>
  7. <script>
  8. function acts(xw){
  9. var q=0;
  10. for (var i=0; i<fst.length; i++){
  11. setTimeout((function() {return function(x){Gfight_1(xw,x)} }(fst[i]) ),q);q+=1100;
  12. setTimeout((function() {return function(y){Dfight_1(xw,y)} }(snd[i]) ),q);q+=1100;
  13. }
  14. }
  15. function Gfight_1(xw,frpp){
  16. document.getElementById("test" ).style.color="red";
  17. document.getElementById("test" ).innerHTML=xw+frpp;
  18. }
  19. function Dfight_1(xw,frpp){
  20. document.getElementById("test" ).style.color="blue";
  21. document.getElementById("test" ).innerHTML=xw+frpp;
  22. }
  23. </script>
  24. </body>
  25. </html>

Reply

Marsh Posté le 05-11-2007 à 23:30:45    

Dans le script original, le problème c'est que le "i" qui s'incémente vaut toujours 4 lors de l'appel des setTimeout puique la boucle est fini et fst[4] est undefined évidemment. Il faudrait trouver un moyen pour que la valeur suivent le setTimeout, quitte à créer des variables pour remplacer le "i".

Reply

Marsh Posté le 06-11-2007 à 01:13:22    

@Gatsu, Masklinn, mIRROR : Vous êtes tous de gros cacas suintants  :o

 
Code :
  1. <script type="text/javascript">
  2. function acts(xw){
  3.     var q=0;
  4.     
  5.     for (var i=0; i<fst.length; i++){
  6.         setTimeout((function(x) {return    function(){Gfight_1(x)}}(fst[i])),q); q+=1100;
  7.         setTimeout((function(y) {return function(){Dfight_1(y)}}(snd[i])),q); q+=1100;
  8.     }
  9. }
  10. function Gfight_1(frpp){
  11.     document.getElementById("test" ).style.color="red";
  12.     document.getElementById("test" ).innerHTML+=frpp;
  13. }
  14. function Dfight_1(frpp){
  15.     document.getElementById("test" ).style.color="blue";
  16.     document.getElementById("test" ).innerHTML+=frpp;
  17. }
  18. </script>
 

Edit : C'est du code pas beau


Message édité par Shinuza le 06-11-2007 à 01:13:45

---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 06-11-2007 à 06:59:03    

c'est mirror qui m'a trompé en mettant pas ses paramètres au bon endroit [:sisicaivrai]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 06-11-2007 à 08:58:59    

[:haha] j avais bien dit que j etais pas sur :o
mais c est vrai qu ca semble plus logique d un coup :D


---------------
« The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell
Reply

Marsh Posté le 06-11-2007 à 09:47:53    

@shinu> c'est quoi ce truc tout degueu ???
du setTimeout bourriné dans un for ça te dérange même pas :/
et un petit setInterval des fois  ?
 
Et puis l'exemple est un peu complètement ... euh ... pas bien.
Les deux setInterval font la même chose, du coup j'aurais bien vu un truc comme ça:

Code :
  1. function truc(){
  2.    var self = this;
  3.    self.snd = new Array(1,2,3);
  4.    self.fst = new Array(4,5,6);
  5.    self.i   = false;
  6.    self.intV = setInterval(function(){ self.fight()}, 1100);
  7. }
  8. truc.prototype.fight = function(){
  9.      var s; var color;
  10.      if ( this.i ){
  11.        color = 'blue';
  12.        s =this.snd.shift();
  13.      } else {
  14.        color = 'red';
  15.        s =this.fst.shift();
  16.      }
  17.      document.getElementById("test" ).style.color=color;
  18.      document.getElementById("test" ).innerHTML+=s;
  19.      this.i = ! this.i;
  20.      if ( ! this.snd.length ){ clearInterval(this.intV); return false;}
  21.      return true;
  22. }
  23. window.onload = function (){ var t = new truc();}


ça reste dégueu et améliorable mais au moins on comprends ce que ça fait :o

Reply

Marsh Posté le 06-11-2007 à 09:55:48    

je crois que le monsieur aura 15000 inputs qui initialiseont 30000arrays differents  
tu peux pas les declarer dans ton objet :o


---------------
« The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell
Reply

Marsh Posté le 06-11-2007 à 13:32:08    

anapajari a écrit :

@shinu> c'est quoi ce truc tout degueu ???
du setTimeout bourriné dans un for ça te dérange même pas :/
et un petit setInterval des fois  ?
 
Et puis l'exemple est un peu complètement ... euh ... pas bien.
Les deux setInterval font la même chose, du coup j'aurais bien vu un truc comme ça:

Code :
  1. function truc(){
  2.    var self = this;
  3.    self.snd = new Array(1,2,3);
  4.    self.fst = new Array(4,5,6);
  5.    self.i   = false;
  6.    self.intV = setInterval(function(){ self.fight()}, 1100);
  7. }
  8. truc.prototype.fight = function(){
  9.      var s; var color;
  10.      if ( this.i ){
  11.        color = 'blue';
  12.        s =this.snd.shift();
  13.      } else {
  14.        color = 'red';
  15.        s =this.fst.shift();
  16.      }
  17.      document.getElementById("test" ).style.color=color;
  18.      document.getElementById("test" ).innerHTML+=s;
  19.      this.i = ! this.i;
  20.      if ( ! this.snd.length ){ clearInterval(this.intV); return false;}
  21.      return true;
  22. }
  23. window.onload = function (){ var t = new truc();}


ça reste dégueu et améliorable mais au moins on comprends ce que ça fait :o


J'ai juste corrigé le caca existant [:cosmoschtroumpf]
Pour que ça soit propre, faudrait déja que le code soit séparer du html  [:pingouino]


---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 06-11-2007 à 20:27:33    

J'ai trouvé.  :sweat:

Code :
  1. function acts(xw){
  2. var q=0;
  3. var a=0;
  4. for (var i=0; i<fst.length; i++){
  5. setTimeout(function(){Gfight_1(xw,fst[a])},q);q+=1100;
  6. setTimeout(function(){Dfight_1(xw,snd[a++])},q);q+=1100;
  7. }
  8. }

Reply

Marsh Posté le 07-11-2007 à 09:42:30    

c'est code est toujours de la grosse bouse [:spamafote]

  • tu ne parcours qu'un element sur deux de tes tableaux fst/snd
  • rien ne garantit que le snd[a++] existe et que tu vas pas te manger un undefined
  • si tu as 10 elements dans fst, tu vas créer 10 timers alors qu'un interval aurait suffi


Tu veux pas refaire ça proprement :??:

Reply

Marsh Posté le 07-11-2007 à 17:07:45    

L'array fst et snd ont toujours la même longueur, maximum 20 par bouton.
Le but n'est pas de changer la couleur d'un texte, sinon j'aurais opter pour un setInterval. De plus, il faudrait mettre Gfight_1 et Dfight_1 dans le même setInterval.

Reply

Marsh Posté le 07-11-2007 à 17:54:21    

darkkrab a écrit :

L'array fst et snd ont toujours la même longueur, maximum 20 par bouton.


Super donc au lieu de faire 1 setInterval tu fais 40 setTimeout :/

darkkrab a écrit :

Le but n'est pas de changer la couleur d'un texte, sinon j'aurais opter pour un setInterval. De plus, il faudrait mettre Gfight_1 et Dfight_1 dans le même setInterval.


Oui et ??? ou est la difficulté?

Reply

Marsh Posté le 07-11-2007 à 19:28:34    

Code :
  1. var q=0;
  2. function acts(xw){
  3. if(q==0){Gfight_1(xw,fst.shift());q=1}else{Dfight_1(xw,snd.shift());q=0}
  4. if(snd.length>0){setTimeout(function(){acts(xw)},1100)}
  5. }

Message cité 1 fois
Message édité par darkkrab le 07-11-2007 à 20:16:02
Reply

Marsh Posté le 08-11-2007 à 07:13:52    

C'est toujours aussi moche, les deux fonctions font la même chose à un paramètre près, aucun interet.


---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 08-11-2007 à 08:56:48    

+1
et puis pourquoi refuses tu obstinément de faire un setInterval?

Reply

Marsh Posté le 08-11-2007 à 18:52:17    

Je l'ai fait, mais c'est moins précis dans le temps. (1100 * 20 n'égal pas  2200) avec un setInterval.
Mais j'utilise des setInterval pour des choses moins importantes.

Message cité 1 fois
Message édité par darkkrab le 08-11-2007 à 18:54:01
Reply

Marsh Posté le 08-11-2007 à 20:24:40    

(1100 * 20 n'égal pas  2200) avec un setInterval.  
 
toutes les calculettes confirment pourtant [:dawa]


---------------
« The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell
Reply

Marsh Posté le 08-11-2007 à 20:26:48    

darkkrab a écrit :

Je l'ai fait, mais c'est moins précis dans le temps. (1100 * 20 n'égal pas  2200) avec un setInterval.


Avec un setTimeout non plus.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 08-11-2007 à 22:44:38    

darkkrab a écrit :

Code :
  1. var q=0;
  2. function acts(xw){
  3. if(q==0){Gfight_1(xw,fst.shift());q=1}else{Dfight_1(xw,snd.shift());q=0}
  4. if(snd.length>0){setTimeout(function(){acts(xw)},1100)}
  5. }


Cette fonction n'accumule pas les setTimeout, c'est l'important.

Message cité 1 fois
Message édité par darkkrab le 08-11-2007 à 22:56:21
Reply

Marsh Posté le 09-11-2007 à 11:38:49    

darkkrab a écrit :

Cette fonction n'accumule pas les setTimeout, c'est l'important.


 
paske tu appelles tjrs la même fonction en fait :/
essaye d'instancier la fonction à chaque appel ("...setTimeout (new function () { acts (xw) }, 1100); ..." )
 
A tester


---------------
We deserve everything that's coming...
Reply

Marsh Posté le 09-11-2007 à 13:13:50    

ha oui le new ca change tout [:moule_bite]


---------------
« The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell
Reply

Marsh Posté le 09-11-2007 à 13:21:15    

SICKofitALL a écrit :


 
paske tu appelles tjrs la même fonction en fait :/
essaye d'instancier la fonction à chaque appel ("...setTimeout (new function () { acts (xw) }, 1100); ..." )
 
A tester

Si y'avais une idée à la con, cétait celle ci, merci. (en plus de rien changer au problème et proposer une solution qui ne résoud même pas l'hypothétique (et éronné) problème pointé.)


---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 09-11-2007 à 13:37:57    

ah ben oui mais bon je disais bien que c'était à tester, j'ai pas dit que ca résoudrait le "soucis" :o


---------------
We deserve everything that's coming...
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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