11521 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

je développe actuellement un diaporama de 6 images qui défilent automatiquement, ça fonctionne via le code ci-dessous :

var diapoOK = true;
var i = 0;
var resultat = diaporama();
 
function diaporama() {
 
	/*Si la variable diapoOK est à true, on lance le programme*/
 
		if (diapoOK){
 
			i++;
 
			var image = i;
 
			var precedent = '#img' + (i-1);
			var actuel = '#img' + i;
 
			if (i == 1){
				var precedent = '#img6';
			}
 
			$(precedent).fadeOut(2000);
			$(actuel).fadeIn(2000);
 
			if (i == 6) {image = i; i = 0;}	
 
			return (image);
		}
	}
 
setInterval(diaporama, 5000);


J'appelle ma fonction diaporama toutes les 5 secondes et celle-ci est censé me retourner l'indice de l'image actuellement affichée dans ma variable globale resultat sauf que dans la pratique, la variable image prend bien les différentes valeurs de i dans la fonction, mais resultat reste désespérément à 1 et là je bloque Smiley biggol

Comment faire pour que resultat dans le prog principal récupère bien les différentes valeurs de image de la fonction ?

Merci d'avance Smiley smile
C'est normal que résultat stagne à la première valeur, car tu l'assigne une seul fois. alors que la fonction est récursive,
il faudrait l'assigner tout le temps avec resultat = image
Bonjour Jencal,

merci de ta réponse, je ne vois pas trop comment faire par contre. Je dois déclarer image en variable globale ? Si resultat = image, je stocke où par contre le retour de la fonction diaporama ?
Modérateur
Salut,

J'avoue avoir lu en Z ton sujet.

Je ferai plutôt un

++i;

ou pour être sûr :

i  += 1;


Ensuite, je lis 2 if qui peuvent être facilement supprimer : Regarde en faisant un modulo de i sur le nombre d'images. Smiley cligne
Bonjour Niuxe,

Merci pour les infos d'optimisation mais ce n'est pas vraiment ce qui m'importe pour le moment lol, comme je l'ai indiqué dans mon premier post :
Comment faire pour que resultat dans le prog principal récupère bien les différentes valeurs de image de la fonction ?

J'ai tenté la solution de Jencal (en espérant que je ne me sois pas planté) en remplaçant var resultat = diaporama(); par var resultat = 0; et la ligne return (image); par resultat = image; mais ça ne fonctionne toujours pas.

Quand je me penche davantage sur le programme, je vois qu'il ne fait que des allers retours entre setInterval et la fonction, il ne prend plus en compte les autres lignes de code dans le programme principal (il ne les a pris en compte que la première fois). Là j'avoue je ne vois pas quoi faire Smiley decu
Bonjour JENCAL,

oui c'est ce que j'ai fait, j'ai remplacé la ligne return (image); par resultat = image; mais ça ne passe pas.
Modérateur
Bonjour,

Le code suivant affiche la valeur de resultat au bout de 15 secondes (le reste du code est le code intial avec l'ajout de resultat=image comme conseillé précédemment), et celle-ci vaut bien 4 comme attendu.

var diapoOK = true;
var i = 0;
var resultat = diaporama();
 
function diaporama() {
 
	/*Si la variable diapoOK est à true, on lance le programme*/
 
	if (diapoOK){

		i++;

		var image = i;

		var precedent = '#img' + (i-1);
		var actuel = '#img' + i;

		if (i == 1){
			var precedent = '#img6';
		}

		//$(precedent).fadeOut(2000);
		//$(actuel).fadeIn(2000);

		if (i == 6) {image = i; i = 0;}
		resultat = image;
	}
}

function afficheResult()
{
	alert("r="+resultat);
}

setInterval(diaporama, 5000);
setTimeout(afficheResult, 15000);
Comment testes-tu la valeur de resultat ? La valeur de diapoOK est-elle modifiée à d'autres endroits de ton code ?

Amicalement
Modifié par parsimonhi (04 Mar 2016 - 11:36)
rocketter a écrit :
Bonjour JENCAL,

oui c'est ce que j'ai fait, j'ai remplacé la ligne return (image); par resultat = image; mais ça ne passe pas.


regarde bien le code de parsimonhi, si cela ne fonctionne pas (ce qui me paraîtrai bizarre!) partage nous tes modifications
Merci de ton code parsimonhi, il fonctionne par contre j'ai 3 et non 4 qui s'affiche. Je teste la valeur de resultat par un console.log(resultat) et la valeur de diapoOK n'est modifiée nulle part ailleurs.

J'ai réussi à m'en tirer sinon via ce code :

var diapoOK = true;
var i = 0;
var resultat;
 
function diaporama() {
 
	/*Si la variable diapoOK est à true, on lance le programme*/
 
	if (diapoOK){

		i++;

		var image = i;

		var precedent = '#img' + (i-1);
		var actuel = '#img' + i;

		if (i == 1){
			var precedent = '#img6';
		}

		//$(precedent).fadeOut(2000);
		//$(actuel).fadeIn(2000);

		if (i == 6) {image = i; i = 0;}
		return(image);
	}
}

setInterval(function(){
			resultat = diaporama();
			$('.test').text(resultat);
                        }, 5000);



Dans un paragraphe de class 'test', j'ai mes valeurs de resultat qui s'affichent.

Maintenant me reste à coder les boutons suivant et précédent mais j'm'aperçois que ça ne sera pas aussi simple que ce que je pensais.

Merci de votre aide les gars Smiley smile
Modifié par rocketter (04 Mar 2016 - 15:05)
Modérateur
rocketter a écrit :
Bonjour Niuxe,

Merci pour les infos d'optimisation mais ce n'est pas vraiment ce qui m'importe pour le moment lol, comme je l'ai indiqué dans mon premier post :
Comment faire pour que resultat dans le prog principal récupère bien les différentes valeurs de image de la fonction ?

J'ai tenté la solution de Jencal (en espérant que je ne me sois pas planté) en remplaçant var resultat = diaporama(); par var resultat = 0; et la ligne return (image); par resultat = image; mais ça ne fonctionne toujours pas.

Quand je me penche davantage sur le programme, je vois qu'il ne fait que des allers retours entre setInterval et la fonction, il ne prend plus en compte les autres lignes de code dans le programme principal (il ne les a pris en compte que la première fois). Là j'avoue je ne vois pas quoi faire Smiley decu



    var counter = 0,
        autoplay = true,
        $elImg = document.querySelectorAll('img'),
        nbElImg = $elImg.length,
        speed = 500,
        diaporama = function(){
            if (autoplay) {
                var toggleClass = "show";
                
                $elImg[counter % nbElImg].classList.remove(toggleClass);             
                $elImg[++counter % nbElImg].classList.add(toggleClass);
            }
        },
        displayDiaporama = setInterval(diaporama, speed);


À toi d'imaginer le reste Smiley cligne
Modifié par niuxe (05 Mar 2016 - 02:11)
C'est aussi une façon de faire Niuxe, cette syntaxe ne me serait pas forcément venu à l'idée mais je retiens pour optimiser mon prog Smiley smile