Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Variable de foncton à fonction

9 réponses
Avatar
ppellero
Bonjour,

J'ai une fonction qui se charge en mémoire pour faire défiler des photos.

J'ai une deuxième fonction qui permet de choisir une photo dans la liste
et je voudrai que cette fonction modifie le numéro d'ordre (variable
num) de la fonction principale de telle manière que quand je fait
suivant j'ai la photo suivante de la fonction principale.
Mon problème et que je n'arrive pas à modifier la variable de la
fonction en mémoire.
function ejs_aff_photos(num)
{
if(document.getElementById)
{
if (num < 0) {
num = (nb-1);
}
if (num > (nb-1)) {
num = 0;
}

ejs_fin = "";

ejs_fin += "<input type='button' value='<< image précédente'
onClick='ejs_aff_photos("+(num-1)+");return(false)'>";
ejs_fin += "<input type='button' value='Autres photos'
onClick='window.close(); return(false)'>";
ejs_fin += "<input type='button' value='image suivante >>'
onClick='ejs_aff_photos("+(num+1)+");return(false)'>";

document.getElementById("ejs_photo_box").innerHTML = "<table border=2
width=100%><tr><td height=620><CENTER><IMG id=MonImage value=num
SRC='"+ejs_photo[num]+"' BORDER=5></td></tr><tr><td colspan=2
align=center><BR />"+ejs_fin+"</CENTER></td></tr></table>";
}
} //fin de fonction affiche photos

function pointe(x) { // permet d'aller directement sur une image
num = x; // ne marche pas
document.MonImage.src = ejs_photo[x];
}

la fonction pointe() n'arrive pas à modifier la variable num de la
fonction ejs_aff_photos(num).

Si quelqu'un pouvait me venir en aide se serait super.
Merci

Paul
--
Paul Pellero Agay (Var)

9 réponses

Avatar
SAM
Bonjour,

J'ai une fonction qui se charge en mémoire pour faire défiler des photos.

J'ai une deuxième fonction qui permet de choisir une photo dans la liste
et je voudrai que cette fonction modifie le numéro d'ordre (variable
num) de la fonction principale de telle manière que quand je fait
suivant j'ai la photo suivante de la fonction principale.
Mon problème et que je n'arrive pas à modifier la variable de la
fonction en mémoire.


il te faut mettre num en variable globale
comme ça num sera en "mémoire"

Exemple :

<html>
<style type="text/css">
td { text-align:center; }
</style>
<script type="text/javascript">
var ejs_photo = [ // les photos
'vue_1.jpg',
'vue_2.jpg',
'vue_3.jpg',
'vue_4.jpg'
];
var num = 0; // compteur
var nbr = ejs_photo.length; // nombre de photos
function chgeVue() {
num = num>=nbr? 0 : num<0? nbr-1 : num;
document.viewer.src = ejs_photo[num];
}
</script>
<table width="100%" height="100%">
<tr height="22">
<td>
<button onclick="num--;chgeVue();"> < < </button>
<td>
<select onchange="var k=this.selectedIndex;
if(k==0) alert('faire autre choix')
else { num = +k-1; chgeVue();}">
<option selected>Voir vue :</option>
<script type="text/javascript">
for(var i in ejs_photo)
document.write('<option>vue N°'+(+i+1));
</script>
</select>
</td><td>
<button onclick="num++;chgeVue();"> > > </button>
</td>
</tr><tr>
<td colspan="3">
<img name="viewer" src="" alt="">
</td>
</tr>
</table>
</html>


--
sm

Avatar
ppellero
Voici le script complet je vais étudier le tiens pour essayer de les
fusionner.
Les vignettes doivent êtres dans le répertoire "vignettes" et avoir le
même nom que les photos.
La fonction ejs_aff_photos se rappelle elle même et ne permet pas de
récuperer un nouvelle valeur de num.

[code]
<style>
div#galerie_mini {
overflow:auto;
white-space: nowrap;
width: 830px;
height:150px;
margin-left: auto;
margin-right: auto;
}

body {
background-color: #c0c0c0;
}

</style>
<DIV ID=ejs_photo_box></div>

<script type="text/javascript">
ejs_photo = new Array;
var numero = 0;

