[résolu] image aléatoire : comment faire?

Le premier forum francophone sur l'éditeur de pages Web multiplateforme (Linux, Mac OS X, Windows) qui monte… KompoZer, héritier de Nvu, permet de créer vos pages Web graphiquement (wysiwyg) sans aucune connaissance du langage HTML.

Modérateur : chinon37

Québec
Salamandre
Messages : 30
Inscription : 07 sept. 2007, 15:03

[résolu] image aléatoire : comment faire?

Message par Québec »

Bonjour à tous. J'ai un petit problème avec la syntaxe de la formule random. Je vois mal (en fait, pas du tout!!! :? ) comment l'intégrer dans mes lignes de codes.

J'aimerais faire en sorte que l'image de ma page d'accueil change à chaque chargement. Pour ce faire, j'ai trouvé les lignes de code suivantes écrites par Django (Oznog) Blais du site Trucsweb (23 Janvier 1999):

Code : Tout sélectionner

<script type="text/javascript" language="javascript">
{
    document.write('<img src="images/'+ Math.round((Math.random()*9)+1)+ '.gif" />');
}
</script>
J'ai « ouvert » le code de ma page (onglet source), et j'ai remplacé ce qui y était par le code de Oznog (là où se trouve l'appel d'image). L'image a disparu et c'est la ligne de code qui est apparue à la place... Bon, sur le coup j'ai rigolé... un peu! Mais après quelques essais je suis arrivé à la conclusion que le « courant » ne passe pas trop entre moi et la fonction random... Ou alors, c'est un complot!!!

Voici la ligne de code qui appel l'image dans ma page index:

Code : Tout sélectionner

<br><img
 src="4.jpg" alt="Photo argentique"
 style="position: absolute; top: 172px; left: 443px; width: 252px; height: 168px;"></div></body></html>
Si un pro du html pouvait me donner quelques indications, je suis certain que cela ferais bien des heureux.

Maintenant, il y a peut-être une autre façon de faire apparaître une image aléatoire qui serait plus intéressante? (ou plus simple encore?).

Merci!


Message envoyé avec : Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; fr; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6
Ymai
Tyrannosaurus Rex
Messages : 4220
Inscription : 12 mars 2005, 11:36

Message par Ymai »

Bonjour
Sommes-nous bien d'accord sur le fait que le code

Code : Tout sélectionner

<script type="text/javascript" language="javascript">
{
document.write('<img src="images/'+ Math.round((Math.random()*9)+1)+ '.gif" />');
}
</script> 
remplace exclusivement

Code : Tout sélectionner

<img
src="4.jpg" alt="Photo argentique"
style="position: absolute; top: 172px; left: 443px; width: 252px; height: 168px;">
tout le reste étant inchangé?
Sinon, le code me paraît irréprochable.
Une façon de s'en convaincre:

Code : Tout sélectionner

<script type="text/javascript" language="javascript">
{
alert('<img src="images/'+ Math.round((Math.random()*2)+1)+ '.gif" />');
}
</script>
Message envoyé avec : Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.6) Gecko/20061201 Firefox/2.0.0.6 (Ubuntu-feisty)
ymai
« Un enfant de cinq ans comprendrait cela ! Allez me chercher un enfant de cinq ans ! »
Groucho Marx.
Kazé
Varan
Messages : 1743
Inscription : 10 févr. 2005, 10:26

Message par Kazé »

Donne-nous l'URL de ta page web, ça sera plus simple. ;-)
KompoZer lead dev
Ubuntu 10.04 Lucid Lynx — « L'erreur est humaine, mais vraiment foutre la merde nécessite le mot de passe root. »
Québec
Salamandre
Messages : 30
Inscription : 07 sept. 2007, 15:03

Message par Québec »

Je veux conserver le «alt» ainsi que la position de la photo.

Ce que je comprend de la fonction random, c'est qu'au lieu d'avoir l'adresse d'une image spécifique, on demande au compilateur de « piocher » dans un dossier.

Je crois que le problème provient du fait que le navigateur (ici Firefox), en compilant la page, ne trouve pas le chemin vers le dossier qui contient les images.

