<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://openweb.eu.org/dtd/docbkx42/docbookx.dtd">
<article lang="fr" role="article" id="popup">
  <articleinfo>
    <title>Créer des pop-up intelligentes</title>
    <pubdate>2003-05-12</pubdate>
    <date>2003-05-12</date>
    <author>
      <firstname>Fabrice</firstname>
      <surname>Bonny</surname>
      <email>fabrice.bonny@openweb.eu.org</email>
    </author>
    <legalnotice>
      <para>Cet article est sous licence <ulink url="http://creativecommons.org/licenses/by-sa/1.0/legalcode">Creative Commons Attribution-ShareAlike</ulink>.</para>
    </legalnotice>
    <abstract><para>Comment ouvrir une nouvelle fenêtre sans se priver des internautes qui ne disposent pas de JavaScript ou l'ont désactivé&#160;?</para></abstract>
    <subjectset>
      <subject role="profil">
        <subjectterm>debutant</subjectterm>
        <subjectterm>expert</subjectterm>
      </subject>
      <subject role="theme">
        <subjectterm>accessibilite</subjectterm>
        <subjectterm>pages_dynamiques</subjectterm>
      </subject>
    </subjectset>
  </articleinfo>
  <section>
    <title>Les pop-up, un mal nécessaire&#160;?</title>
    <para>Tout d'abord, faisons un point sur les pop-up, ces fenêtres qui s'ouvrent le plus souvent contre notre volonté. Ce genre de pratique est à bannir dans le cas où l'on ouvre une fenêtre de taille normale, par exemple pour un lien vers un autre site. En effet, on <emphasis role="strong">casse la navigation</emphasis> de l'internaute qui ne peut plus utiliser le bouton de retour et on <emphasis role="strong">impose ses choix</emphasis>. C'est une excellente façon de faire fuir le visiteur&#160;!</para>
    <para>Mais il existe des cas où une pop-up rend de nombreux services&#160;: afficher une légende, une aide, une photo, etc. Seulement pour ouvrir cette fenêtre, il faut passer par un <emphasis role="strong">langage de script qui n'est pas forcément supporté par le navigateur</emphasis> de l'internaute, donc se <emphasis role="strong">priver de visiteurs</emphasis>.</para>
  </section>
  <section>
    <title>Autant les faire proprement</title>
    <para>Nous allons voir comment faire en sorte de n'oublier personne tout en conservant les pop-up dans notre arsenal. Il suffit tout simplement de n'ouvrir la fenêtre que si JavaScript est activé. Comment, me direz-vous&#160;? Un exemple va nous aider.</para>
    <programlisting>
&lt;a href="<replaceable>page.htm</replaceable>" onclick="window.open('<replaceable>page.htm</replaceable>');"&gt; 
    </programlisting>
    <para>Explications&#160;: le lien classique pointe vers la page de destination via <token>href</token> tandis que le <token>onclick</token> ne se déclenche que si la navigateur comprend JavaScript.</para>
    <tip>
      <para>Vous pouvez vous épargner de renseigner deux fois la destination en profitant d'un objet très utile en JavaScript&#160;: <token>this</token>. Cet objet fait référence à l'objet en cours, c'est-à-dire le lien dans notre cas. On peut donc appeler la destination comme ceci&#160;:</para>
      <programlisting>
&lt;a href="<replaceable>page.htm</replaceable>" onclick="window.open(this.href);"&gt; 
      </programlisting>
    </tip>
  </section>
  <section>
    <title>Ça ne marche pas&#160;!</title>
    <para>Si vous avez tenté de lancer cet exemple, vous avez sûrement constaté un problème. La nouvelle fenêtre s'ouvre bien mais l'ancienne est aussi dirigée vers la nouvelle page. Que s'est-il passé&#160;? L'événement <token>onclick</token> se déclenche au clic de la souris et effectue l'action entre les guillemets mais l'événement continue sa route&#160;: on dit qu'il se propage. Il va donc poursuivre son action et déclencher le lien hypertexte indiqué par <token>href</token>. Pour éviter cela, il suffit d'arrêter la propagation en retournant <token>false</token>.</para>
    <programlisting>
&lt;a href="<replaceable>page.htm</replaceable>" onclick="window.open(this.href); return false;"&gt; 
    </programlisting>
   </section>
   <section>
    <title>Les options possibles</title>
    <para>Voyons maintenant les options possibles pour la pop-up. La syntaxe est&#160;:</para>
    <programlisting>