<?
global $a;
$a = 0;
$diapo = array();
$handle = opendir("./");
while (($fichier = readdir($handle))!úlse) {
clearstatcache();
if (is_file("./$fichier") && eregi(".jpg",$fichier))
{
echo "ejs_photo[$a] = './$fichier';";
$diapo[$a] = $fichier;
$a++;
}
}
closedir($handle);
?>

var nb = ejs_photo.length;

function ejs_aff_photos(numero)
{
num = numero;
if(document.getElementById)
{
if (num < 0) {
num = (nb-1);
}
if (num > (nb-1)) {
num = 0;
}

ejs_fin = "";

ejs_fin += "<input type='button' value='<< image précédente'
onClick='ejs_aff_photos("+(num-1)+");return(false)'>";
ejs_fin += "<input type='button' value='Autres photos'
onClick='window.close(); return(false)'>";
ejs_fin += "<input type='button' value='image suivante >>'
onClick='ejs_aff_photos("+(num+1)+");return(false)'>";

document.getElementById("ejs_photo_box").innerHTML = "<table border=2
width0%><tr><td heightb0><CENTER><IMG id=MonImage value=num
SRC='"+ejs_photo[num]+"' BORDER=5></td></tr><tr><td colspan=2
alignÎnter><BR />"+ejs_fin+"</CENTER></td></tr></table>";
}
} //fin de fonction affiche photos

function pointe(x) {
numero = x;
document.MonImage.src = ejs_photo[x];
return num;
} //fin de function pointe


window.onload = new Function("ejs_aff_photos(0)")

</script>

<div id="galerie_mini">
<br />
<?php
$base = ("vignettes/");

$i = 0;
while( $i < $a )
{
$vig = $diapo[$i];
//echo $base.$vig;
echo ("<input type="image" value="" onclick="pointe($i)"
src="$base$vig" />' '");
$i++;
}
?>
</div>
[/code]



--
Paul Pellero Agay (Var)
Avatar
SAM
Voici le script complet je vais étudier le tiens pour essayer de les
fusionner.
Les vignettes doivent êtres dans le répertoire "vignettes" et avoir le
même nom que les photos.


Ha! tien ? il y a des vignettes maintenant ?
Je croyais que c'était un simple side-show (passe vue sans prévisualisation)


La fonction ejs_aff_photos se rappelle elle même et ne permet pas de
récuperer un nouvelle valeur de num.


Merci de nous éviter le code php ... ici on traite du JavaScript !


[code]
<style>
div#galerie_mini {
overflow:auto;
white-space: nowrap;
width: 830px;
height:150px;
margin-left: auto;
margin-right: auto;
}

body {
background-color: #c0c0c0;
}

</style>
<DIV ID=ejs_photo_box></div>

<script type="text/javascript">
ejs_photo = new Array;
var numero = 0;

<?
global $a;
$a = 0;
$diapo = array();


Pourquoi ne peux tu simplement foreacher les noms de fichier pour ne
faire écrire que ce nom dans l'array JS ?

Puisque les vignettes et photos ont même nom, pour trouver l'une ou
l'autre il suffit alors de désigner leurs dossiers respectifs en plus.

$handle = opendir("./");
while (($fichier = readdir($handle))!úlse) {
clearstatcache();
if (is_file("./$fichier") && eregi(".jpg",$fichier))
{
echo "ejs_photo[$a] = './$fichier';";


ben ... non ...
echo "ejs_photo[$a] = '$fichier';n";

$diapo[$a] = $fichier;
$a++;
}
}
closedir($handle);
?>

var nb = ejs_photo.length;

function ejs_aff_photos(numero)
{
num = numero;
if(document.getElementById)
{
if (num < 0) {
num = (nb-1);
}
if (num > (nb-1)) {
num = 0;
}

ejs_fin = "";


Là, je ne comprends toujours pas pourquoi il faut faire innerHTMLer tout
ce fatras.
à chaque changement de vue ! !

ejs_fin += "<input type='button' value='<< image précédente'
onClick='ejs_aff_photos("+(num-1)+");return(false)'>";
ejs_fin += "<input type='button' value='Autres photos'
onClick='window.close(); return(false)'>";
ejs_fin += "<input type='button' value='image suivante >>'
onClick='ejs_aff_photos("+(num+1)+");return(false)'>";

document.getElementById("ejs_photo_box").innerHTML = "<table border=2
width0%><tr><td heightb0><CENTER><IMG id=MonImage value=num
SRC='"+ejs_photo[num]+"' BORDER=5></td></tr><tr><td colspan=2


SRC='photos/"+ejs_photo[num]+"' BORDER=5></td></tr><tr><td colspan=2

alignÎnter><BR />"+ejs_fin+"</CENTER></td></tr></table>";
}
} //fin de fonction affiche photos