J'ai remplacé la partie « <img src="4.jpg" » par la fonction random ( « <script ... </script> ), mais l'image disparaît. Donc, j'en conclus que je fais une erreur sur l'adressage du dossier images. À moins que je me trompe? Ce qui ne serait pas impossible!!! Dur dur d'être débutant! La question est donc: comment donner à la fonction random l'adresse du dossier où se trouve les photos? En attendant une réponse, j'vais toujours ben essayer autre chose!

Merci!

Message envoyé avec : Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; fr; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6
Ymai
Tyrannosaurus Rex
Messages : 4220
Inscription : 12 mars 2005, 11:36

Message par Ymai »

Québec a écrit :Je veux conserver le «alt» ainsi que la position de la photo.

Ce que je comprend de la fonction random, c'est qu'au lieu d'avoir l'adresse d'une image spécifique, on demande au compilateur de « piocher » dans un dossier.
Exact. On demande au serveur de piocher dans le sous-répertoire "images", une image dont le nom est choisi aléatoirement. Mais, l'ensemble des images possibles doit obligatoirement porter un nom du type "1.gif", "2.gif",etc.
C'est bien le numéro de l'image qui est tiré au sort.
En action à l'adresse http://info.sio2.be/kpz/siteweb/
où je n'ai que 4 images représentant les chiffres de 1 à 4 (voir dans le répertoire http://info.sio2.be/kpz/siteweb/images )


Message envoyé avec : Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.6) Gecko/20061201 Firefox/2.0.0.6 (Ubuntu-feisty)
ymai
« Un enfant de cinq ans comprendrait cela ! Allez me chercher un enfant de cinq ans ! »
Groucho Marx.
Québec
Salamandre
Messages : 30
Inscription : 07 sept. 2007, 15:03

Message par Québec »

Yesssssssssss! C'est fait!!! Heureux comme un roy et fier comme un coq!!! J'suis pas certain d'avoir tout compris (encore une fois, l'esprit du html est intercédé à ma faveur...), mais au moins, ça fonctionne!

Mais ya encore un p'tit truc... C'est super d'avoir une image aléatoire sur sa page d'accueil, mais c'est qu'elle n'est pas tout à fait à la bonne place... genre...

J'ai donc le code suivant ():

<script type="text/javascript" language="javascript">
{
document.write('<img src="4.Photindex/'+ Math.round((Math.random()*3)+1)+ '.jpg" />');
}
</script>

les attributs comme alt, largeur, hauter, position absolue, etc. À quel endroit faut-il les inscrire? À l'intérieur du script (... jpg" ICI />');... ) ou à l'extérieur du script (donc, après ... } </script> )?

L'ordre d'apparition des attributs est-il important? Et, enfin, faut-il mettre « : », « = », ainsi qu'un « ; » pour les séparer (la façon de les écrire est certainement importante)?

Merci!
Ymai
Tyrannosaurus Rex
Messages : 4220
Inscription : 12 mars 2005, 11:36

Message par Ymai »

Bonjour
Les différents attributs se mettront exactement comme s'il s'agissait d'une image "classique". Donc, tout est à l'intérieur de <img src=... >
L'ordre n'a pas d'importance.

Code : Tout sélectionner

<img class="imagedroite"
 style="border: 0px solid ; width: 214px; height: 300px;"
 alt="texte alternattif" src="images/monimage.png">
Message envoyé avec : Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.6) Gecko/20061201 Firefox/2.0.0.6 (Ubuntu-feisty)
ymai
« Un enfant de cinq ans comprendrait cela ! Allez me chercher un enfant de cinq ans ! »
Groucho Marx.
Québec
Salamandre
Messages : 30
Inscription : 07 sept. 2007, 15:03

Message par Québec »

Rien à faire... dès que je donne un attribut, l'image disparaît! L'erreur est soit dans la façon de les écrire, soit dans les paramètres que je donne.

Et pourtant, avant de remplacer le code d'origine par la fonction random, j'ai copié les paramètres attribués à l'image (alt="ceci est une image" style="position: absolute; top: 172px; left: 443px; width: 252px; height: 168px/) pour ensuite les intégrer à la fonction. Ya vraiment un truc qui m'échappe. C'était pourtant bien parti!!!

Voici ma fonction random avec les paramètres entre <img src=... />'); tel que suggéré dans ton précédent message:

<script type="text/javascript" language="javascript">
{
document.write('<img src="photindex/'+ Math.round((Math.random()*3)+1)+ '.jpg"alt="ceci est une image"
style="position: absolute; top: 172px; left: 443px; width: 252px; height: 168px/>');
}
</script>

R.
Kazé
Varan
Messages : 1743
Inscription : 10 févr. 2005, 10:26

Message par Kazé »

Je déconseille vivement l'utilisation de « document.write() » en JavaScript, pout tout un tas de raisons. Sous KompoZer il me parait de toutes façons plus simple de procéder autrement :
  • crée une image quelque part sur ta page, par exemple celle qui porte le nom « 4.Photindex/1.jpg » ;
  • affecte un ID «random» à ton image :
    • double-clique l'image
    • clique sur « propriétés avancées »
    • mets «id» dans le champ «attribut» et «random» dans le champ «valeur»
    • valide
  • clic droit sur <body> dans la barre d'état > « propriétés avancées »
    • onglet «JavaScript»
    • attribut = onload, valeur = randomImage()
    • valide
  • en mode source, ajoute le code suivant avant la ligne </head> :

    Code : Tout sélectionner

    function randomImage() {
      var src = "4.Photindex/" + Math.round((Math.random()*3)+1) + ".jpg";
      document.getElementById("random").setAttribute("src", src);
    }
De cette façon, tu pourras positionner et styler ton image directement avec KompoZer.
Dans KompoZer, tu verras toujours l'image 1.jpg, mais dans le navigateur, dès que la page sera chargée, il remplacera l'image par une image aléatoire.
KompoZer lead dev
Ubuntu 10.04 Lucid Lynx — « L'erreur est humaine, mais vraiment foutre la merde nécessite le mot de passe root. »
Ymai
Tyrannosaurus Rex
Messages : 4220
Inscription : 12 mars 2005, 11:36

Message par Ymai »

Québec a écrit : <script type="text/javascript" language="javascript">
{
document.write('<img src="photindex/'+ Math.round((Math.random()*3)+1)+ '.jpg"alt="ceci est une image"
style="position: absolute; top: 172px; left: 443px; width: 252px; height: 168px/>');
}
</script>
Un peu de flottement dans la syntaxe, sur la fin:

Code : Tout sélectionner

<script type="text/javascript" language="javascript">
document.write('<img src="photindex/'+ Math.round((Math.random()*3)+1)+ '.jpg" alt="ceci est une image" style="position: absolute; top: 172px; left: 443px; width: 252px; height: 168px">');
</script>
Kaze a écrit :Je déconseille vivement l'utilisation de « document.write() » en JavaScript, pout tout un tas de raisons.
Ma curiosité me pousse à en demander un peu plus :?

Message envoyé avec : Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.6) Gecko/20061201 Firefox/2.0.0.6 (Ubuntu-feisty)
ymai
« Un enfant de cinq ans comprendrait cela ! Allez me chercher un enfant de cinq ans ! »
Groucho Marx.
Québec
Salamandre
Messages : 30
Inscription : 07 sept. 2007, 15:03

Message par Québec »

Comme disent les têtes carrées (les anglais par ici), « the devil is in the details...» (le démon est dans les détails). Ça marche comme sur des roulettes!

100 fois merci.

La méthode de Kaze a l'air intéressante. Outre le fait qu'il s'agit d'un chemin différent pour arriver au même résultat, quel serait l'avantage de son approche d'un point de vue «technique» (ie.: la lisibilité du code; son économie, sa «transparance» pour les différents navigateurs, etc.).

J'ai une page où je présente les quelques (petits) contrats de photo que j'ai eu l'occasion de faire. Pour chaque contrat, il y a une photo. Il y a donc plusieurs photos différentes sur cette page. La méthode de Kaze serait-elle plus simple que d'insérer pour chaque image la fonction «random» comme celle que j'utilise actuellement pour ma page d'accueil?

Et Ymai, encore merci. Je boirai une Trappiste à ta santé! (et non, une c'est pas assez! J'en boirai deux ou trois!!!).

R.
Québec
Salamandre
Messages : 30
Inscription : 07 sept. 2007, 15:03

Image aléatoire en php avec rotate

Message par Québec »

Une petite note: en fouillant sur le wouèbe pour des codes aléatoires, j'ai trouvé une autre façon de faire une image aléatoire à partir des sites suivants:

http://www.alistapart.com/articles/randomizer/

http://alienorbijoux.canalblog.com/arch ... 62463.html

Bon, personnellement, le php c'est pas pour demain... Le html est déjà assez difficile comme ça! Mais peut-être que cette méthode peut intéresser ceux d'entre vous qui êtes à l'aise avec php.


R.
Ymai
Tyrannosaurus Rex
Messages : 4220
Inscription : 12 mars 2005, 11:36

Message par Ymai »

Québec a écrit : Et Ymai, encore merci. Je boirai une Trappiste à ta santé! (et non, une c'est pas assez! J'en boirai deux ou trois!!!).
R.
Ravi d'avoir pu être utile en attendant que Kazé nous livre les conseils qu'il a en stock.
Rem 1:
J'en boirai deux ou trois
Vous avez de la descente, vous!!
Rem 2: "Une bière brassée avec savoir se déguste avec sagesse" :wink:
Rem 3: On trouve de la Trappiste au Québec :D

Message envoyé avec : Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.6) Gecko/20061201 Firefox/2.0.0.6 (Ubuntu-feisty)
ymai
« Un enfant de cinq ans comprendrait cela ! Allez me chercher un enfant de cinq ans ! »
Groucho Marx.
Kazé
Varan
Messages : 1743
Inscription : 10 févr. 2005, 10:26

