Fonction récursive dans boucle while

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Fonction récursive dans boucle while

Re: Fonction récursive dans boucle while

par Invité » 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

Re: Fonction récursive dans boucle while

par macgawel » 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é...

Re: Fonction récursive dans boucle while

par stealth35 » 29 mars 2011, 16:57

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

Fonction récursive dans boucle while

par Helphie » 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>