function pointe(x) {
numero = x;
document.MonImage.src = ejs_photo[x];
return num;
} //fin de function pointe


function pointe(quoi) {
for(var i in ejs_photo)
if(ejs_photo[i]==quoi) ejs_aff_photos(i);
}

ou (si le dossier des photos est [photos] ) :

function pointe(quoi) {
document.MonImage.src = 'photos/' + quoi;
}

window.onload = new Function("ejs_aff_photos(0)")

</script>

<div id="galerie_mini">
<br />
<?php
$base = ("vignettes/");

$i = 0;
while( $i < $a )
{
$vig = $diapo[$i];
//echo $base.$vig;


print ( "<img src="$base$vig" onclick="pointe('$vig');"
title="Clic pour grande vue" alt=''>n");

$i++;
}
?>
</div>
[/code]


--
sm

Avatar
Bruno Desthuilliers
Bonjour,

J'ai une fonction qui se charge en mémoire pour faire défiler des photos.

J'ai une deuxième fonction qui permet de choisir une photo dans la
liste et je voudrai que cette fonction modifie le numéro d'ordre
(variable num) de la fonction principale de telle manière que quand je
fait suivant j'ai la photo suivante de la fonction principale.
Mon problème et que je n'arrive pas à modifier la variable de la
fonction en mémoire.


il te faut mettre num en variable globale
comme ça num sera en "mémoire"


Avec comme conséquence que tu ne peux gérer qu'un seul slideshow par
page (ce qui n'est pas forcément un pb, à toi de voir). L'autre solution
étant d'utiliser une approche objet.


Avatar
ppellero
J'ai mis le code complet pour qu'il soit compréhensible!
Toujours aussi aimable dans ces news!



Merci de nous éviter le code php ... ici on traite du JavaScript !


--
Paul Pellero Agay (Var)

Avatar
Mickaël Wolff
J'ai mis le code complet pour qu'il soit compréhensible!


Justement, c'est incompréhensible ainsi. Un bonne méthode de travail,
pour déterminer la provenance d'un comportement inattendu, c'est de
séparer les choses.

Toujours aussi aimable dans ces news!
M'en diras-tu tant !


--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org

Avatar
SAM
J'ai mis le code complet pour qu'il soit compréhensible!


d'ajouter le php ne fait qu'encombrer

Toujours aussi aimable dans ces news!


alors là faut pas se formaliser non plus !


Merci de nous éviter le code php ... ici on traite du JavaScript !



et puis essayer de répondre dans l'ordre :
la réponse *après* ce à quoi on fait référence

--
sm


Avatar
ppellero
J'ai résolu mon problème :

Il faut simplement rappeler la fonction principale à partir de la
deuxième fonction.
Maintenant quand je clique sur une vignette et que je fait "suivant"
j'ai bien la photo suivante de celle qui a été cliquée.

Merci à tous de votre attention.

Paul

Bonjour,

J'ai une fonction qui se charge en mémoire pour faire défiler des photos.

J'ai une deuxième fonction qui permet de choisir une photo dans la liste
et je voudrai que cette fonction modifie le numéro d'ordre (variable


--
Paul Pellero Agay (Var)

Avatar
SAM
J'ai résolu mon problème :

Il faut simplement rappeler la fonction principale à partir de la
deuxième fonction.


oui comme donné dans autre post.
(mais peut-être n'as-tu pas lu après la ligne à propos du php?)

Variante :

function pointe(quoi) {
quoi = quoi.src;
quoi = quoi.substring(quoi.lastIndexOf('/')+1);
for(var i in ejs_photo)
if(ejs_photo[i].indexOf(quoi)>=0) ejs_aff_photos(i);
}

<img class="vignette" onclick="pointe(this);" src=" ...


--
sm