window.open('<acronym>URL</acronym>', 'nom', 'options');
    </programlisting>
    <itemizedlist>
      <listitem><para>l'<acronym>URL</acronym>&#160;: il s'agit de l'adresse de la page&#160;;</para></listitem>
      <listitem>
        <para>le nom&#160;: vous pouvez donner un nom à la fenêtre, par exemple pour éviter les fenêtres multiples. Si vous donnez le nom <token>photo</token> à votre fenêtre, un nouveau clic sur un lien remplace une éventuelle pop-up déjà ouverte, <emphasis role="strong">évitant de noyer l'internaute</emphasis>&#160;;</para>
      </listitem>
      <listitem>
        <para>les options&#160;:</para>
        <itemizedlist>
          <listitem><para><token>height</token>&#160;: la hauteur de la fenêtre (exprimée en pixels)&#160;;</para></listitem>
          <listitem><para><token>width</token>&#160;: la largeur de la fenêtre (exprimée en pixels)&#160;;</para></listitem>
          <listitem>
            <para><token>top</token>&#160;: la position verticale de la fenêtre par rapport au bord supérieur de l'écran (exprimée en pixels)&#160;;</para>
          </listitem>
          <listitem>
            <para><token>left</token>&#160;: la position horizontale de la fenêtre par rapport au bord gauche de l'écran (exprimée en pixels)&#160;;</para>
          </listitem>
          <listitem>
            <para><token>toolbar</token>&#160;: la présence de la barre d'outils (à l'aide d'un booléen&#160;: <token>yes</token> ou <token>no</token>)&#160;;</para>
          </listitem>
          <listitem>
            <para><token>location</token>&#160;: la présence de la barre d'adresse (à l'aide d'un booléen&#160;: <token>yes</token> ou <token>no</token>)&#160;;</para>
          </listitem>
          <listitem>
            <para><token>menubar</token>&#160;: la présence de la barre de menu (à l'aide d'un booléen&#160;: <token>yes</token> ou <token>no</token>)&#160;;</para>
          </listitem>
          <listitem>
            <para><token>resizable</token>&#160;: la possibilité de redimensionner la fenêtre (à l'aide d'un booléen&#160;: <token>yes</token> ou <token>no</token>)&#160;;</para>
          </listitem>
          <listitem>
            <para><token>scrollbars</token>&#160;: la présence des scrollbars ou ascenseurs (à l'aide d'un booléen&#160;: <token>yes</token> ou <token>no</token>)&#160;;</para>
          </listitem>
          <listitem>
            <para><token>status</token>&#160;: la présence de la barre de statut (à l'aide d'un booléen&#160;: <token>yes</token> ou <token>no</token>).</para>
          </listitem>
        </itemizedlist>
      </listitem>
    </itemizedlist>
    <para>Le mieux étant bien sûr de laisser le maximum de liberté à l'internaute, par exemple&#160;:      <programlisting>window.open('/img/logo.png', 'photo', 'height=100, width=200, top=100, left=100, toolbar=no, menubar=yes, location=no, resizable=yes, scrollbars=no, status=no');</programlisting> ouvre une pop-up présentant notre logo. Cette fenêtre est dimensionnée, positionnée et elle conserve la barre de menu permettant d'imprimer l'image, tous les internautes ne sachant pas utiliser le clic droit. Elle peut aussi être redimensionnée, donc les «&#160;ascenseurs&#160;» ont été supprimés, l'image étant réduite.</para>
    <para>Vous pouvez <ulink url="annexes/exemple.htm">tester</ulink> cet exemple.</para>
    <caution><para>Une erreur courante consiste à ouvrir une fenêtre non redimensionnable et sans barres de défilement. Si la police est réglée différemment, par exemple, il se peut qu'une partie de la page ne soit pas visible. Vous pouvez <ulink url="annexes/exemple.htm">tester</ulink> cet exemple.</para></caution>
  </section>
  <section>
    <title>Conclusion</title>
    <para>Nous avons vu qu'<emphasis role="strong">accessibilité et ouverture ne signifie pas appauvrissement</emphasis>. Il est parfaitement possible d'ouvrir une pop-up tout en proposant des alternatives. Il suffit pour cela de respecter quelques règles simples pour permettre à chacun d'accéder à l'information selon ses possibilités et ses choix.</para>
  </section>
</article>
