11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous !

Je réalise actuellement une diapo photo avec un défilement automatique des photos toutes les 2 secondes. Je pensais ça simple mais je me heurte à un soucis important.
Voilà en partant du principe que j'ai 4 photos :
for (i=0; i<=4; i++)
setTimeout("suivant()",2);

Dans ma tête, on passe 4 fois dans la boucle et on attend (à chaque passage dans la boucle) 2 secondes avant de passer à la photo suivante.

Or voici ce qu'il se passe : le navigateur attend 8 secondes (4images x 2secondes) et affiche la dernière des 4 images. Smiley eek

Une idée de l'endroit où je m'y prend mal ?
Modifié par Mucsy (15 Nov 2006 - 16:46)
Yep !

En fait, dans ton code, tel que tu l'écris, tu cherches à utiliser settimeout comme une pause. Alors que ce n'en est pas une.

settimeout déclenche l'exécution de la fonction après un nombre donné de ms. Mais n'arrête pas pour autant l'exécution du code (Attention, au passage, ton 2, il vaut peut être mieux le mettre à 2000 déjà...)

Tout ce que tu fais donc avec ton code c'est d'empiler à tout berzingue (le code ne s'arrête pas sur settimeout) 4 requêtes de ta fonction suivant.

Le mieux à mon avis est de virer ta boucle for.

Tu mets ton nombre de photos en variable globale,
Tu écris ta fonction suivant que tu termines par :

Un décrément du nombre de photos,
ton settimeout("suivant()",2000) si le nombre restant de photos n'est pas nul.
Modifié par aCOSwt (15 Nov 2006 - 15:58)
Aaaah, la récursivité !!!

merci pour ta solution, je vais tester ça.

Je pensais que l'exécution du code s'arretait pendant le setTimeout(). Et pour le "2", c'est juste une erreur de post...

Merci
Modifié par Mucsy (15 Nov 2006 - 16:47)
Mucsy a écrit :
Aaaah, la récursivité !!!


ARGH ! Que nenni mucsy ! Pas de la récursivité !

Juste une petit bout de vraie-fausse réentrance (cela s'écrit comme de la réentrance, cela à la couleur de la réentrance, mais... c'est du...)
Smiley biggrin
Modifié par aCOSwt (15 Nov 2006 - 15:56)
au fait :

- un indice : "Un décrément du nombre de photos"
- une condition de sortie : "si le nombre restant de photos n'est pas nul"
- une fonction appelée à l'intérieur d'elle-même : "suivant()"

je crois qu'on a tous les ingrédients de la récursivité non ?
Pas tout à fait Mucsy.

Ton précédent post décrit une réentrance. Une vraie celle-là.

La récursivité c'est réservé aux langages type lisp ou similaires et aux moteurs d'inférences. On parle de récursivité à droite, à gauche... cela n'a pas grand chose à voir.

Ton post décrit une vraie réentrance car tu écris :

"Une fonction appelée à l'intérieur d'elle-même".

Cependant, si tu y regardes bien, ce n'est pas exactement le cas de ta fonction suivant() qui n'appelle pas elle-même suivant() vu qu'elle charge settimeout de le faire. ET que (ne raisonne pas encore une fois comme s'il s'agissait d'une pause) ta fonction suivant se sera terminée largement avant que le timeout ne se soit écoulé et que le système relance l'exécution de suivant.

C'est pourquoi je parle de vraie-fausse réentrance.

D'ailleurs si c'était vraiment de la réentrance, je ne te parle pas des précautions qu'il faudrait prendre avec les variables pour que cela fonctionne.
Modifié par aCOSwt (16 Nov 2006 - 09:07)
Salut,
aCOSwt a écrit :
D'ailleurs, excuse-moi QuentinC, j'avais oublié une belle discussion sur ce sujet avec toi, mais... je me ratrappe...

http://forum.alsacreations.com/topic.php?fid=5&tid=18680&s=[/url]
Ta balise url est mal formée.

Soit dit en passant, par rapport à la discussion que vous aviez eu avec QuentinC, il n'est à ma connaissance pas possible que la fonction donnée dans le setTimeout commence à s'exécuter alors que l'on est encore dans la fonction qui appelle le setTimeout, tout simplement parce que les navigateurs n'utilisent qu'une seule thread pour le code Javascript (ce qui de toute façon indispensable pour éviter d'avoir à gérer les problèmes de concurrence...), qui est d'ailleurs je crois la même que celle de l'interface graphique (il suffit d'aller sur un site qui utilise beaucoup de Javascript pour s'en convaincre).
Eldebaran a écrit :
Salut, Ta balise url est mal formée.


Ton canard aussi ! Smiley langue

Mais ! C'est bizarre ! Les deux marchent ! (Ton canard et mon url) Smiley lol

Comme quoi... provide tools ! not policy ! Coin Coin !
Modifié par aCOSwt (17 Nov 2006 - 21:44)
aCOSwt a écrit :

La récursivité c'est réservé aux langages type lisp ou similaires et aux moteurs d'inférences. On parle de récursivité à droite, à gauche... cela n'a pas grand chose à voir.


Hum,
" La récursivité est la possibilité pour une procédure de s'appeler elle même."

Pratiquement tous les langages peuvent être récursifs. Il y a des années de cela, je codais des routines récursives... en assembleur, en empilant les données, et en surveillant les débordements...

Même si la récursivité est l'un des piliers principaux de lisp, elle n'est pas réservée à un type de langage. Javascript, php, et même xsl permettent la récursivité.

Par contre, la réentrance, c'est devenu un concept flou, pour moi... Mais ça ressemble effectivement à ce cas de figure.
Modifié par GeorgesM (18 Nov 2006 - 09:05)