L'attribut target et les standards W3C.
Fonction de l'attribut target
L'attribut target a été introduit en HTML 4. C'est un
attribut de l'élément a (hyperlien) permettant de désigner le
cadre dans lequel la ressource désignée par l'hyperlien doit s'ouvrir. Il est
possible de désigner le cadre cible par son nom, ou par l'un des quatre
termes réservés: _blank, _self,
_parent, _top.
Il semble que les cadres soient de moins en moins utilisés. Mais
l'attribut target reste prisé dans un cas spécifique,
l'ouverture d'un contenu dans une nouvelle fenêtre du navigateur :
<a href="http://un-site.com" target="_blank" >Le site</a>
Target avec la valeur réservée "_blank" a une
vie propre indépendamment des cadres. Très utilisé dans ce cas particulier,
cet attribut fait en même temps l'objet de critiques de la part de
spécialistes des standards web. De fait, sitôt introduit en HTML 4, les
cadres et l'attribut target sont supprimés de HTML 4.1 STRICT.
Faiblesses de l'attribut target
Son exclusion des versions STRICT des normes HTML 4.1 et suivantes laisse
supposer quelques faiblesses. Sur le plan technique (développement d'une page
web), l'attribut target contribue au mélange du code relatif à la
présentation de la page et du code qui en définit le contenu. Or, à
l'évidence, un développement qui sépare clairement présentation et contenu
constitue une bien meilleure architecture. Par ailleurs certains griefs
relevant de l'expérience utilisateur apparaissent souvent à l'encontre de cet
attribut :
- historique de navigation brisée.
- espace de travail encombré de fenêtres supplémentaires.
- confusion de la part de personnes percevant difficilement (ou pas du tout) le changement de fenêtre (cas de certains handicapes notamment).
- intrusion sur un domaine supposé relever du choix de l'internaute.
De l'autre coté les raisons ou circonstances justifiant l'ouverture d'un lien dans une nouvelle fenêtre ne manquent pas non plus :
- les études statistiques montrent qu'un lien qui remplace dans la même fenêtre le site web initial par le site web cible entraîne des déperditions de pages visitées pour le site web initial, et ce en dépit de l'existence de l'historique. Il est donc raisonnable pour les sites professionnels d'ouvrir une nouvelle fenêtre lorsqu'un lien renvoie sur un autre site (publicité typiquement).
- souhait de présenter une information supplémentaire légère en appui de
la page principale :
- aide contextuelle
- agrandissement d'une vignette
Il me semble que le webmaster attentif et respectueux de ses visiteurs, et désireux en même temps d'ouvrir certains liens dans nouvelle fenêtre pourra appliquer quelques règles de bon sens pour adoucir ou annuler les inconvénients cités :
- prévenir explicitement son lecteur de l'ouverture d'une nouvelle fenêtre
- mettre en place des conventions claires et régulières
Etre standard en utilisant target
Evolution des standards
A bien analyser les standards du W3C, il parait évident que ce dernier ne
renie pas la fonctionnalité "ouverture d'une nouvelle fenêtre". En revanche,
l'implémentation actuelle de cette caractéristique lui pose problème. La
fonctionnalité offerte par target est contraire à l'une des
bonnes pratiques essentielle : séparation de la présentation et du contenu.
Le W3C doit donc gérer cette "erreur" en attendant que les choses
rentrent dans l'ordre à terme. Il ne souhaite pas en interdire l'usage sans
bien sur l'encourager dans le cadre d'une architecture déficiente :
targetreste dans les versions TRANSITIONNAL de HTML 4.1 et XHTML 1.0, mais est retiré des versions STRICT des mêmes normes. Le modèle TRANSITIONNAL accueille différents éléments et attributs considérés comme obsolètes (car éloignés des bonnes pratiques) mais maintenus pour la rétro compatibilité.- XHTML 1.1 fait intervenir la modularisation (chaque module définit les
éléments et attributs propres à un domaine précis : structure,
formulaire, table...). Le W3C a pris la précaution de définir un module
spécifique pour
target, cependant ce module n'est pas inclu dans la DTD officielle. - XHTML 2.0 n'a pas encore le statut de recommandation (à la date de
rédaction de l'article en février 2005) mais semble maintenir la
situation en l'état concernant
target. - CSS 3 n'a pas encore le statut de recommandation, mais donne cependant
de précieuses indications. Le W3C introduit la possibilité d'ouvrir une
nouvelle fenêtre, et d'autres finesses particulièrement intéressantes, dans CSS. Il
sera possible de gérer l'ouverture de la cible d'un lien hors du contenu
et de la sémantique du document. CSS 3 reprend donc enfin ce qui avait
été oublié dans CSS 2, et dans "quelques années" l'attribut
targetne restera qu'un mauvais souvenir.
Souhaiter utiliser la fonctionnalité d'ouverture d'une nouvelle fenêtre n'est pas contrevenir à la vision qu'a le W3C des standards web. Mais le faire aujourd'hui ne peut se réaliser sans un compromis dans lequel chacun doit y mesurer avantages et inconvénients. En attendant la prééminence de CSS 3, l'alternative est la suivante :
- utiliser un javascript bien construit, c'est à dire permettant d'une part de découpler présentation et contenu, et d'autre part de rassembler les caractéristiques de présentation (y compris l'ouverture dans une autre fenêtre) d'une classe de liens en un même endroit. C'est parfait sur le plan de l'architecture mais lourd du fait de la longueur du code à écrire, et totalement tributaire des possibilités d'exécution du javascript sur le poste client. Voici un exemple du "target" en javascript.
- utiliser
target=_blank. Cela peut gâcher une volonté de bâtir une belle architecture de page web, mais l'option a le mérite de la simplicité et ne nécessite pas javascript.
Utiliser l'attribut target
La suite vous concerne si vous recherchez une bonne adhérence aux
standards sans pour autant banir target=_blank (acceptation
d'une légère entorse à la règle de séparation présentation-contenu).
Le premier réflexe consiste à utiliser le modèle TRANSITIONNAL. Cependant,
s'y résigner laissera toujours une insatisfaction à qui s'intéresse aux
standards. Le modèle TRANSITIONNAL n'est qu'un pont entre une technologie
ancienne et une technologie plus aboutie. Il n'est donc pas un objectif
souhaitable, ni une fin en soi. En outre de l'attribut target,
le modèle TRANSITIONNAL accepte un nombre impressionnant d'éléments
et attributs obsolètes que l'on souhaite certainement mettre à l'écart.
La deuxième option consiste (j'entends déjà hurler) à choisir un DOCTYPE
STRICT tout en utilisant l'attribut target. C'est pragmatique
mais pas tout à fait rigoureux. Gardons seulement à l'esprit que c'est une bonne
approximation rendue nécessaire pour contourner une omission du W3C. Ceci
étant, le coté désagréable ne se situe pas tant sur un plan technique que
psychologique, car après avoir fait ce choix, reste à faire face aux
constantes critiques des "rigides du standards" qui déclarerons : "En
utilisant target vous codez en dépit du bons sens, choisissez donc le
fourre-tout qui vous ressemble (TRANSITIONNAL)" ou encore "Vous essayez de
vous cachez derrière l'affichage d'un standard rigoureux alors que vous ne
l'êtes pas, cela ne trompe que vous".
Certes l'option n'est pas impeccable, mais je rétorquerais que le mieux
est l'ennemie du bien, et qu'un document contenant target en
DOCTYPE STRICT est tout de même infiniment plus proche du DOCTYPE STRICT
théorique que du DOCTYPE TRANSITIONNAL. Et finalement l'anomalie ne se
trouve-t-elle pas dans les standards ?
Je vois différentes raisons de vouloir afficher un modèle STRICT :
- par fierté et montrer que l'on se sent plus proche du modèle STRICT que TRANSITIONNAL.
- pour une raison pratique lorsque l'on souhaite vérifier la validité du document par rapport au DOCTYPE STRICT.
- par obligation technique car une chaîne de traitements automatisés vérifie rigoureusement la conformité du document à une DTD contraignante.
- pour des raisons commerciales lorsqu'un client le demande.
Si la deuxième option décrite au dessus ne vous séduit pas en dépit de son coté pratique, alors suivez la troisième voie.
Etre tout à fait standard sans le modèle TRANSITIONNAL
La solution préconisée par le W3C, lorsqu'on rejette le modèle
TRANSITIONNAL tout en souhaitant utiliser target se résume ainsi
: assembler la DTD du XHTML STRICT avec la DTD du module Target introduit
dans le cadre de la modularisation XHTML (XHTML 1.1). Cela ne change pas
grand chose à l'affaire sur le fond, mais tout de même, il devient possible
de valider rigoureusement le document par rapport une DTD précise, très
proche de la DTD XHTML STRICT. Voici la recette :
Créons simplement un fichier xhtml11-avec-target.dtd dont le contenu est le suivant :
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Import des data types de base -->
<!ENTITY % xhtml-datatypes.module "INCLUDE">
<![%xhtml-datatypes.module;[
<!ENTITY % xhtml-datatypes.mod
PUBLIC "-//W3C//ENTITIES XHTML Datatypes 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/
xhtml-datatypes-1.mod">
%xhtml-datatypes.mod;]]>
<!-- Import des entités et des namespaces -->
<!ENTITY % xhtml-qname.module "INCLUDE">
<![%xhtml-qname.module;[
<!ENTITY % xhtml-qname.mod
PUBLIC "-//W3C//ENTITIES XHTML Qualified Names 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/
xhtml-qname-1.mod">
%xhtml-qname.mod;]]>
<!-- DTD XHTML 1.1 -->
<!ENTITY % xhtml11.dtd
PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
%xhtml11.dtd;
<!-- Module Target -->
<!ENTITY % xhtml-target.module "INCLUDE">
<![%xhtml-target.module;[
<!ENTITY % xhtml-target.mod
PUBLIC "-//W3C//ELEMENTS XHTML Target Module//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/
xhtml-target-1.mod">
%xhtml-target.mod;]]>
Installons cette nouvelle DTD sur un serveur web par exemple dans un sous
répertoire /DTD. Supposons que le domaine du site web en question soit
www.mon-site.com, chaque page web faisant appel au DOCTYPE qui suit pourra
alors utiliser target dans la plus grande conformité :
<!DOCTYPE html PUBLIC "-//mon-site//DTD XHTML11-avec Target//EN"
"http://www.mon-site.com/DTD/xhtml11-avec-target.dtd">
Nous voici maintenant équipé pour la conformité totale et faire taire les
critiques. N'oublions pas cependant que cet artifice ne rend pas
target plus propre dans votre page web. Maintenant profitons d'avoir
éliminé tout vice de validation pour aller un peu plus loin encore et amorcer
un début de séparation présentation-contenu.
Introduire une séparation entre contenu et présentation avec l'attribut target
Target n'est donc pas destiné à définir une catégorie de
liens, et c'est là son travers il n'a pas de valeur sémantique dans l'absolu.
Cependant, dans le cas particulier ou l'on dispose d'une catégorie de liens
se superposant à l'ensemble des liens ouvrant dans une nouvelle fenêtre (par
opposition aux liens s'ouvrant dans la même fenêtre), l'utilisation de
l'attribut class n'est pas nécessaire pour en contrôler les styles
associés.
Les styles que l'on souhaite voir appliqués à cette catégorie peuvent être
définis en CSS sur un sélecteur impliquant l'attribut target.
Nous obtenons ainsi un premier niveau de séparation entre contenu et
présentation. Voici un exemple ou les liens s'ouvrant dans une nouvelle
fenêtre se distinguent des autres par la couleur et un soulignement :
<style type="text/css">
a {
color: red;
text-decoration:none
}
a[target=_blank] {
color: blue;
text-decoration:underline
}
</style>

