Accessibilité, laissez le visiteur choisir comment il va ouvrir un lien
Difficile de trouver un titre parlant pour l'astuce que je veux vous proposer aujourd'hui !
Tout d'abord, pour appliquer cette astuce il vous faudra installer la librairie jQuery sur votre site (si ce n'est pas déjà fait). Mais même si vous ne comptez pas l'utilisez, il peut être intéressant que vous lisiez au moins le 1er paragraphe 😉
Accessibilité des liens ?
Quand on parle d'accessibilité, on parle surtout des "bonnes pratiques" à mettre en œuvre lors de la création de tout site. Il y en a des centaines, certaines plus pertinentes que d'autres, mais ici nous allons nous attarder sur l'accessibilité des liens se trouvant dans vos pages.
Tout sites internet contient des liens, c'est l'essence même du web. Mais de quel manière doivent réagir ces liens ? Un lien externe ou un lien vers une image doit-il se comporter comme un lien interne ?
Et bien en fait, il n'y à qu'une seule règle importante pour les liens, ils ne doivent jamais s'ouvrir dans une nouvelle page (ou onglet) sans l'autorisation du visiteur ! Ce n'est d'ailleurs pas pour rien que l'attribut "_blank
" n'est plus conforme aux nouvelles normes du W3C. Edit: finalement il semblerait que se soit plus dans un soucis de présentation du code que l'attribut _blank
fut retiré ... (merci MagicYoyo)
L'explication est simple, les règles d'accessibilités disent que l'utilisateur doit pouvoir garder le contrôle des liens, et de ce fait, si vous forcer l'ouverture dans une nouvelle fenêtre, l'utilisateur n'as plus de choix possible. Alors qu'en laissant le lien s'ouvrir naturellement, l'utilisateur peut décider de l'ouvrir dans une nouvelle fenêtre, ou pas (via le menu contextuel, le clic sur la molette ou encore un raccourci clavier) !
Pas cool ça ! Car votre site pointe souvent vers divers liens, dont une bonne partie sur des sites extérieurs .. et manque de chance, la plupart de vos visiteurs n'utilisent jamais le menu contextuel (peut-être ignorent ils cette fonction), du coup vous prenez le risque qu'ils ne fassent pas marche arrière !
Quelle est la solution ?
Attention, je ne prétend pas que c'est la meilleure solution, mais ça reste un bon compromis.
On va simplement laisser le choix aux visiteurs en ajoutant un lien alternatif après chaque lien. C'est ce qui est en pratique sur ce site, regardez avec cet exemple de lien ...
Vous voyez ? Une petite icône se trouve derrière le lien, cette icône pointe sur la même adresse que le lien qui la précède, sauf qu'il s'ouvrira dans une nouvelle fenêtre !
Bien évidement il serait trop fastidieux de dupliquer tous vos liens manuellement, et c'est là qu'intervient jQuery
Mise en place de la solution
Comme d'habitude, on commence par inclure la librairie jQuery dans la page (si ce n'est pas déjà fait) entre les balises HTML <head>
et </head>
Et ensuite nous allons placer la fonction qui permet de rajouter le lien alternatif automatiquement.
Les portions de code suivantes sont à ajouter soit entre des balises <script type="text/javascript"> //le code ici </script>
, soit dans un fichier .js
Par contre il doit impérativement ce trouver après le plugin.
Cas 1: On applique l'effet à tous les liens
$("a").each(function(i){$(this).after(" <a href=\""+$(this).attr("href")+"\" onclick=\"window.open(this.href); return false;\" style=\"border: none;\"><img src=\"external.gif\" alt=\"\" title=\"Ouvrir ce lien dans une nouvelle fenetre\" /></a>");});
});
Et ... c'est tout ! Mais ce n'est pas vraiment pertinent, car là absolument tous les liens sont ciblés, et il peut être judicieux de placer des restrictions.
Cas 2: On applique l'effet à tous les liens, sauf aux liens "image"
$("a").each(function(i){$(this).not(":has(img)").after(" <a href=\""+$(this).attr("href")+"\" onclick=\"window.open(this.href); return false;\" style=\"border: none;\"><img src=\"external.gif\" alt=\"\" title=\"Ouvrir ce lien dans une nouvelle fenetre\" /></a>");});
});
Oui, trouver la petite icône à coté d'une image peut casser votre mise en page par exemple, d'où cette exception.
Donc on rajoute juste .not(":has(img)")
après $(this)
Cas 3: On applique l'effet à tous les liens, sauf aux liens "image" et aux liens internes
$("a[@href^=\"http\"]").each(function(i){$(this).not("[@href*=\""+document.domain+"\"]").not(":has(img)").after(" <a href=\""+$(this).attr("href")+"\" onclick=\"window.open(this.href); return false;\" style=\"border: none;\"><img src=\"external.gif\" alt=\"\" title=\"Ouvrir ce lien dans une nouvelle fenetre\" /></a>");});
});
Personnellement c'est le choix que j'ai fait, car si le visiteur clique sur un lien interne, il reste sur le site, donc pas la peine d'ouvrir une autre fenêtre. Et celà à le double avantage que maintenant le visiteur a un repère visuel sur les liens pointant à l'extérieur !
Donc on rajoute juste .not("[@href*='"+document.domain+"']")
après $(this)
ET a[@href^='http']
au lieu de a
Cette restriction dit que "On applique l'effet que si l'adresse commence par http
et que si elle ne contient pas le nom de domaine du site"
Voilà, libre à vous de restreindre plus ou moins l'effet. N'oubliez pas de bien préciser l'url de image !
-----
Pingback: Accessibilité, laissez le visiteur choisir comment il va ouvrir un lien « FireFox()