11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous =)

Étant grandement satisfait de ce forum et de ses réponses, je reviens ici vous poser une question. Je me heurte aujourd'hui à un nouveau problème... de setTimeout.

Comment passer un objet dans une fonction appelée dans un setTimeout?

Prenons l'exemple :
setTimeout("bonjour(o)", 1500);

o étant un objet, par exemple un document.getElementById() d'un élément de la page (au hasard un div), et bonjour() ma fonction qui attend en paramètre un objet.

Comment passer cette variable en paramètre, sachant qu'elle ne possède pas d'id?

J'ai déjà essayé
setTimeout(function (o) { bonjour(o); }, 1500);
...mais ça ne marche pas comme j'aimerai, et c'est plus du bricolage qu'autre chose... Smiley ohwell

Merci d'avance pour vos réponses =)
Bonne journée.
Modifié par Boa (17 Nov 2008 - 20:25)
Je ne suis pas sûr de ce que j'avance mais sauf erreur on peut admettre cette syntaxe :

setTimeout(fonction, durée, paramètre1, paramètre2, paramètre3, ... );

A tester. Je crois qu'il y avait une autre subtilité mais je ne sais plus exactement laquelle.
Merci beaucoup, ça fonctionne nickel. Smiley cligne

Si quelqu'un a une autre proposition je prends aussi, ça m'intéresse. Smiley langue

En tous cas merci ! =)

Bonne soirée Smiley cligne

Edit : J'ai eu un pb sous IE !
Heureusement avec des mots clés plus appropriés j'ai enfin trouvé un sujet traitant de mon problème.
http://forum.alsacreations.com/topic-5-22259-1.html#p176078

Bonne soirée, again. Smiley cligne

ReÉdit : Problème non résolu =(

Mon script marche parfait sous FF... Mais impossible de le corriger sous IE..

setTimeout(changer_opacite, delai, i, o); marche parfaitement sauf IE

Je me rabat donc sur l'autre méthode qui marche sous IE et FF...
setTimeout(function () {changer_opacite(i,o)}, delai);

... mais il semble que cette méthode utilise les valeurs i et o courantes, c'est-à-dire que si elles changent entre le moment de l'appel au setTimeout et l'appel à la fonction changer_opacite, ce sont les nouvelles valeurs qui sont prises... Et là mon script foire complètement... Ce n'est pas l'effet attendu Smiley ohwell

Comment corriger ça? =(

Désolé...
Modifié par Boa (17 Nov 2008 - 20:32)
Un petit coucou pour rappeler mon problème... Je n'ai toujours pas trouvé la solution...

setTimeout(function () {changer_opacite(i,o)}, delai);

Ne prend pas les valeurs i et o au moment où elles ont été passées dans le setTimeout, mais prend les valeurs actuelles de i et de o. C'est-à-dire que si elles ont été modifiée entre l'appel et l'execution, ce sont les valeurs modifiées qui sont prises en compte.

Pourquoi? Comment corriger ce problème?
:/

Merci d'avance
je rentre à peu de chose près le même problème.
As tu trouvé une solution depuis ?

D'avance merci
a écrit :
... mais il semble que cette méthode utilise les valeurs i et o courantes, c'est-à-dire que si elles changent entre le moment de l'appel au setTimeout et l'appel à la fonction changer_opacite, ce sont les nouvelles valeurs qui sont prises... Et là mon script foire complètement... Ce n'est pas l'effet attendu

C'est normal. Typiquement, ça ne marche pas avec les boucles .

Avec ça vous obtenez 5 fois le chiffre 4 et tout en même temps :

for (var i=0; i<5; i++) {
setTimeout(function () { alert(i); }, 3000);
}


En fait, il faut ruser un peu. Voici un truc qui devrait marcher, j'ai pas vérifié :

function delegator (i) {
return function () {
alert(i);
}}

for (var i=0; i < 5; i++) {
setTimeout(delegator(i), 3000);
}

Bon vous avez toujours les 5 alert qui arrivent en même temps, mais je pense que vous voyez l'idée... il faut isoler le paramètre ailleurs.

EDIt : la variante ci-dessous devrait aussi marcher

for (var i=0, i < 5; i++) 
setTimeout(function(i){return function(){ alert(i); }})(i), 3000);


Modifié par QuentinC (14 Sep 2009 - 09:42)