Au départ, il s'agit simplement de d'obtenir qu'une image
portant un lien change au passage de la souris. On va ensuite compliquer et
généraliser le concept :
document.images[ ]
numéroté à partir de 0 dans
l'ordre d'apparition des images dans la page.
On pourrait donc repérer les images par leur numéro,
mais il est beaucoup
plus commode de leur attribuer un nom
au moyen d'un attribut NAME
dans la balise qui provoque l'affichage de l'image :
<IMG SRC="image.jpg" NAME="bouton" WIDTH=... >Ce nom est tout à fait arbitraire (enfin, presque... n'exagérez pas trop). Son intérêt est qu'il peut servir d'index symbolique dans le tableau des images, c'est-à-dire que
document.images['bouton']
sera précisément l'objet Image associé à cette image.
Notez les quotes de part et d'autre du nom, destinées à rappeler à
Javascript que bouton n'est qu'une chaine de
caractères et non pas une variable.
.src
à son nom (on dit qu'on accède à sa
propriété
«src»).
L'instruction
document.image['bouton'].src='image_2.jpg'va tout simplement provoquer le chargement d'un autre fichier image dans ce contenu et donc substituer une nouvelle image à l'ancienne.
onMouseOver
et onMouseOut. Le code pourrait avoir
la structure suivante:
<A HREF="fichier à charger"
onMouseOver="change_0('bouton','nouvelle image.jpg');"
onMouseOut="change_0('bouton','ancienne image.jpg');"><IMG
NAME="bouton" SRC="ancienne image.jpg" etc...></A>
où la fonction Javascript change_0()
serait ainsi définie :
<script language="Javascript">
function change_0(nom,fichier) {
if (document.images) document.images[nom].src=fichier
}
</script>
if(document.images) vérifie
simplement que le tableau des images existe. Il
n'est destiné qu'à éviter les
messages d'erreur pour les vieux navigateurs qui ne comprendraient pas
ce code (IE3, NN2 et antérieurs); onMouseOver déclenchedocument.image['bouton'].src='nouvelle image.jpg'
<script language="JavaScript">
var bouton_0 = new Image(); bouton_0.src = "pic_repos.jpg"
var bouton_1 = new Image(); bouton_1.src = "pic_actif.jpg"
</script>
à placer dans le bloc <HEAD>
de la page. Ce script crée 2 nouveaux
objets Images avec les noms bouton_0
et bouton_1 (on aurait pu choisir
d'autres noms) et il charge les images dans leurs
« contenus » respectifs.
Les images correspondantes ne sont pas visibles parce que ces
contenus ne sont pas dans la mémoire vidéo.
Pour changer l'image affichée, il suffira d'échanger le contenu de son
objet Image avec celui d'un des deux objets qui viennet d'être
définis. Par exemple, l'intruction
document.images('bouton').src=bouton_1.src
ferait apparaître l'image "pic_actif.jpg".
Le rollover sera donc créé par les lignes suivantes
<A HREF="fichier à charger"
onMouseOver="change('bouton', bouton_1)"
onMouseOut = "change('bouton', bouton_0)"><IMG
NAME="bouton" SRC="pic_repos.jpg" etc...></A>
qui font intervenir une nouvelle fonction javascript
change() légèrement différente
de la fonction précédente :
<script language="Javascript">
function change(nom,obj_im) {
if (document.images) document.images[nom].src=obj_im.src
}
</script>
nom
est une chaîne de caractères et il faut donc mettre des quotes au moment
de l'appel de la fonction (d'où le
« 'bouton' »
dans cet appel), tandis que obj_im
est une variable de Javascript de type Image, dont
le script va invoquer la propriété «src»
(donc, pas de quotes lors de l'appel).
Et ca marche ! Passez la souris sur la figure à gauche pour voir... Si
vous cliquez, le popup vous donnera le code d'une page complète pour ce
rollover en fait rien d'autre qu'une mise au clair de ce qui
précède.onMouseOver
et onMouseOut dans les liens de l'image, c'est-à-dire dans
les lignes AREA SHAPE du code :
<AREA SHAPE="rect" COORDS="..." ALT="..."
onMouseOver="....." onMouseOut="....">
On peut appliquer ce mécanisme pour donner des explications
sur le rôle d'un bouton, comme une sorte d'alternative aux bulles
d'aide.
dep_0 et dep_1 (les
noms sont bien sûr arbitraires)
<IMG SRC="image_deport.gif" NAME="expli" WIDTH=...>
change() sur l'objet-image
'expli' :
onMouseOver =
"change('bouton', bouton_1); change('expli', dep_1)"
onMouseOut =
"change('bouton', bouton_0); change('expli', dep_0)"
On peut supprimer le premier appel à change()
si on ne veut pas d'effet rollover sur le bouton lui-même.
Rappelons que vous aurez le code complet en allant cliquer sur le bouton
ci-dessus.
Si vous avez un Explorer 4 (ou plus) ou NN6, le bouton de gauche, qui ne porte
aucun lien, devrait se comporter comme un rollover simple. En effet, si
les événements de survol par la souris étaient détectés au
passage sur un objet-lien dans tout ce qui précède,
Explorer peut aussi les détecter au
passage sur un objet-image. Il suffit tout simplement de faire
rentrer les instructions précédentes onMouseOver=...
et onMouseOut=... à
l'intérieur de la balise <IMG> :
<IMG NAME="bouton" SRC="pic_repos.jpg" WIDTH=...
onMouseOver="change('bout3', bouton_1)"
onMouseOut = "change('bout3' ,bouton_0)" >
Cela ne fonctionne pas sur les versions antérieures
de NN ou IE.
<STYLE>
<!--
a:hover{color:red; font-weight:bold;
font-size:20px; text-decoration:none;}
-->
</STYLE>
Si vous voulez des liens avec des comportements différents
au sein d'une même
page, il suffira de définir plusieurs
classes de liens.
On peut encore compliquer notre lien-rollover simple en lui ajoutant
une nouvelle forme quand on a cliqué sur l'image. Il suffit de détecter
l'événement onClick et
de changer alors l'image :
<A HREF="fichier à charger"
onMouseOver="change('bouton' ,bouton_1)"
onMouseOut = "change('bouton', bouton_0)"
onClick="change('bouton', bouton_2)"><IMG
NAME="bouton" SRC="pic_repos.jpg" etc...></A>
l'objet-image bouton_2 et son contenu
ayant été préalablement définis lors du préchargement.
onMouseOut
est détecté dès que la souris quitte le bouton
et que le code précédent restaure alors l'image de base du bouton. On
peut éviter cet effet en substituant l'image active à l'image de base
lors du click, via un
onClick =
"change('bouton', bouton_2); bouton_0.src=bouton_2.src"
mais on ne fait que déplacer le problème le bouton resterait
ainsi figé dans l'état activé, alors qu'il faudrait le remettre dans son
état de base quand on aurait cliqué sur un autre bouton ou
bien dans un 4ème état, de
lien « visité ». Tout cela peut s'arranger
avec des scripts à peine plus complexes.
top. On trouve ensuite les objets Window
correspondant aux différents cadres, qui forment le tableau
top.frames[ ], puis enfin les
objets Document correspondant aux pages affichées dans les
différents cadres. La dénomination complète du
contenu de l'objet associé à l'image nommée
«cible» dans le cadre
«cadre_2» serait
top.frames['cadre_2'].document.images['cible'].srcTant qu'on ne travaille qu'à l'intérieur de la fenêtre courante, on peut omettre la partie gauche de cette dénomaination, qui rappelle simplement dans quelle fenêtre on se trouve. Mais il sera évidemment nécessaire d'être plus précis quand on voudra agir depuis un cadre sur un autre.
obj_im dans le cadre
«cadre_2»,
on accèdera à son contenu par l'expression
top.frames['cadre_2'].document.obj_im.srcNotez la différence avec la structure de l'expression précédente :
obj_im apparaît comme une propriété
(au sens du javascript) directe de l'objet document, au
même titre que le tableau images[] des
diférentes images affichées.
droite» et y remplacer le contenu
d'une image nommée «cible»
(c.à.d., via un NAME="cible").
Si on veut directement charger un fichier, le gestionnaire
onMouseOver devra exécuter
top.frames['droite'].document.images['cible'].src='image_no2.jpg'ou bien, si on a déjà préchargé ce fichier dans une variable
img2
de type Image dans la page affichée dans le cadre
«droite» :
top.frames['droite'].document.images['cible'].src =
top.frames['droite'].img2.src
Cliquez ici
pour voir une démonstration.
<IMG...> , mais... certaines
versions des navigateurs ont mangé la consigne et on peut avoir des
résultats imprévus.
NAME. Ça ne fonctionnerait pas du tout comme
vous l'espérez.
NAME
par ID. Ça fonctionne d'ores et déjà avec
IE4+, mais toujours pas avec NN. On en reparlera donc plus tard.
Evidemment, ce recours aux ID interdirait le fonctionnement actuel avec
NN3.
true ou false.
Cela implique d'ajouter un
return true ou return false
à la fin de leurs instructions Javascript.
onMouseOver= "if(document.images) bouton.src=actif.src ; return true"fait disparaître le lien dans la barre d'état. Apparemment, ces petits scripts sont dans le cas où ces valeurs de retour ne sont pas nécessaires.
return false est
indispensable, quand on se sert d'un onClick
sur un lien juste pour obtenir un effet de rollover sur un lien (ou tout
autre chose) sans qu'on
veuille exécuter le lien :
<a href="#" onClick="change... ; return false">regardez...</a>Sans ce
return false, le lien
href="#" serait exécuté et on se retrouverait
tout en haut de la page; sa présence fait que seul le
onClick est exécuté.
NAME="bouton", pour la plupart
des navigateurs actuels, tout se passe comme si on pouvait remplacer une
instruction comme
document.images['bouton'].src = obj_im.srctout simplement par
bouton.src=obj_im.src.
Cela permet d'alléger sensiblement
les scripts, mais cela ne figure pas dans les spécifications
officielles du Javascript. Tous les grands navigateurs du moment
comprennent cette syntaxe abrégée, mais il n'est pas sûr que cela se
maintienne dans l'avenir. En fait, nous connaissons d'ores et déjà un
navigateur alternatif (iCab, pour MacOS) pour lequel ça ne marche pas.
Charles Patrice Gérald JMPlus (TOM)