Fonction récursive dans boucle while

Petit nouveau ! | 1 Messages

29 mars 2011, 16:51

Bonjour,

J'ai un problème avec une fonction récursive ("slide" dans le code, écrite en JavaScript) appelée dans une boucle while (écrite en php). La fonction récursive hors de la boucle fonctionne.

Voilà ce que je souhaite faire :
J'ai des paragraphes (au format texte) stockés dans une base de données MySQL. Je souhaite afficher ses paragraphes en bas d'une page et les faire défiler verticalement, les uns à la suite des autres.
J'ai donc pour cela une fonction slide en JavaScript, qui permet le mouvement vertical du texte, et j'appelle cette fonction dans la boucle while de la requête qui va chercher les paragraphes dans la base de données.
Le problème c'est que la boucle while s'éxécute sans attendre que la fonction récursuve JavaScript soit terminée. Et donc elle (la boucle while) se termine avant la fin de la première éxécution de la fonction slide. J'ai donc seulement le premier paragraphe qui s'affiche et défile.

Je vous poste mon code. Est-ce qu'il y a une erreur ? Ou y-a t'il une autre méthode pour faire cela ?

Merci

Sophie
<head>
	
<script language="JavaScript1.2">

var isNS = (navigator.appName == "Netscape");
var HIDDEN = (isNS) ? 'hide' : 'hidden';
var VISIBLE = (isNS) ? 'show' : 'visible';
var hide=true;

function showObject(object) {
		object.visibility = VISIBLE;
}

function hideObject(object) {
		object.visibility = HIDDEN;
}

function sleep(milliseconds) {
  	var start = new Date().getTime();
  	for (var i = 0; i < 1e7; i++) {
    	if ((new Date().getTime() - start) > milliseconds){
      	break;
    }
  }
}

function hideIt(effet){
   if(hide){
			effet.visibility="hidden"
	}
}

function slide(effet,from,to,from1,to1) {
		//position de départ horizontale
		ide.left = 0;
		//position de départ verticale
		ide.top = 200;

		showObject(ide);

		//slide effet
		if (from > to) {
			 ide.left = (from -= 2);//7
			}
		if (from1 > to1) {
			 ide.top = (from1 -= 2);//4
			}

		if ((from > to) || (from1 > to1)){
  			setTimeout('slide(ide,' + from + ',' + to + ',' + from1 +',' + to1 + ')', 25);
  		}

		if (from1==to1){
      	sleep(2000);
      	hideIt(ide);
      	var fini=true;
    	}
}

</script>

<style type="text/css">
		<!--
		.aspect {position:absolute;visibility:hidden}
		-->
</style>
</head>

<body>
	
<?

@mysql_connect($hote,$user,$pwd) or die ("impossible de se connecter au serveur");
@mysql_select_db($bdd) or die ("impossible de se connecter à la base");
								
$query="select uid, bodytext from tt_content where pid=1530 and deleted=0 order by uid";
$result=mysql_query($query);
?>
<script language="JavaScript">
	  var fini=true;
</script>	
							
<?
while($val=mysql_fetch_array($result)){
?>
			<div id="<? echo "id_".$val["uid"];?>" class="aspect">
			<? echo $val["bodytext"];?>
			</div>
					
			<script language="JavaScript">
					if (fini==true){
							var <? echo "id_".$val["uid"];?> = (isNS) ? document.<? echo "id_".$val["uid"];?> : document.all.<? echo "id_".$val["uid"];?>.style;	
							var ide=String;
							ide=<? echo "id_".$val["uid"];?>
															
							slide(ide,0,0,200,0);
							fini=false;
							}
			</script>
 			<?
			}			
?>

</body>
Modifié en dernier par Helphie le 29 mars 2011, 17:10, modifié 1 fois.

ViPHP
ViPHP | 5462 Messages

29 mars 2011, 16:57

un peu poussiéreux le code, commence par tout remettre bien à jour déjà

Mammouth du PHP | 672 Messages

31 mars 2011, 10:47

Le problème c'est que la boucle while s'éxécute sans attendre que la fonction récursuve JavaScript soit terminée. Et donc elle (la boucle while) se termine avant la fin de la première éxécution de la fonction slide. J'ai donc seulement le premier paragraphe qui s'affiche et défile.
Il faut revoir les bases.

PHP s'exécute côté serveur.
JS s'exécute côté client.

En clair (dans une utilisation classique) :
1. Le client demande la page.
2. Le serveur voit que c'est une page php, il l'exécute.
3. La page résultat est envoyée au client.
4. Le client voit qu'il y a du JS, il l'exécute (ou pas).

=> Forcément, la boucle PHP while sera exécutée avant le code JS...

Tu veux afficher les paragraphes un par un, c'est bien ça ?
Le plus simple =>
1. PHP génére les paragraphes en leur donnant un ID adéquat (genre <p id="defil_$NumeroParagraphe">)

2. Le JS de la page générée va s'occuper de la présentation :
- Tu crées une fonction AfficherParagraph(numero_paragraphe) qui va cacher tous les paragraphes sauf celui passé en paramètre.
- Au démarrage, tu passes la fonction pour le paragraphe 1.
- Après une temporisation tu rappelles la fonction pour le paragraphe suivant.

Sinon, tu peux jouer avec de l'AJAX, mais ça devient plus compliqué...

Invité
Invité n'ayant pas de compte PHPfrance

01 avr. 2011, 10:51

Ok merci pour tes conseils macgawel, je vais revoir tout ça.
C'est bien un par un que je voudrais afficher les paragraphes, ou finalement peut-être en continu, à voir...

Ca fait longtemps que je n'ai pas fait de php et je ne me souvenais plus que le php s'exécute avant le JS, je comprends mieux maintenant.

Bonne journée