Message par Kazé »

Ymai a écrit :
Kaze a écrit :Je déconseille vivement l'utilisation de « document.write() » en JavaScript, pout tout un tas de raisons.
Ma curiosité me pousse à en demander un peu plus :?
Québec a écrit :La méthode de Kaze a l'air intéressante. Outre le fait qu'il s'agit d'un chemin différent pour arriver au même résultat, quel serait l'avantage de son approche d'un point de vue «technique» (ie.: la lisibilité du code; son économie, sa «transparance» pour les différents navigateurs, etc.).
Il y a toujours plusieurs chemins pour arriver à un résultat. D'une manière générale, les développeurs pratiquent le « ni dieu ni maître », mais pour ce qui est du principe de séparation du code et de l'interface : pas touche, c'est sacré ! Et les hérétiques sont rapidement excommuniés par le chef.

Pour le cas où l'on veut modifier dynamiquement une partie de la page web, que ce soit en PHP ou en JavaScript, on a deux possibilités :
  • faire générer du code HTML par un script PHP ou JS, par exemple :

    Code : Tout sélectionner

    <script type="text/javascript" language="javascript">
    {
      document.write('<img src="photindex/'+ Math.round((Math.random()*3)+1)+ '.jpg" alt="image aléatoire" ');
    }
    </script> 

    Code : Tout sélectionner

    <?php
    echo('<img src="photindex/' . rand(1,3) . '.jpg" alt="image aléatoire" ');
    ?> 
  • utiliser du bon vieux HTML en laissant PHP ou JS modifier des attributs :

    Code : Tout sélectionner

    <img id="random" src="photindex/1.jpg"alt="image aléatoire"/>
    (en utilisant le script décrit dans mon précédent message) ou

    Code : Tout sélectionner

    <img src="<?php echo("photindex/" . rand(1,3) . ".jpg"); ?>" alt="image aléatoire" />
La première méthode c'est le coté obscur : plus rapide à priori, mais ça mélange l'interface (le code HTML) avec la logique (le code PHP ou JS). C'est une erreur qu'on regrette très vite quand le site s'étoffe. Ça ne permet pas de réutiliser le code dans d'autre pages sans copier/coller, les améliorations ou modifications de code doivent être répercutées manuellement partout, et on ne peut pas utiliser CaScadeS pour styler l'image.

La deuxième méthode est celle de tout padawan qui se respecte. L'effort initial de séparer clairement la présentation de la logique est rentabilisé dès que l'on veut apporter des modifications à la page : on peut déplacer et styler l'image aléatoire à la souris, directement sous KompoZer, sans avoir à passer par le code source. La structure HTML reste valide même si une erreur s'est glissée dans le script. Quand on doit dépanner une page, tout est plus simple.

