{"id":1679,"date":"2011-12-09T09:05:06","date_gmt":"2011-12-09T08:05:06","guid":{"rendered":"https:\/\/www.creativejuiz.fr\/blog\/?p=1679"},"modified":"2015-01-18T16:20:03","modified_gmt":"2015-01-18T15:20:03","slug":"travailler-vos-liens-ancres-avec-jquery-css","status":"publish","type":"post","link":"https:\/\/www.creativejuiz.fr\/blog\/tutoriels\/travailler-vos-liens-ancres-avec-jquery-css","title":{"rendered":"Travailler vos liens et ancres avec jQuery et\/ou CSS"},"content":{"rendered":"<p>J&rsquo;ai recherch\u00e9 des possibilit\u00e9s en PHP pour retravailler les liens fournis par WordPress il n&rsquo;y a pas longtemps ; ce qui m&rsquo;a amen\u00e9 \u00e0 cette id\u00e9e d&rsquo;article.<br \/>\nBeaucoup de possibilit\u00e9s de styles sont disponibles gr\u00e2ce \u00e0 CSS, mais il est parfois n\u00e9cessaire de transformer le comportement d&rsquo;un lien avec JavaScript.<!--more--><\/p>\n<p>Regardons ensemble ce qu&rsquo;il est possible de faire du c\u00f4t\u00e9 de jQuery dans un premier temps, puis nous verrons les possibilit\u00e9s offertes par CSS.<\/p>\n<p>Je tiens \u00e0 rappeler que JavaScript doit autant que possible \u00eatre <strong>une surcouche \u00e0 un contenu HTML<\/strong> consultable et fonctionnel avec JS d\u00e9sactiv\u00e9.<br \/>\nDe m\u00eame, les fonctions lanc\u00e9es par l&rsquo;interception d&rsquo;un \u00e9v\u00e8nement sur un lien ne doivent par <strong>surprendre vos visiteurs<\/strong>, n&rsquo;oubliez donc pas de les pr\u00e9venir de choses qui vont se produire.<\/p>\n<p>Semblant de bonne pratique mise \u00e0 part, rentrons dans le vif du sujet.<\/p>\n<h2>\u00c9tendre jQuery pour la gestion de vos liens<\/h2>\n<p><img decoding=\"async\" src=\"https:\/\/www.creativejuiz.fr\/blog\/wp-content\/uploads\/2011\/09\/puzzle.png\" alt=\"\" title=\"\" width=\"105\" height=\"104\" class=\"noborder alignleft size-full wp-image-1471\" \/>Imaginons par exemple que nous ayons besoin dans un projet de manipuler les liens en fonction de leurs caract\u00e9ristiques.<br \/>\nLes principales fonctions des liens se retrouvent directement dans la valeur de leur attribut <code>href<\/code>, c&rsquo;est donc l\u00e0-dedans que nous allons piocher.<\/p>\n<p>En cr\u00e9ant des extensions de s\u00e9lecteur jQuery, nous allons pouvoir simplifier la pr\u00e9sentation et donc la lisibilit\u00e9 de nos d\u00e9veloppements.<\/p>\n<p>Pour cr\u00e9er une extensions de s\u00e9lecteur jQuery, il nous faut une mani\u00e8re de discriminer un objet, et le retourner \u00e0 jQuery.<br \/>\nPour cela rien de plus ais\u00e9, la biblioth\u00e8que le pr\u00e9voit assez simplement gr\u00e2ce \u00e0 l&rsquo;expression <code>jQuery.expr[':']<\/code>.<\/p>\n<p class=\"message important\">Les codes qui suivent doivent \u00eatre utilis\u00e9s apr\u00e8s le chargement de la biblioth\u00e8que jQuery.<\/p>\n<p><strong>Exemple de cr\u00e9ation d&rsquo;un s\u00e9lecteur <code>:external<\/code> :<\/strong><\/p>\n<pre class=\"code\"><code class=\"js\">\/\/ Cr\u00e9ation du s\u00e9lecteur :external\r\n$.expr[':'].external = function(obj){\r\n\tif(!obj.href) {return false;}\r\n\treturn obj.hostname != location.hostname;\r\n};\r\n$('a:external').addClass('external');<\/code><\/pre>\n<p><strong>Exemple de cr\u00e9ation d&rsquo;un s\u00e9lecteur <code>:tel<\/code> :<\/strong><\/p>\n<pre class=\"code\"><code class=\"js\">\/\/ Cr\u00e9ation du s\u00e9lecteur :tel\r\n$.expr[':'].tel = function(obj){\r\n\treturn $(obj).is('[href^=\"tel:\"]');\r\n};\r\n$('a:tel').addClass('tel_num');<\/code><\/pre>\n<p>Bien, mais si nous avons 4 ou 5 s\u00e9lecteurs \u00e0 ajouter comme cela, \u00e7a va faire long.<br \/>\nNous pouvons tr\u00e8s bien utiliser la syntaxe suivante pour r\u00e9unir les fonctions qui nous permettent de cr\u00e9er nos s\u00e9lecteurs sous la m\u00eame forme :<\/p>\n<pre class=\"code\"><code class=\"js\">\/\/ Cr\u00e9ation des plusieurs s\u00e9lecteurs\r\n$.extend($.expr[':'], {\r\n\tsecure: function(a) { \r\n\t\treturn $(a).is('[href^=\"https:\"]');\r\n\t},\r\n\tnotsecure: function(a) { \r\n\t\treturn $(a).is('[href^=\"http:\"]');\r\n\t},\r\n\tselfanchor: function(a) { \r\n\t\treturn $(a).is('[href^=\"#\"]');\r\n\t}\r\n});\r\n\r\n\/\/ exemples d'utilisation\r\n$('a:secure').addClass('https_link');\r\n$('a:notsecure').addClass('http_link');\r\n$('a:selfanchor').addClass('self_link');<\/code><\/pre>\n<p class=\"message note\">Dans ces exemples de code, j&rsquo;utilise de simples addClass pour pr\u00e9senter les nouveaux s\u00e9lecteurs. C&rsquo;est \u00e0 vous de voir, au sein de votre d\u00e9veloppement, \u00e0 quoi vont pouvoir vous servir ces s\u00e9lecteurs.<\/p>\n<p>Je ne dis pas que ces exemples sont probants ou pertinents, mais ils sont l\u00e0 pour illustrer les possibilit\u00e9s d&rsquo;extension de jQuery, notamment pour les liens.<br \/>\nPeut-\u00eatre aurez-vous d&rsquo;autres id\u00e9es pour optimiser la gestion de vos liens, ou des besoins pr\u00e9cis pour lancer une fonction sur un type de lien.<\/p>\n<h2 id=\"css\">Ok mais&#8230; seulement en JS ?<\/h2>\n<p>Non, justement, CSS peut \u00eatre suffisant si vous n&rsquo;avez besoin que de modifier l&rsquo;apparence de vos liens.<br \/>\nEn effet, il est tout \u00e0 fait possible de cibler un \u00e9l\u00e9ment en fonction du contenu de son attribut, cela vaut pour l&rsquo;attribut <code>href<\/code>.<\/p>\n<pre class=\"code\"><code class=\"css\">\/* cible les liens dont l'attribut href commence par *\/\r\na[href^=\"mailto:\"] { }\r\na[href^=\"tel:\"] {}\r\n\r\n\/* cible les liens dont l'attribut href fini par *\/\r\na[href$=\".pdf\"] { }\r\na[href$=\".doc\"] { }\r\n\r\n\/* cible les liens dont l'attribut href contient *\/\r\na[href~=\"twitter.com\/!#\"] { }\r\na[href~=\"?redirect\"] { }<\/code><\/pre>\n<p>Cette technique est compatible avec Internet Explorer 7 et technologies sup\u00e9rieures&#8230; autant vous dire que vous pouvez d\u00e9j\u00e0 vous amuser !<\/p>\n<p>Voil\u00e0, vous \u00eates par\u00e9s pour styler et retravailler vos liens comme des pros !<br \/>\nLes commentaires sont \u00e0 votre disposition pour nous faire part de vos id\u00e9es d&rsquo;am\u00e9lioration, d&rsquo;utilisation ou pour toute question.<\/p>\n<p>J&rsquo;essayerai de vous proposer de petites extensions de s\u00e9lecteur dans ce genre pour d&rsquo;autres cas pratiques plus tard \ud83d\ude09<\/p>\n<div class=\"sources\">\n<h2>Liens utiles<\/h2>\n<ul>\n<li><a href=\"http:\/\/www.jquery.info\/spip.php?article82\">Accro\u00eetre les capacit\u00e9s des s\u00e9lecteurs de jQuery<\/a><\/li>\n<li><a hreflang=\"en\" href=\"http:\/\/ejohn.org\/blog\/qualified-selectors-in-jquery\/\">S\u00e9lecteur enti\u00e8rement personnalis\u00e9 (en)<\/a><\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>J&rsquo;ai recherch\u00e9 des possibilit\u00e9s en PHP pour retravailler les liens fournis par WordPress il n&rsquo;y a pas longtemps ; ce qui m&rsquo;a amen\u00e9 \u00e0 cette id\u00e9e d&rsquo;article. Beaucoup de possibilit\u00e9s de styles sont disponibles gr\u00e2ce \u00e0 CSS, mais il est parfois n\u00e9cessaire de transformer le comportement d&rsquo;un lien avec JavaScript.<\/p>\n","protected":false},"author":4,"featured_media":1691,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_bluesky_dont_syndicate":"","_bluesky_syndication_accounts":"","_bluesky_syndication_text":"","footnotes":""},"categories":[17,610,9],"tags":[228,416,288,413,415,52,412,414,399],"coauthors":[597],"class_list":["post-1679","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-css-css3","category-javascript","category-tutoriels","tag-astuce","tag-attribut","tag-css2-1","tag-externe","tag-href","tag-jquery","tag-liens-2","tag-mailto","tag-selecteur"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/posts\/1679","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/comments?post=1679"}],"version-history":[{"count":0,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/posts\/1679\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/media\/1691"}],"wp:attachment":[{"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/media?parent=1679"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/categories?post=1679"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/tags?post=1679"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/coauthors?post=1679"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}