Tout repose sur la fonction javascript
window.open() qui a
3 arguments, tous trois des chaînes de caractères ou des
variables javascript contenant des chaînes de caractères, successivement :
TARGET pour charger d'autres pages dans
la fenêtre)
window.open()
dans les liens apporte
quelques surprises, on a intérêt à bâtir
une nouvelle fonction au moyen d'un script du type
<SCRIPT langage="Javascript">
function ouvre(fichier) {
ff=window.open(fichier,"popup",
"width=250,height=150,left=30,top=20") }
</SCRIPT>
Dans ce script, la fenêtre s'appelle «popup» et elle
s'ouvre avec les dimensions 250x150, à 30 pixels de la gauche de l'écran
(left) et à 20 pixels du haut de l'écran
(top). La variable ff remplie par la fonction est
« l'objet Window » correspondant à la nouvelle
fenêtre et on pourra s'en servir dans des scripts plus complexes.
On peut mettre d'autres attributs dans la chaine des paramètres ; on en verra quelques uns plus loin. Attention : tous ces attributs ne doivent être séparés que par des virgules (ne pas introduire d'espace!)
<A HREF="javascript:ouvre('fichier.html')">cliquez ici</A>
soit en appelant la fonction dans un onClick :
<A HREF=" "
onClick="ouvre('fichier.html');return false">cliquez ici</A>
Le return false a pour objectif d'empêcher le
navigateur de poursuivre l'exécution de ce qu'il trouve dans la balise
<A...>, et notamment d'aller sauter à
l'adresse donnée dans le HREF (vide, dans la
ligne ci-dessus).
<A HREF="fichier.html" TARGET="popup"
onClick="ouvre('fichier.html');return false">cliquez ici</A>
Le visiteur qui aura désactivé javascript
n'aura droit qu'à une fenêtre classique, mais il pourra au moins lire
la page référencée. Il serait souhaitable de faire
systématiquement cet effort dans l'écriture des liens.
<SCRIPT langage="Javascript">
function ouvrir(fichier,fenetre) {
ff=window.open(fichier,fenetre,"width=250,etc...") }
</SCRIPT>
et en réécrivant l'appel sous la forme :
<A HREF="fichier.html" TARGET="popup" onClick="ouvrir(this.href,this.target);return false">cliquez ici</A>
Ces bonnes résolutions étant dûment notées, il faut insister que la suite va concerner l'apparence de ces popups et qu'il sera indispensable d'avoir son javascript actif pour en juger.
ouvre() ouvre une fenêtre
| MacOS | PC-Win | |||
|
Menu Ascenseurs | NN4.5
simplifié aucun | IE5
complet Si nécessaire | IE5
aucun aucun | NN4.7
aucun aucun |
window.open().
On insèrera notamment
scrollbars=yes/no pour forcer ou supprimer les ascenseurs
resizable=yes/no pour permettre le redimensionnement ou non
menubar=yes/no pour mettre le menu ou le supprimer
status=yes/no pour mettre une barre d'état ou la supprimer
toolbar=yes/no pour mettre une barre d'outil ou la supprimer
location=yes/no pour mettre une barre d'adresse ou la supprimer
scrollbars et
menubar parce que notre expérience, résumée
dans le tableau précédent, nous a montré que les
différents navigateurs n'en font qu'à leur tête.
<SCRIPT>
function ouvre2(fichier) {
ff=window.open(fichier,"popup2",
"width=250,height=150,left=320,top=20,scrollbars=yes"
+",resizable=yes,menubar=yes,status=yes") }
</SCRIPT>
Pour voir la différence avec notre premier script, cliquez ici : vous allez ouvrir les deux popups en même temps, l'ancien à gauche et le nouveau à droite. Passez notamment sur la 2ème page ("longue") ; l'ascenseur vertical devrait apparaître dans tous les cas.
alwaysLowered, alwaysRaised, dependent, directories, hotkeys, innerHeight,
innerWidth, outerHeight, screenX, screenY, titlebar, z-lock (curieux :
outerWidth ne figure pas sur cette liste officielle),channelmode, fullscreen, titlebar.
Il y en a peut-être d'autres, mais ce n'est vraiment pas facile de
trouver son chemin chez Microsoft :-((fullscreen plus bas.
L'attribut titlebar, commun à IE et NN, permettrait de supprimer le titre de la
fenêtre, et donc de réduire au minimum le cadre de la fenêtre, mais son
emploi passe par un script sécurisé plutôt difficile à mettre en
oeuvre, et que le visiteur peut toujours refuser.
fullscreen a précisément été conçu pour cela
et il s'emploie comme suit:
<SCRIPT>
function ouvre_plein_ecran(fichier) {
ff=window.open(fichier,"pop","fullscreen=yes"}
</SCRIPT>
mais cela ne fonctionne que sur IE-Windows, pas sur IE-Mac, ni évidemment avec
NN, quelle que soit la plate-forme. Par ailleurs, il y a un certain nombre de
précautions de
bon sens à prendre quand on utilise un tel mode. Nous revenons plus
longuement sur cette question dans un
autre article, avec un script plus général.
ff.focus()
dans les scripts précédents, après l'appel
ff=window.open(...).
En règle générale, il faut éviter de multiplier les fenêtres popup pour
ne pas trop tirer sur les ressources de la machine du visiteur, mais on
court moins de risque avec ces fenêtres popup qu'avec les fenêtres ouvertes
avec TARGET="_blank". En effet, si on fait un 2ème appel à
notre fonction ouvre() sans avoir fermé le popup au
préalable, on va simplement charger le nouveau fichier dans la même
fenêtre, sans rien ouvrir de nouveau.
Le visiteur a toujours à sa disposition la case de fermeture de toute fenêtre, mais on peut aussi lui fournir un bouton plus accrocheur ou même rendre cette fermeture automatique mais cette dernière ne fonctionne hélas pas toujours très bien :-((
<SCRIPT>
function ouvre3(fichier,w,h) {
ff=window.open(fichier,"popup","width="+w
+",height="+h+",left=10,top=10,scrollbars=no") }
</SCRIPT>
Si on prévoit des noms différents (par exemple si on veut afficher deux
popups en même temps), on pourra ajouter le nom comme 4ème paramètre.
Les débutants seront déçus s'ils comptent sur une telle fonction pour
exposer élégamment une série d'images sans trop d'efforts.
La démarche la plus commune est de commencer par ouvrir une page
« catalogue » ne comportant que des
vignettes, chacune avec un lien vers un agrandissement. Si les liens se font avec un
TARGET="_blank", les images agrandies
se présentent très bêtement en haut à gauche d'un
grand espace vide, alors qu'un lien vers
une fenêtre popup ayant la taille de l'image devrait pouvoir
fournir un encadrement
naturellement adapté à l'image. Las! Une fois de plus, les
navigateurs ont des comportements contradictoires d'une marque à l'autre
et d'une machine à l'autre. On constate que la fenêtre ouverte
a bien des dimensions
intérieures égales aux valeurs spécifiées, mais l'image
est déplacée vers
le bas et la droite avec des valeurs dépendant du navigateur et du
système :
IE5-windows : 8px vers la droite, 8px vers le bas IE5-mac : aucun décalage NN4.7-windows : 10px et 15px NN4.7-mac : 8px et 8px iCab (mac) : 8px et 8px, etc...De tous nos essais, seul IE5-mac encadre parfaitement l'image, mais à condition de bien mettre
scrollbars=no dans le script, sinon il ajoute 16 pixels à
droite et en bas pour des ascenseurs fantômes...
Les marges qui apparaissent sont remplies avec la couleur de fond par défaut du visiteur, imprévisible... Bref, on ne peut pas avoir de solution satisfaisante avec une technique aussi simple; mais il est toutefois possible d'améliorer le script pour pallier ces difficultés.
Avec les scripts précédents, on prendra garde à refermer le popup avant de le rappeler avec des dimensions différentes (sinon, ces nouvelles dimensions ne sont pas prises en compte et le 2ème appel recharge la fenêtre initiale). Essayez avec deux images, l'une en 252x131 et l'autre en 188x257. Cela donnerait évidemment de l'intérêt aux techniques d'autofermeture des fenêtres si celles-ci étaient fiables, ce qui n'est malheureusement pas le cas... Nous allons maintenant voir une autre technique susceptible de recaler nos dimensions, hélas elle aussi avec de sérieuses difficultés.
On devrait pouvoir recadrer la fenêtre aux dimensions w x h en plaçant la ligne
window.resizeTo(w,h) dans le script. Comme cette
fonction n'existe que dans le javascript 1.2, son appel provoquera un
message d'erreur avec les navigateurs anciens (versions "3" et en dessous),
mais sans plus de conséquences dommageables.
function ouvre4(fichier,w,h) {
ff=window.open(fichier,"pop","left=10,top=10");
if(ff) { ff.focus() ; ff.resizeTo(w,h) }
}
Comme le resizeTo(w,h) se charge de remettre la fenêtre aux
bonnes dimensions, il est inutile de mettre les informations sur
width et height dans le window.open.
Essayez ce script, avec les deux mêmes images, d'abord en 252x131 puis en 188x257 (sans fermer le popup entre les deux clics). Ça devrait marcher sur PC-windows... mais hélas pas sur Mac, sauf pour NN6 ou ICab, encore ultra-minoritaires en ce début 2001, aussi vaut-il mieux ne pas utiliser cette méthode :-((
Dans le sens mèrefille, la fenêtre fille (le popup) est
considérée comme un cadre. Tout lien avec le nom du popup en
TARGET (c.à.d. en cadre cible) provoquera le
chargement de la nouvelle page dans le popup.
TARGET
désigne l'un de ces cadres comme cible, par exemple
<A HREF="page22.html" TARGET="principal">clic</a>ce fichier «page22.html» sera chargé dans le cadre «principal».
opener
des objets de type "Window".
Quand on est dans le popup,
window désigne la
fenêtre courante, (le popup lui-même),
window.opener désigne la fenêtre mère, et
window.opener.location désigne
l'URL chargée, ou à charger, dans cette fenêtre mère.
window initial,
le lien ci-dessous dans le popup
<a href="#" onClick="opener.location='page22.html'; return false">vers la page 22</a>ouvrira la «page 22» dans la fenêtre principale.
Cette propriété opener peut aussi servir à donner un nom à la fenêtre mère quand celle-ci n'est pas issue d'un frameset, afin d'employer ensuite la syntaxe HTML classique pour les liens.
Cliquez ici pour une démonstration de cette propriété opener.
Charles