Les webmestres en général prêtent peu d'importance à ces considérations de développeur, et sont nombreux à faire du code bien pourri, ce qui commercialement se défend : il est très difficile de reprendre un projet codé « coté obscur » par un concurrent, et peu importe le temps nécessaire pour faire une correction, puisque c'est le client qui paye.
Mais je constate de plus en plus qu'ils finissent par comprendre que ces bonnes pratiques (que les développeurs ont admises depuis 20 ans ou plus...) sont finalement nécessaires et rentables. Ceci dit tu fais bien comme tu veux, comme tu l'écris il y a toujours plusieurs façons d'arriver à un résultat, je ne fais là que proposer une méthode qui permet de profiter au mieux de KompoZer (à mon humble avis).
Les deux méthodes décrites ci-dessus aboutissent au même code HTML, le résultat sera donc rigoureusement équivalent pour le visiteur : c'est uniquement pour le webmestre que ça a un intérêt.

PS : acessoirement, la méthode que je propose a le mérite d'afficher une image même si le visiteur a désactivé JavaScript. ;-)

PPS : dans tous les cas, PHP est préférable pour modifier dynamiquement des bouts de code HTML (il est fait pour ça). En JavaScript on *peut* modifier du code HTML dynamiquement, mais dans ce cas je recommende plutôt d'utiliser des méthodes DOM (cf. document.getElementById()) voire de l'Ajax pour les plus chevronnés, plutôt qu'un document.write().
KompoZer lead dev
Ubuntu 10.04 Lucid Lynx — « L'erreur est humaine, mais vraiment foutre la merde nécessite le mot de passe root. »
Québec
Salamandre
Messages : 30
Inscription : 07 sept. 2007, 15:03

Message par Québec »

Kaxe,

j'ai tenté d'intégrer ta méthode sur les autres pages de mon site; j'ai gardé random avec doc.write en index parce ça marche! Mais effectivement, ta méthode a l'avantage d'éviter le java (parfois «débranché»).

J'ai suivi à la lettre tes indications (avec le code AVANT </head>) . Résultat: si j'ai une image qui apparaît (toujours la même), j'ai aussi la ligne de code «function randomImage... ... , src); } » qui s'affiche dans le haut de ma page...

Autrement dit, la fonction random n'est pas exécutée, mais... affichée! Super... Bon, il est à peut près certain que j'ai fait une «boulette»... encore!

Est-ce aussi possible qu'il y ait une «interférence» avec ma feuille css?

Mes pages sont décorées d'une petite vignette carrée en haut à gauche. Quand j'ai fait ma feuille css, j'ai pensé qu'il serait chouette d'avoir cette vignette en mode aléatoire. Alors j'ai attribué pour cette vignette une « img class » en me disant qu'éventuellement un jour peut-être je parviendrais à lui «plogguer» une fonction aléatoire.

Bref, ai-je fais une « erreur » en attribuant à mon image une classe au lieu par exemple d'un «div ... id» avec une règle (#nom) attribuée? D'où l'interférence avec la fonction aléatoire intégrant document.getElement?

Voici l'extrait de ma feuille css relatif à la classe img:
margin-top: 56px;
margin-left: 6%;
width: 110px;
height: 110px;
position: absolute;

Merci.

Pour Ymai: et bien, avec la mondialisation, on peut avoir à peu près n'importe quoi, n'importe où! Mais pour la numéro 8... j'ai ma petite grande soeur qui va souvent en Belgique pour son travail... Et comme je suis son grand petit frère préféré, j'ai droit à chaque voyage à une p'tite bouteille de Belgique! Yessssss! Et quant à la quantité de bière qu'on peut ingurgiter au Québec, bah, détail... dis-toi qu'au fond de nos sombres forêts immenses, avec les loups et les ours, sans compter l'hiver sans fin et les anglois... ben on fini par avoir la rigole à sec! Viens faire un tour, tu comprendras!!! Et puis, la femme de Louis Hébert, premier fermier de la Nouvelle-France, avait une cuve pour faire de la bière dès avant 1627... Et Dieu sait qu'à cette époque, l'hiver était encore plus long... Ça fait donc longtemps qu'on se pratique...

Comme dit la chanson: « Un p'tit verre de bière, ça f'rait mon affaire... »

R.
Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 13 invités