<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Les intégristes &#187; Pierre Bertet</title>
	<atom:link href="http://www.lesintegristes.net/author/admin/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.lesintegristes.net</link>
	<description></description>
	<lastBuildDate>Wed, 25 Aug 2010 21:21:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>jQuery Mobile, pourquoi le tactile est-il toujours mobile ?</title>
		<link>http://www.lesintegristes.net/2010/08/14/l-equipe-de-jquery-vient-d-annoncer-un-nouvea/</link>
		<comments>http://www.lesintegristes.net/2010/08/14/l-equipe-de-jquery-vient-d-annoncer-un-nouvea/#comments</comments>
		<pubDate>Sat, 14 Aug 2010 15:14:24 +0000</pubDate>
		<dc:creator>Pierre Bertet</dc:creator>
				<category><![CDATA[Interface utilisateur]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.lesintegristes.net/?p=1084</guid>
		<description><![CDATA[L’équipe de jQuery vient d’annoncer un nouveau site entièrement dédié aux interfaces tactiles et mobiles : jQuery Mobile.
Le but est bien sûr d’optimiser jQuery pour ces nouvelles plates-formes, mais ce n’est pas tout : une version mobile de jQuery UI est également prévue !
Et plutôt que d’adapter jQuery UI à ces nouvelles contraintes, le projet consiste dans un premier temps à réfléchir sur les évolutions possibles du framework, de manière à ce qu’il prenne nativement en compte ces nouvelles interfaces.
Un des problèmes posés actuellement par jQuery UI est son système de gestion des thèmes graphiques, Theme Roller, qui est trop&#160;[&#8230;]]]></description>
			<content:encoded><![CDATA[<p>L’équipe de jQuery vient d’annoncer un nouveau site entièrement dédié aux interfaces tactiles et mobiles : <a href="http://jquerymobile.com/" lang="en">jQuery Mobile</a>.</p>
<p>Le but est bien sûr d’<a href="http://jquerymobile.com/gbs/" lang="en">optimiser jQuery pour ces nouvelles plates-formes</a>, mais ce n’est pas tout : une version mobile de jQuery UI est également prévue !</p>
<p>Et plutôt que d’adapter jQuery UI à ces nouvelles contraintes, le projet consiste dans un premier temps à réfléchir sur les évolutions possibles du <span lang="en">framework</span>, de manière à ce qu’il prenne nativement en compte ces nouvelles interfaces.</p>
<p>Un des problèmes posés actuellement par jQuery UI est son système de gestion des thèmes graphiques, <a href="http://jqueryui.com/themeroller/" lang="en">Theme Roller</a>, qui est trop « simple » pour permettre de créer des interfaces complexes.</p>
<div id="attachment_1103" class="wp-caption alignnone" style="width: 330px"><img src="http://www.lesintegristes.net/wp-content/uploads/2010/08/jquery-ui-mobile.png" alt="" title="jquery-ui-mobile" width="320" height="480" class="size-full wp-image-1103" /><p class="wp-caption-text">Prototype d’interface pour jQuery UI Mobile</p></div>
<p>Évidemment, une évolution en ce sens profiterait également au web « classique ».</p>
<p>Mon petit doigt me dit que ce qui va en sortir risque bien de s’appeler jQuery UI 2, librairie à la fois adaptée au mobile et au desktop, de manière évolutive selon la plate-forme de destination.</p>
<p>Vous pouvez voir quelques prototypes et suivre les étapes de développement sur cette page : <a href="http://wiki.jqueryui.com/Mobile" lang="en">http://wiki.jqueryui.com/Mobile<br />
</a><br />
jQuery UI suit donc la même direction que <a href="http://www.sencha.com/products/js/">ExtJS</a>, qui vient récemment de sortir en « version » mobile : <a href="http://www.sencha.com/products/touch/">Sencha Touch</a>.</p>
<p>Mais pourquoi associe-t-on systématiquement tactile (nouvelles possibilités d’interaction) et mobile (espace d’affichage réduit, bande passante et puissance limitées − pour l’instant) ?<br />
Les deux problématiques (nouveau type d’interaction, et nouvelles dimensions d’écran) sont différentes, et existent aussi indépendamment l’une de l’autre.</p>
<p>Tout ceci me donne l’impression que le domaine des applications web (<a href="http://www.quirksmode.org/blog/archives/2010/03/html5_apps.html">HTML5 Apps</a> en <span lang="en">buzz-language</span> ;-) ) est dans une période de transition, et se dirige doucement vers une unification de ces « multiples web », tout en respectant les spécificités et contraintes de chaque interface.</p>
<p>Rendez-vous dans <del datetime="2010-08-14T15:08:26+00:00">10</del> <del datetime="2010-08-14T15:08:26+00:00">5</del> 2 ans !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lesintegristes.net/2010/08/14/l-equipe-de-jquery-vient-d-annoncer-un-nouvea/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Les intégristes, le thème !</title>
		<link>http://www.lesintegristes.net/2009/12/22/les-integristes-le-theme/</link>
		<comments>http://www.lesintegristes.net/2009/12/22/les-integristes-le-theme/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 10:25:00 +0000</pubDate>
		<dc:creator>Pierre Bertet</dc:creator>
				<category><![CDATA[Les intégristes]]></category>

		<guid isPermaLink="false">http://www.lesintegristes.net/?p=760</guid>
		<description><![CDATA[RSSistes de tous horizons, venez donc faire un tour sur le blog, car le nouveau thème des intégristes est en ligne et il nous plaît beaucoup !
En plus d&#8217;une superbe identité spécialement réalisée pour nous par Monsieur Grégoire, ce fut également l&#8217;occasion de nous amuser un peu : HTML 5 bien sûr, une CSS universelle pour se débarrasser de pépé et utiliser l&#8217;ensemble des sélecteurs CSS 2 (enfin !), ou encore l&#8217;API Yahoo Weather pour tenter de détecter le temps qu&#8217;il fait chez vous. Nous avons également utilisé une grille horizontale comme il se doit, mais également une grille&#160;[&#8230;]]]></description>
			<content:encoded><![CDATA[<p>RSSistes de tous horizons, venez donc faire un tour sur le blog, car le nouveau thème des intégristes est en ligne et il nous plaît beaucoup !</p>
<p>En plus d&#8217;une superbe identité spécialement réalisée pour nous par <a href="http://twitter.com/gregoiredierend">Monsieur Grégoire</a>, ce fut également l&#8217;occasion de nous amuser un peu : HTML 5 bien sûr, une CSS universelle pour se débarrasser de pépé et utiliser l&#8217;ensemble des sélecteurs CSS 2 (enfin !), ou encore l&#8217;API Yahoo Weather pour tenter de détecter le temps qu&#8217;il fait chez vous. Nous avons également utilisé une grille horizontale comme il se doit, mais également une grille verticale. L&#8217;accessibilité n&#8217;est pas en reste : l&#8217;intégralité du site fonctionne au clavier, avec ou sans Javascript.</p>
<p>La publication a été réorganisée en deux thématiques : <a href="http://www.lesintegristes.net/articles/" title="Les auteurs">les articles</a>, que vous connaissez déjà, et les <a href="http://www.lesintegristes.net/categorie/notes/" title="Les notes">notes</a>. Plus courtes que les articles, sans titres, leur principal objectif est de nous permettre de publier de petites informations, en vous proposant de réagir dans les commentaires.</p>
<p>Voici le détail des nouveautés qui accompagnent cette nouvelle identité.</p>
<h2>Apparition des &laquo;&nbsp;notes&nbsp;&raquo;</h2>
<p>L&#8217;organisation du blog a été légèrement revue : nous proposons désormais une <a href="http://www.lesintegristes.net/auteurs/" title="Les auteurs">page de présentation</a>, parce que c&#8217;est quand même plus poli.</p>
<p>La veille des intégristes est toujours présente, seule sa présentation a changé. Cette page regroupe les différents liens qui nous passent sous les yeux, provenant de différentes sources : <a href="http://www.google.com/reader/">Google Reader</a>, <a href="http://delicious.com/">Delicious</a>, <a href="http://www.diigo.com">Diigo</a>.</p>
<p>L&#8217;autre nouveauté est la partie &laquo;&nbsp;notes&nbsp;&raquo;, qui nous permettra de publier de courtes informations, rapidement. Nous pourrons y publier des questions, dont chacune sera un nouveau défi pour l&#8217;humanité : Vaut-il mieux mettre un attribut <code>title</code> sur un lien plutôt que sur l&#8217;image qu&#8217;il contient ? Peut-on obtenir une place au paradis si l&#8217;on n&#8217;utilise pas Textmate ?</p>
<h2>HTML 5</h2>
<p>Pour le passage à HTML 5, deux ressources furent principalement utilisées : l&#8217;indispensable <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/">spécification HTML 5</a>, et le blog <a href="http://html5doctor.com/">HTML5 Doctor</a>. L&#8217;utilisation de certains éléments d&#8217;HTML 5 a soulevé beaucoup de questions, aussi n&#8217;hésitez pas à nous indiquer vos remarques à propos de leur pertinence.</p>
<h2>Une CSS Universelle pour Internet Explorer 6</h2>
<p>Internet Explorer 6 a bien vécu, et nous pensons qu&#8217;il est temps de lui offrir un repos bien mérité. C&#8217;est pourquoi nous avons pris la décision de proposer à ses utilisateurs <a href="http://forabeautifulweb.com/blog/about/universal_internet_explorer_6_css/" lang="en" title="Universal Internet Explorer 6 CSS">une feuille de style universelle</a>, qui affiche un style minimaliste, presque par défaut, sur l&#8217;ensemble du blog. Ainsi débarrassés de ce vieux farceur, nous avons pu profiter de toute la richesse des sélecteurs CSS 2, plus de 10 ans après leur recommandation par le W3C. Pas mal non ?</p>
<h2>La grille verticale</h2>
<p>En plus de la grille horizontale, un grille verticale a été utilisée pour ce thème. Vous pouvez la voir en cliquant sur ce bouton (un clic sur la grille permet de la masquer) : <a href="javascript:void(jQuery.lesintegristes.toggleGrid());">Afficher la grille</a>. Pour tester la grille sur d&#8217;autres pages du blog, faites simplement glisser le lien dans votre barre de favoris.<br />
Ainsi, le texte de la colonne de gauche est toujours aligné sur celui de la colonne de droite. Le tout apporte un rythme vertical très intéressant, mais les différences d&#8217;interprétation entre les navigateurs nous ont posé de nombreuses difficultés pour y parvenir. Nous sommes très heureux du résultat final, un je-ne-sais-quoi qui rend l&#8217;ensemble plus agréable pour la lecture.</p>
<h2>La météo : Yahoo Weather API</h2>
<p>Quelle est la fonctionnalité numéro 1 que doit proposer tout thème de blog qui se respecte ? La météo bien sûr !<br />
D&#8217;accord, ce n&#8217;est pas à ce point nécessaire, mais on s&#8217;est dit que ce serait rigolo, hahaha ! Le système fonctionne de la manière suivante : lors de votre première connexion sur le blog, votre heure locale sera détectée à l&#8217;aide de <a href="http://developer.yahoo.com/geo/geoplanet/" lang="en">Yahoo GeoPlanet API</a>. S&#8217;il est tard, le thème s&#8217;affichera simplement en mode nuit. S&#8217;il fait jour, une autre requête sera envoyée à <a href="http://developer.yahoo.com/weather/" lang="en">Yahoo Weather API</a>, pour tenter de détecter le temps qu&#8217;il fait chez vous.<br />
Et parce qu&#8217;il faut laisser un peu de place à Météo France dans le domaine, nous avons simplifié les 48 types de conditions de Yahoo Weather pour obtenir 5 modes. Vous pouvez également régler le thème sur le mode que vous préférez, à l&#8217;aide du module &laquo;&nbsp;Météo&nbsp;&raquo; présent dans la colonne de droite.</p>
<h2>Alors alors ?</h2>
<p>Nous sommes impatients de découvrir votre avis dans les commentaires : que pensez-vous de l&#8217;esthétique et de la structure de ce nouveau thème ?</p>
<p>Les intégristes vous souhaitent de joyeuses fêtes, pouet !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lesintegristes.net/2009/12/22/les-integristes-le-theme/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Introduction à WAI ARIA (traduction)</title>
		<link>http://www.lesintegristes.net/2008/12/09/introduction-a-wai-aria-traduction/</link>
		<comments>http://www.lesintegristes.net/2008/12/09/introduction-a-wai-aria-traduction/#comments</comments>
		<pubDate>Tue, 09 Dec 2008 10:39:40 +0000</pubDate>
		<dc:creator>Pierre Bertet</dc:creator>
				<category><![CDATA[Accessibilité]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[ARIA]]></category>

		<guid isPermaLink="false">http://www.lesintegristes.net/?p=399</guid>
		<description><![CDATA[
Grégoire Dierendonck

L&#8217;article qui suit est la traduction de l&#8217;article &#171;&#160;Introduction to WAI ARIA&#171;&#160;, publié par Gez Lemon sur Dev Opera, le site d&#8217;Opera Software destiné aux développeurs.
Gez Lemon est un expert reconnu de l&#8217;accessibilité web. Il est membre du WaSP ( Accessibility Task Force ) et travaille pour The Paciello Group, entreprise de conseil spécialisée dans l&#8217;accessibilité web.
Cette traduction, comme l&#8217;article original, est placée sous licence Creative Commons by-nc-sa 2.5.

Cet article est destiné à des personnes ne connaissant pas ARIA. Vous devriez avoir une bonne connaissance du langage HTML et des problèmes que peuvent rencontrer les&#160;[&#8230;]]]></description>
			<content:encoded><![CDATA[<p style="text-align:center;font-size:10px;"><img src="http://www.lesintegristes.net/wp-content/uploads/2008/12/illu-aria4.jpg" alt="Illustration par Grégoire Dierendonck" title="" width="380" height="435" /><br />
<a style="margin-left:10px;text-decoration:none;" href="http://www.troispongdesign.fr/"><em>Grégoire Dierendonck</em></a></p>
<div class="preamble">
<p>L&#8217;article qui suit est la traduction de l&#8217;article &laquo;&nbsp;<a href="http://dev.opera.com/articles/view/introduction-to-wai-aria/">Introduction to WAI ARIA</a>&laquo;&nbsp;, publié par <a href="http://juicystudio.com/">Gez Lemon</a> sur <a href="http://dev.opera.com/">Dev Opera</a>, le site d&#8217;Opera Software destiné aux développeurs.</p>
<p>Gez Lemon est un expert reconnu de l&#8217;accessibilité web. Il est membre du <a href="http://www.webstandards.org/"><abbr title="The Web Standards Project">WaSP</abbr></a> ( <a href="http://www.webstandards.org/action/atf/">Accessibility Task Force</a> ) et travaille pour <a href="http://www.paciellogroup.com/">The Paciello Group</a>, entreprise de conseil spécialisée dans l&#8217;accessibilité web.</p>
<p>Cette traduction, comme l&#8217;article original, est placée sous licence <a href="http://creativecommons.org/licenses/by-nc-sa/2.5/deed.fr">Creative Commons by-nc-sa 2.5</a>.</p>
</div>
<p>Cet article est destiné à des personnes ne connaissant pas ARIA. Vous devriez avoir une bonne connaissance du langage HTML et des problèmes que peuvent rencontrer les personnes handicapées sur le web. Connaître quelques application web &laquo;&nbsp;riches&nbsp;&raquo; (RIA) d&#8217;un point de vue utilisateur serait un plus.</p>
<p>Après avoir lu cet article, vous comprendrez à quoi sert ARIA, comment l&#8217;intégrer à vos sites, et comment l&#8217;utiliser dès immédiatement et même sur le plus simple des sites pour le rendre plus accessible.</p>
<h2>Introduction</h2>
<p>Le langage HTML (HyperText Markup Language) n&#8217;a pas été conçu pour créer des applications web. Le nombre de contrôles (bouton, case à cocher, etc.) qu&#8217;il propose est limité, et il est basé sur une communication client / serveur séquentielle. Les développeurs d&#8217;applications web ont contourné ces limitations en créant leurs propres widgets (contrôles graphiques) associés à Javascript pour leur ajouter le comportement désiré.</p>
<p>Malheureusement, les techniques utilisées pour outrepasser ces limitations ne sont absolument pas accessibles. Bien que ces widgets ressemblent à ceux d&#8217;une application bureau classique comme la représentation d&#8217;une arborescence (tree view), le rôle (ce que le widget fait), l&#8217;état (sa configuration, comme &laquo;&nbsp;checked&nbsp;&raquo; pour une case à cocher), et d&#8217;autres informations importantes ne sont pas disponibles pour les technologies d&#8217;assistance (comme les lecteurs d&#8217;écran). Ce serait comme styler une ligne de texte pour qu&#8217;elle ressemble à un titre, sans utiliser un élément définissant un titre (h1 à h6). Le texte ressemble à un titre, mais les technologies d&#8217;assistance n&#8217;ont pas accès à cette information.</p>
<p>Les mises à jour sont souvent mal perçues par les personnes utilisant une technologie d&#8217;assistance. Ces outils s&#8217;attendent à ce que le contenu change lors d&#8217;un événement de navigation &laquo;&nbsp;classique&nbsp;&raquo;, comme un clic sur un lien ou un envoi de formulaire. Les applications web utilisent des techniques comme <abbr title="Asynchronous JavaScript and XML">AJAX</abbr> pour mettre à jour le contenu en arrière plan, ce qui peut passer inaperçu pour les technologies d&#8217;assistance. Si elles sont tout de même informées de ces mises à jour, l&#8217;utilisateur n&#8217;est pas pour autant informé que le contenu à été mis à jour, et n&#8217;a aucun moyen de localiser la zone mise à jour.</p>
<p><a href="http://www.w3.org/WAI/intro/aria"><abbr title="Web Accessibility Initiative">WAI</abbr>-<abbr title="Accessible Rich Internet Applications">ARIA</abbr></a> est une spécification qui propose la possibilité de définir une description des rôles, des états et des propriétés pour les widgets personnalisés, de manière à ce qu&#8217;ils soient reconnaissables et utilisables par les utilisateurs de technologies d&#8217;assistance. WAI-ARIA propose également un système permettant de s&#8217;assurer qu&#8217;un utilisateur de technologie d&#8217;assistance est informé des mises à jour de l&#8217;application.</p>
<h2>Petit historique du langage HTML</h2>
<p>Le langage HTML a été conçu pour être un système hypertexte, permettant de structurer et de partager des documents liés entre eux. Les premiers brouillons de la spécification HTML définissaient des balises comme des titres, des paragraphes, des listes, ou des ancres, pour ajouter une structure à des documents texte. La <a href="http://www.w3.org/MarkUp/draft-ietf-iiir-html-01.txt">première proposition d&#8217;une spécification HTML</a> par l&#8217;<abbr title="Internet Engineering Task Force">IETF</abbr> incluait l&#8217;élément <code>img</code>, permettant d&#8217;ajouter des images à l&#8217;intérieur du document. La première spécification formelle fût <a href="http://tools.ietf.org/html/rfc1866">HTML 2</a>, basée sur les premiers brouillons de HTML. Cette spécification a défini les formulaires, ainsi que quelques composants d&#8217;interface permettant de créer des zones éditables, des boutons, des cases à cocher, des boutons radio, et des menus déroulants. Le petit ensemble de de contrôles définis dans HTML 2 n&#8217;a quasiment pas changé jusqu&#8217;à <a href="http://www.w3.org/TR/html401/">HTML 4.01</a>, que nous utilisons actuellement.</p>
<p>Le modèle de communication de HTML est basé sur un modèle client / serveur : le client envoie des requêtes et reçoit des réponses ; Le serveur web attend les requêtes, les traite, puis renvoie une réponse au client. Puisque HTML ne définit pas de gestion de comportement, la communication est séquentielle : le client demande une page au serveur, le serveur traite la requête et renvoie une page au client.</p>
<h2>Applications web</h2>
<p>Les applications web essaient d&#8217;imiter les applications bureau classiques, mais ces applications web sont elles-mêmes exécutées à l&#8217;intérieur d&#8217;une application bureau : le navigateur. Il existe deux différences fondamentales entre HTML, avec son modèle de communication, et une application de bureau traditionnelle :</p>
<ul>
<li>Les applications de bureau possèdent une couche de comportement qui ne repose pas sur des requêtes serveur.</li>
<li>Les applications de bureau possèdent un nombre bien plus élevé de widgets.</li>
</ul>
<h2>Reproduction d&#8217;applications bureau</h2>
<h3>Requêtes serveur en arrière plan</h3>
<p>Pour simuler les applications bureau classiques, les applications web utilisent Javascript pour la partie comportement. Javascript peut par exemple être utilisé pour ouvrir et refermer un élément de menu lorsque l&#8217;utilisateur intéragit avec l&#8217;élément. Des données doivent parfois être récupérées sur le serveur : l&#8217;application peut par exemple récupérer des enregistrement dans une base de données pour mettre à jour des informations sur la page. Lorsque l&#8217;application doit interagir avec le serveur, des techniques comme AJAX ou un élément IFrame masqué sont utilisés pour communiquer de manière transparente avec le serveur.</p>
<h3>Reproduire des composants riches (widgets)</h3>
<p>Puisque HTML propose très peu de widgets (ndt : dans la suite de l&#8217;article, ce mot sera souvent utilisé pour désigner les contrôles d&#8217;interface), il est parfois nécessaire de créer des composants plus complexes pour une application web, comme une case à cocher proposant trois états, ou un bouton glissant (slider). Ces composants sont habituellement créés en utilisant des éléments graphiques couplés à Javascript pour qu&#8217;ils ressemblent et se comportent comme des composants natifs.</p>
<p><img src="http://dev.opera.com/articles/view/introduction-to-wai-aria/tristate.gif" alt="Trois cases à cocher : non cochée, cochée, et à moitié cochée" width="228" height="171" /></p>
<p>Figure 1 — Une boîte de dialogue avec une case à cocher proposant trois états.</p>
<p><img src="http://dev.opera.com/articles/view/introduction-to-wai-aria/slider.gif" alt="Un bouton glissant proposant d'indiquer la qualité d'un service" width="358" height="65" /></p>
<p>Figure 2 — Un bouton glissant (slider) pouvant être utilisé pour indiquer la qualité d&#8217;un service.</p>
<h2>Problèmes d&#8217;accessibilité avec la reproduction de composants natifs</h2>
<p>Visuellement, créer des contrôles riches et effectuer des requêtes serveur en arrière plan permet de créer une meilleure expérience utilisateur. Malheureusement, ces techniques posent de graves problèmes d&#8217;accessibilité pour les utilisateurs de technologies d&#8217;assistance, comme les lecteurs d&#8217;écran.</p>
<ul>
<li>Les composants créés de cette manière sont rarement accessibles au clavier.</li>
<li>Le rôle d&#8217;un composant, &laquo;&nbsp;ce qu&#8217;il fait&nbsp;&raquo;, n&#8217;est pas accessible aux technologies d&#8217;assistance.</li>
<li>Les états et propriétés d&#8217;un composant ne sont pas accessibles aux technologies d&#8217;assistance.</li>
<li>Les mises à jour ne sont pas signalées aux technologies d&#8217;assistance.</li>
</ul>
<h2>WAI-ARIA à la rescousse</h2>
<p>Tous les problèmes listés ci-dessus sont résolus par la specification <strong>WAI-ARIA</strong> (qui sera abrégée <strong>ARIA</strong> jusqu&#8217;à la fin de cet article) : <strong>W</strong>eb <strong>A</strong>ccessibility <strong>I</strong>nitiative’s <strong>A</strong>ccessible <strong>R</strong>ich <strong>I</strong>nternet <strong>A</strong>pplications. ARIA est une technologie <em>positive</em> : plutôt que de dire aux développeurs ce qu&#8217;ils ne peuvent pas faire, elle leur propose simplement de créer des applications web riches. ARIA est de plus une technologie très facile à implémenter.</p>
<h2>Navigation au clavier</h2>
<p>En plus de proposer une alternative aux éléments non-textuels, permettre d&#8217;interagir avec les contrôles d&#8217;interface à l&#8217;aide du clavier fait partie du minimum à mettre en place pour rendre un système plus accessible. Un développeur sensibilisé à l&#8217;accessibilité devrait réaliser des widgets dont les éléments permettent de recevoir le focus, tout comme le fait par défaut un élément <code>input</code> de type <code>image</code> (<code>&lt;input type="image" ...&gt;</code>). Malheureusement, la plupart des widgets ne sont pas réalisés de cette manière : ils utilisent plutôt des éléments comme <code>img</code>, ou peuvent être composés de plusieurs éléments placés dans un conteneur <code>div</code> qui ne reçoit pas le focus.</p>
<p>L&#8217;attribut <code>tabindex</code> est arrivé avec HTML4, utilisable sur les éléments suivants : <code>a</code>, <code>area</code>, <code>button</code>, <code>input</code>, <code>object</code>, <code>select</code>, et <code>textarea</code>. Cet attribut accepte un nombre positif compris entre <code>0</code> et <code>32767</code>. La navigation commence avec les éléments ayant la plus petite valeur <code>tabindex</code>, et se poursuit jusqu&#8217;à l&#8217;élément ayant la valeur la plus élevée. Les éléments ayant pour valeur <code>0</code> sont visités dans leur ordre naturel d&#8217;apparition dans le code. Si le document a une structure logique, l&#8217;attribut <code>tabindex</code> n&#8217;est pas requis car les éléments d&#8217;interface sont naturellement définis dans l&#8217;ordre de tabulation.</p>
<p>ARIA <a href="http://www.w3.org/TR/wai-aria/#tabindex">étend l&#8217;attribut tabindex</a>, lui permettant d&#8217;être utilisé sur tous les éléments visibles. ARIA autorise également l&#8217;utilisation d&#8217;une valeur négative pour les éléments ne devant pas être proposés à la navigation au clavier, mais pouvant recevoir le focus par programmation. Bien que la valeur d&#8217;un attribut tabindex négatif n&#8217;aie pas d&#8217;importance (l&#8217;élément ne pourra jamais recevoir le focus au clavier), la valeur -1 est couramment utilisée lorsqu&#8217;un élément ne doit pas recevoir le focus au clavier, mais uniquement par programmation.<br />
Par exemple, vous pourriez réaliser un menu dont l&#8217;élément conteneur est accessible à l&#8217;aide de la tabulation clavier, mais pas les éléments qu&#8217;il contient. Ces éléments peuvent alors être programmés pour être parcourus à l&#8217;aide des touches fléchées du clavier. Ainsi, les utilisateur n&#8217;ont pas à utiliser la touche tabulation sur chacun des éléments du menu, ce qui leur permet de mieux accéder au document. C&#8217;est vrai pour tous les widgets ayant une série de composants nécessitant un accès au clavier, comme la représentation d&#8217;une arborescence.</p>
<h3>Ajouter un élément à l&#8217;ordre naturel des tabulations</h3>
<p>L&#8217;exemple suivant affecte la valeur <code>0</code> à l&#8217;attribut <code>tabindex</code> pour placer l&#8217;élément <code>div</code> dans l&#8217;ordre des tabulations, ce qui permettra  d&#8217;y accéder à l&#8217;aide de la navigation clavier.</p>
<pre><code>&lt;div tabindex="0"&gt;
...
&lt;/div&gt;</code></pre>
<h3>Tabindex négatif</h3>
<p>L&#8217;exemple suivant utilise un <code>tabindex</code> d&#8217;une valeur négative, cet élément pourra alors recevoir le focus par programmation.</p>
<pre><code>&lt;div id="progaccess" tabindex="-1"&gt;
...
&lt;/div&gt;</code></pre>
<p>Dans cet exemple, l&#8217;élément <code>div</code> n&#8217;est pas placé dans l&#8217;ordre des tabulations, mais possède un attribut <code>tabindex</code> d&#8217;une valeur de <code>-1</code>. Le script qui suit sélectionne l&#8217;élément précédemment défini et utilise la méthode <code>focus()</code> pour activer le focus sur cet élément.</p>
<pre><code>var objDiv = document.getElementById('progaccess');

// Focus on the element
objDiv.focus();</code></pre>
<h2>Que suis-je ?</h2>
<p>ARIA propose l&#8217;<a href="http://www.w3.org/TR/wai-aria/#Using_intro">attribut <code>role</code></a> pour définir les widgets, comme un bouton glissant (slider), ou définir la structure de la page, comme un menu. Un problème majeur des applications web est que n&#8217;importe quel élément peut être utilisé pour créer un widget. Les éléments HTML possèdent déjà des rôles prédéfinis. Le rôle d&#8217;un élément est &laquo;&nbsp;ce qu&#8217;il fait&nbsp;&raquo; &#8211; le rôle qu&#8217;il a dans la structure. Par exemple, le rôle des titres est bien compris par les technologies d&#8217;assistances. Lorsque des widgets sont réalisés à partir d&#8217;éléments existants, le rôle d&#8217;un élément est ce que la technologie d&#8217;assistance définit plutôt que ce qu&#8217;il représente visuellement en tant que widget. Par exemple, si le visuel d&#8217;un slider est créé en utilisant un élément <code>img</code> avec un texte alternatif approprié, un lecteur d&#8217;écran pourrait annoncer le contrôle comme ceci : &laquo;&nbsp;Image d&#8217;un slider&nbsp;&raquo;, plutôt que quelque chose de plus intéressant, comme &laquo;&nbsp;Bouton glissant, 16 pour cents&nbsp;&raquo;.</p>
<p><img src="http://dev.opera.com/articles/view/introduction-to-wai-aria/thumb.gif" alt="Image d'un bouton glissant (slider)" width="166" height="81" /></p>
<p>Figure 3 — L&#8217;image d&#8217;un bouton glissant (slider) classique.</p>
<p>Le rôle donné par l&#8217;attribut <code>role</code> prend le pas sur le rôle natif de l&#8217;élément. Dans l&#8217;exemple suivant, un élément <code>input</code> possède un attribut <code>role</code> dont la valeur est <code>slider</code> (nous verrons d&#8217;autres propriétés ARIA plus loin dans cet article) — le rôle indiqué à la technologie d&#8217;assistance est <code>slider</code> (bouton glissant), plutôt que <code>input</code> (entrée utilisateur).</p>
<pre><code>&lt;input type="image" src="thumb.gif"
alt="Effectiveness"
role="slider"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="42"
aria-valuetext="42 percent"
aria-labelledby="leffective"&gt;</code></pre>
<p>Lorsque le focus est placé sur cet élément, un utilisateur de lecteur d&#8217;écran comprend ce que fait ce widget. La spécification ARIA propose une <a href="http://www.w3.org/TR/wai-aria/#roles">liste de rôles</a>.</p>
<h3>Rôle des sections du document (document landmark roles)</h3>
<p>Les rôles que nous venons de voir permettent de décrire des widgets, mais il existe également des rôles permettant de décrire la structure du document. Les <a href="http://www.w3.org/TR/wai-aria/#roleattribute_inherits">document landmarks</a> (ou description des zones) sont un sous-ensemble des rôles classiques permettant aux utilisateurs de lecteurs d&#8217;écran de comprendre le rôle d&#8217;une zone pour mieux s&#8217;orienter dans le document.</p>
<p><img src="http://dev.opera.com/articles/view/introduction-to-wai-aria/pagestructure.gif" alt="Structure de la page" width="179" height="256" /></p>
<p>Figure 4 — Une page classique avec une bannière, une barre latérale et une zone de contenu principale.</p>
<p>ARIA définit les rôles de document landmarks (zones du document) suivants :</p>
<dl>
<dt><code>article</code></dt>
<dd>Contenu ayant du sens par lui-même, comme un article ou un commentaire de blog, un message sur un forum, etc.</dd>
<dt><code>banner</code></dt>
<dd>Contenu à propos du site, comme le titre de la page ou le logo.</dd>
<dt><code>complementary</code></dt>
<dd>Permet éventuellement de définir une partie du contenu principal, mais est plus approprié pour du contenu séparé : la météo sur un portail web par exemple.</dd>
<dt><code>contentinfo</code></dt>
<dd>Contenu dépendant d&#8217;un autre, comme des notes de bas de page, un copyright, un lien vers la déclaration de confidentialité, un lien vers les paramètres de l&#8217;application, etc.</dd>
<dt><code>main</code></dt>
<dd>Contenu directement lié ou englobant le contenu central du document.</dd>
<dt><code>navigation</code></dt>
<dd>Contient des liens pour naviguer dans ou en dehors du document.</dd>
<dt><code>search</code></dt>
<dd>Cette section contient un formulaire de recherche permettant de chercher sur le site.</dd>
</dl>
<p>Les exemples suivants utilisent les rôles banner, navigation et main pour définir la structure de la page visible sur la figure 4.</p>
<pre><code>&lt;div role="banner"&gt;
...
&lt;/div&gt;
&lt;div role="navigation"&gt;
...
&lt;/div&gt;
&lt;div role="main"&gt;
...
&lt;/div&gt;</code></pre>
<h2>États et propriétés d&#8217;ARIA</h2>
<p>Les <a href="http://www.w3.org/TR/wai-aria/#introstates">états (states) et propriétés (properties)</a> d&#8217;ARIA permettent de décrire des informations supplémentaires sur les widgets et de les mettre à la disposition des technologies d&#8217;assistance, afin d&#8217;aider l&#8217;utilisateur à comprendre comment intéragir avec le widget. L&#8217;état définit une configuration ou une information unique sur un objet. Par exemple, la propriété <code>aria-checked</code> possède trois valeurs pour définir ses états : <code>true</code>, <code>false</code> et <code>mixed</code>.</p>
<p>Dans l&#8217;exemple du bouton glissant vu un peu plus haut, nous avons inclus différentes propriétés que nous allons voir ci-dessous, aidant à décrire un widget à une technologie d&#8217;assistance.</p>
<dl>
<dt><code>aria-valuemin</code></dt>
<dd>Stocke la valeur minimale qu&#8217;un bouton glissant peut avoir.</dd>
<dt><code>aria-valuemax</code></dt>
<dd>Stocke la valeur maximale qu&#8217;il peut avoir.</dd>
<dt><code>aria-valuenow</code></dt>
<dd>Stocke la valeur actuelle.</dd>
<dt><code>aria-valuetext</code></dt>
<dd>Stocke du texte lisible permettant à l&#8217;utilisateur de comprendre le contexte. <code>"30 dollars"</code>, par exemple.</dd>
<dt><code>aria-labelledby</code></dt>
<dd>Stocke l&#8217;identifiant (attribut id) d&#8217;un élément contenant une description appropriée du widget.</dd>
</dl>
<p>Certaines propriétés peuvent être modifiées par programmation. Dans l&#8217;exemple suivant, les propriétés <code>arial-valuenow</code> et <code>arial-valuetext</code> de notre widget de bouton glissant sont mises à jour lorsque le bouton change de position :</p>
<pre><code>// Définit les valeurs des propriétés ARIA
// lorsque le bouton change de position
objThumb.setAttribute('aria-valuenow', iValue);
objThumb.setAttribute('aria-valuetext', iValue + ' %');</code></pre>
<p>Ajouter des rôles et attributs ARIA ne sera pas valide HTML 4.01 ou XHTML1.0, mais rassurez-vous, ARIA ne fait qu&#8217;ajouter des informations importantes à des spécifications écrites depuis un bon moment maintenant. Des travaux sont en cours pour <a href="http://www.w3.org/WAI/PF/adaptable/StatesAndProperties-20051106.html">définir une DTD pouvant être utilisée avec du XML modulaire</a>, comme XHTML1.1. La spécification ARIA fournit une <a href="http://www.w3.org/TR/wai-aria/#supported">liste complète des états et propriétés</a> permettant de définir des widgets accessibles.</p>
<h2>Les &laquo;&nbsp;Live Regions&nbsp;&raquo; (zones mises à jour)</h2>
<p>Les Live Regions permettent à certains éléments du document d&#8217;annoncer qu&#8217;ils ont été mis à jour, sans que l&#8217;utilisateur ne soit dérangé dans son activité. Cela signifie que les utilisateurs vont pouvoir être informés des mises à jour sans modifier leur position dans le contenu. Par exemple, une application de chat pourrait signaler une réponse de la personne avec qui l&#8217;utilisateur est en train de discuter, sans être déplacé en-dehors du champ permettant d&#8217;envoyer un nouveau message à la personne.</p>
<h3>aria-live</h3>
<p>Pour un utilisateur de lecteur d&#8217;écran, il est très difficile de comprendre ce qui a été mis à jour sur une page. ARIA propose la propriété <code>aria-live</code>, dont la valeur indique l&#8217;importance des mises à jour de la région. Voici les différents niveaux d&#8217;alerte pouvant être utilisés avec la propriété <code>aria-live</code> :</p>
<dl>
<dt><code>off</code></dt>
<dd>
<p>Il s&#8217;agit de la valeur par défaut, indiquant que la zone ne sera pas mise à jour.</p>
<pre><code>&lt;ul aria-live="off"&gt;</code></pre>
</dd>
<dt><code>polite</code></dt>
<dd>
<p>C&#8217;est une notification normale, le comportement généralement attendu d&#8217;une Live Region. La valeur polite indique qu&#8217;il n&#8217;est pas nécessaire d&#8217;y répondre tant que l&#8217;utilisateur n&#8217;a pas terminé ce qu&#8217;il est actuellement en train de faire.</p>
<pre><code>&lt;ul aria-live="polite"&gt;</code></pre>
</dd>
<dt><code>assertive</code></dt>
<dd>
<p>Ce niveau d&#8217;alerte est plus élevé que la normale, mais n&#8217;interrompt pas nécessairement l&#8217;utilisateur.</p>
<pre><code>&lt;ul aria-live="assertive"&gt;</code></pre>
</dd>
<dt><code>rude</code></dt>
<dd>
<p>Cette valeur est la plus élevée, et interrompt l&#8217;utilisateur pour lui notifier la mise à jour. Il peut s&#8217;en trouver désorienté, et peut empêcher l&#8217;utilisateur de reprendre la tâche qu&#8217;il effectuait. Elle ne devrait être utilisée qu&#8217;en cas d&#8217;absolue nécessité.</p>
<pre><code>&lt;ul aria-live="rude"&gt;</code></pre>
</dd>
</dl>
<p>Quelques autres propriétés peuvent être utilisées lorsqu&#8217;une Live Region est créée, en voici la liste.</p>
<h3>La propriété <code>aria-atomic</code></h3>
<p><code>aria-atomic</code> est une propriété optionnelle des Live Regions pouvant prendre comme valeur <code>true</code> ou <code>false</code> (par défaut si la propriété n&#8217;est pas définie).</p>
<p>Lorsque la zone est mis à jour, la propriété <code>aria-atomic</code> permet à la technologie d&#8217;assistance de savoir si elle doit décrire à l&#8217;utilisateur la zone entière ou seulement la partie ayant été mise à jour. Si cette propriété est définie à <code>true</code>, la technologie d&#8217;assistance devrait décrire complètement la zone. Si sa valeur est <code>false</code>, seule la partie mise à jour devrait être annoncée.</p>
<p>Dans l&#8217;exemple suivant, tous les éléments de la liste non-ordonnée seront annoncés à l&#8217;utilisateur, à moins qu&#8217;un de ces éléments ne surcharge la propriété <code>aria-atomic</code>.</p>
<pre><code>&lt;ul aria-atomic="true"
aria-live="polite"&gt;</code></pre>
<h3>La propriété <code>aria-busy</code></h3>
<p><code>aria-busy</code> est une propriété optionnelle des Live Regions pouvant prendre comme valeur <code>true</code> ou <code>false</code> (par défaut si la propriété n&#8217;est pas définie). Si plusieurs parties d&#8217;une Live Region ont besoin d&#8217;être chargées avant que la mise à jour ne soit annoncée à l&#8217;utilisateur, la propriété <code>aria-busy</code> peut être définie à <code>true</code> jusqu&#8217;à ce que la dernière partie soit chargée, puis à <code>false</code> lorsque la mise à jour est complètement terminée. Cette propriété empêche les technologies d&#8217;assistance d&#8217;annoncer un changement avant qu&#8217;une mise à jour ne soit complétée.</p>
<pre><code>&lt;ul aria-atomic="true"
aria-busy="true"
aria-live="polite"&gt;</code></pre>
<h3>La propriété <code>aria-channel</code></h3>
<p><code>aria-channel</code> est une propriété optionnelle des Live Regions pouvant prendre comme valeur <code>main</code> (par défaut si la propriété n&#8217;est pas définie) ou <code>notify</code>. Les canaux (channels) ont trait au matériel disponible sur le système de l&#8217;utilisateur, comme un synthétiseur vocal ou une <a href="http://fr.wikipedia.org/wiki/Plage_braille">plage Braille</a> (ndt: lien ajouté). Si un seul canal est disponible, <code>main</code> et <code>notify</code> utiliseront tous deux le même canal. Le canal <code>notify</code> a une priorité plus élevée que le canal <code>main</code>.</p>
<pre><code>&lt;ul aria-atomic="true"
aria-channel="notify"
aria-live="polite"&gt;</code></pre>
<h3>La propriété <code>aria-relevant</code></h3>
<p><code>aria-revelant</code> est une propriété optionnelle des Live Regions indiquant quels types de changements sont considérés comme significatifs à l&#8217;intérieur d&#8217;une zone (ajout d&#8217;un élément, suppression d&#8217;un élément et modification de texte). Cette propriété accepte une ou plusieurs des valeurs suivantes, séparées par des espaces :</p>
<dl>
<dt><code>additions</code></dt>
<dd>Des noeuds sont ajoutés au DOM à l&#8217;intérieur de la zone.</dd>
<dt><code>removals</code></dt>
<dd>Des noeuds sont supprimés du DOM à l&#8217;intérieur de la zone.</dd>
<dt><code>text</code></dt>
<dd>Du texte est ajouté ou supprimé du DOM (modification de texte).</dd>
<dt><code>all</code></dt>
<dd>Toutes les valeurs définies précédemment (additions, removals, text) s&#8217;appliquent à la zone.</dd>
</dl>
<p>En l&#8217;absence de la propriété <code>aria-revelant</code>, le comportement par défaut considère que les modifications significatives sont les modifications de texte et les ajouts de noeuds (<code>aria-revelant="text additions"</code>). L&#8217;exemple suivant n&#8217;annoncera des changements que si des noeuds sont ajoutés à la région. Si des modifications de texte surviennent ou que des noeuds sont supprimés, l&#8217;utilisateur n&#8217;en sera pas averti.</p>
<pre><code>&lt;ul aria-relevant="additions"
aria-atomic="true"
aria-live="polite"&gt;</code></pre>
<h2>Quand pourrons nous utiliser ARIA ?</h2>
<p>L&#8217;utilisation d&#8217;ARIA ne présente aucun inconvénient, vous pouvez l&#8217;utiliser dès à présent. Les quatre principaux navigateurs du marché ont commencé ou prévoient de supporter ARIA. Opera 9.5 et Firefox 1.5+ disposent déjà d&#8217;un support ARIA. Internet Explorer 8 beta supporte ARIA, et l&#8217;équipe de développement de Webkit, le moteur libre utilisé par Safari (ndt: et Google Chrome), a annoncé que l&#8217;intégration d&#8217;ARIA avait commencé.</p>
<p>ARIA est également en train d&#8217;être largement adopté par les technologies d&#8217;assistance. JAWS 7.1+, Window-Eyes 5.5+, NVDA, Zoomtext 9+, et d&#8217;autres offrent déjà un support basique d&#8217;ARIA, et ce n&#8217;est qu&#8217;un début.</p>
<h2>Soyez parmi les premiers à l&#8217;utiliser</h2>
<p>Puisque nous venons de voir que l&#8217;utilisation d&#8217;ARIA ne provoque aucun effet de bord et que le support est déjà présent, il n&#8217;y a rien à perdre à l&#8217;utiliser dès maintenant, et beaucoup à gagner. Même si votre site web est le plus simple du monde, vous pouvez y inclure des document landmarks (rôles des sections) pour aider l&#8217;utilisateur à mieux naviguer et à s&#8217;orienter à l&#8217;intérieur du contenu.</p>
<h3>Utilisez les rôles de section (document landmark roles)</h3>
<p>Sur mon site web personnel, j&#8217;ai utilisé les rôles de zones <code>main</code>, <code>navigation</code>, <code>search</code>, et <code>secondary</code>. Prenons la structure suivante.</p>
<pre><code>&lt;div id="ads"&gt;
...
&lt;/div&gt;
&lt;div id="nav"&gt;
&lt;form id="searchform" ...&gt;
...
&lt;/form&gt;
...
&lt;/div&gt;
&lt;div id="content"&gt;
...
&lt;/div&gt;</code></pre>
<p>Nous pourrions écrire l&#8217;attribut <code>role</code> pour nos document landmarks directement dans le code HTML :</p>
<pre><code>&lt;div id="ads" role="banner"&gt;
...
&lt;/div&gt;
&lt;div id="nav" role="navigation"&gt;
&lt;form id="searchform" role="search" ...&gt;
...
&lt;/form&gt;
...
&lt;/div&gt;
&lt;div id="content" role="main"&gt;
...
&lt;/div&gt;</code></pre>
<p>Alternativement, puisque les pages sont structurées de manière à pouvoir être stylées avec CSS, la page a des chances d&#8217;être structurée à l&#8217;aide d&#8217;attributs id pouvant être passés à une fonction Javascript. L&#8217;exemple suivant est une fonction Javascript simple acceptant l&#8217;attribut <code>id</code> d&#8217;un élément et une valeur de <code>role</code>, lui permettant de définir l&#8217;attribut <code>role</code> de l&#8217;élément correspondant.</p>
<pre><code>function addARIARole(strID, strRole)
{
// Find the element to add a role property to
var objElement = document.getElementById(strID);

if (objElement)
{
// Add the role property to the element
objElement.setAttribute('role', strRole);
}
}</code></pre>
<p>La fonction peut alors être appelée en passant en paramètre l&#8217;attribut <code>id</code> de la section et son rôle dans le document. Considérez la structure de document ci-dessous : nous pourrions utiliser cette fonction Javascript pour insérer un attribut <code>role</code>, plutôt que de l&#8217;écrire dans le code HTML.</p>
<pre><code>function setupARIA()
{
// Add ARIA roles to the document
addARIARole('content', 'main');
addARIARole('nav', 'navigation');
addARIARole('searchform', 'search');
addARIARole('ads', 'banner');
}

window.onload = setupARIA;</code></pre>
<h3>Indiquer les champs requis</h3>
<p>Si certains de vos formulaires contiennent des champs requis, vous pouvez utiliser la propriété <code>aria-required</code>. Cette propriété indique qu&#8217;une entrée utilisateur est requise pour envoyer le formulaire. L&#8217;exemple suivant ajoute la propriété <code>aria-required</code> à un élément <code>input</code> classique.</p>
<pre><code>&lt;label for="contactname"&gt;Name&lt;/label&gt;
&lt;input type="text"
id="contactname"
name="contactname"
size="30"
aria-required="true"&gt;</code></pre>
<p>Le système de blog WordPress a déjà commencé à utiliser l&#8217;attribut <code>aria-required</code> pour les champs requis du formulaire d&#8217;envoi de commentaire.</p>
<h3>Ajouter d&#8217;autres propriétés pertinentes</h3>
<p>Beaucoup de propriétés ARIA peuvent être utilisées sur des sites web très simples, comme <code>aria-labelledby</code> et <code>aria-describedby</code>. La propriété <code>aria-labelledby</code> pointe sur un ou plusieurs éléments considérés comme le libellé de l&#8217;élément, tandis que l&#8217;attribut <code>aria-describedby</code> pointe sur un ou plusieurs éléments considérés comme la description de l&#8217;élément.</p>
<pre><code>&lt;h2 id="limg"&gt;Paragliding&lt;/h2&gt;
&lt;p id="dimg"&gt;
A long description of our paragliding trip ...
&lt;/p&gt;

&lt;div&gt;
&lt;img src="takeoff.png"
alt="Getting ready to take off"
aria-labelledby="limg"
aria-describedby="dimg"&gt;
&lt;/div&gt;</code></pre>
<h3>Priorité des attributs HTML</h3>
<p>Les attributs ARIA ont la priorité sur le code HTML de base. C&#8217;est à dire que si <code>aria-labelledby</code> est utilisé parallèlement à <code>&lt;label for=""&gt;</code>, seul l&#8217;attribut <code>aria-labelledby</code> sera pris en compte. L&#8217;élément <code>label</code> est toujours encouragé pour les anciens navigateurs ne supportant pas ARIA. Une technique simple pour éviter les conflits est d&#8217;utiliser l&#8217;attribut <code>aria-labelledby</code> pour faire référence à l&#8217;élément<br />
<code>label</code>, ce qui permet d&#8217;être sûr que le libellé est lisible, quel que soit le support d&#8217;ARIA.</p>
<pre><code>&lt;label id="lblef" for="effectiveness"&gt;Effectiveness&lt;/label&gt;

&lt;input type="image"
role="slider"
id="effectiveness"
aria-labelledby="lblef"
...&gt;</code></pre>
<p>Parcourez la <a href="http://www.w3.org/TR/wai-aria/#supported">liste complète des états et propriétés</a> pour en apprendre plus sur la manière dont ARIA peut vous aider à rendre votre contenu plus accessible.</p>
<h2>Ensemble, maintenant</h2>
<p>HTML n&#8217;a pas été conçu dans le but de créer des applications web, mais les développeurs les ont créées en dessinant leurs propres widgets, et en leur ajoutant des comportements avec Javascript. Le problème est que le rôle, l&#8217;état et les propriétés des widgets et du contenu mis à jour sur ces pages n&#8217;est pas correctement transmis aux technologies d&#8217;assistance. La spécification ARIA résoud ce problème en permettant aux développeurs de décrire précisément leurs éléments d&#8217;interface, leur structure de document, et les zones de la page qui seront modifiées.<br />
Que vous développiez une application web complète avec de nombreux wigets et mises à jour dynamiques, ou le plus simple des sites web, vous pouvez commencer à utiliser ARIA dès maintenant pour vos utilisateurs handicapés.</p>
<h2>Pour en savoir plus</h2>
<ul>
<li><a href="http://www.w3.org/TR/wai-aria-practices/">Bonnes pratiques WAI-ARIA</a></li>
<li><a href="http://www.marcozehe.de/2008/02/29/easy-aria-tip-1-using-aria-required/">Utiliser <code>aria-required</code></a></li>
<li><a href="http://www.marcozehe.de/2008/03/23/easy-aria-tip-2-aria-labelledby-and-aria-describedby/">Utiliser <code>aria-labelledby</code> et <code>aria-describedby</code></a></li>
<li><a href="http://www.marcozehe.de/2008/07/16/easy-aria-tip-3-aria-invalid-and-role-alert/">Utiliser <code>aria-invalid</code> et <code>role</code> <code>alert</code></a></li>
<li><a href="http://www.paciellogroup.com/blog/?p=53">Exemple de case à cocher à trois états<br />
</a></li>
<li><a href="http://www.paciellogroup.com/blog/?p=68">Un exemple de bouton glissant (slider) avec ARIA</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.lesintegristes.net/2008/12/09/introduction-a-wai-aria-traduction/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>jQuery : l&#8217;événement !</title>
		<link>http://www.lesintegristes.net/2008/09/16/jquery-l-evenement/</link>
		<comments>http://www.lesintegristes.net/2008/09/16/jquery-l-evenement/#comments</comments>
		<pubDate>Mon, 15 Sep 2008 23:23:32 +0000</pubDate>
		<dc:creator>Pierre Bertet</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.lesintegristes.net/?p=63</guid>
		<description><![CDATA[Enfin &#171;&#160;les&#160;&#187;, événements. Je voulais un titre sensationnel.
Vous connaissez certainement jQuery, l&#8217;excellente bibliothèque Javascript. Non ? Alors c&#8217;est ici.
Le développement DOM/Javascript repose en grande partie sur les événements. Vous savez certainement qu&#8217;il est possible d&#8217;affecter un événement à un objet jQuery, c&#8217;est à dire qu&#8217;une fonction se déclenchera lors d&#8217;un événement sur l&#8217;objet sélectionné.
jQuery propose deux manières de définir les événements : nous allons les analyser.
Les &#171;&#160;Event Helpers&#160;&#187;
Joli nom. Pas très causant, mais sympa comme tout.
Il s&#8217;agit d&#8217;une série de méthodes, reprenant le nom des événements DOM. Elles prennent comme unique paramètre une fonction,&#160;[&#8230;]]]></description>
			<content:encoded><![CDATA[<p>Enfin &laquo;&nbsp;les&nbsp;&raquo;, événements. Je voulais un titre sensationnel.</p>
<p>Vous connaissez certainement <a href="http://jquery.com/">jQuery</a>, l&#8217;excellente bibliothèque Javascript. Non ? Alors <a href="http://www.lesintegristes.net/category/jquery/">c&#8217;est ici</a>.</p>
<p>Le développement DOM/Javascript repose en grande partie sur les événements. Vous savez certainement qu&#8217;il est possible d&#8217;affecter un événement à un objet jQuery, c&#8217;est à dire qu&#8217;une fonction se déclenchera lors d&#8217;un événement sur l&#8217;objet sélectionné.</p>
<p>jQuery propose deux manières de définir les événements : nous allons les analyser.</p>
<h3>Les &laquo;&nbsp;Event Helpers&nbsp;&raquo;</h3>
<p>Joli nom. Pas très causant, mais sympa comme tout.</p>
<p>Il s&#8217;agit d&#8217;une série de méthodes, reprenant le nom des événements DOM. Elles prennent comme unique paramètre une fonction, et leur nom correspond à celui de l&#8217;événement DOM, allégé de son préfixe &laquo;&nbsp;<strong>on</strong>&nbsp;&raquo; (onclick, onmouseout, etc. ).</p>
<p>Si aucun paramètre n&#8217;est passé, cette méthode <strong>déclenche</strong> l&#8217;événement.</p>
<p>Si une fonction est passée en paramètre, elle s&#8217;exécutera lorsque l&#8217;événement sera déclenché (depuis le code comme vu juste au-dessus, ou &laquo;&nbsp;naturellement&nbsp;&raquo;).</p>
<p>Vous trouverez la liste complète de ces méthodes sur la page de documentation des événements : <a href="http://docs.jquery.com/Events">http://docs.jquery.com/Events</a>.</p>
<h4>Définir un événement</h4>
<p>Commençons par un exemple. Tout le monde aime les exemples !</p>
<p>L&#8217;événement <code class="prettyprint">onclick</code> peut être défini sur un objet jQuery à l&#8217;aide de la méthode <code class="prettyprint">click()</code> à laquelle est passée une fonction :</p>
<pre><code class="prettyprint">$("a#test1").click(function(){
  window.alert("Clic sur a#test1.");
});
</code></pre>
<p>La fonction passée en paramètre peut attendre un paramètre. Il représente l&#8217;objet événement, et possède plusieurs propriétés et méthodes. J&#8217;ai l&#8217;habitude d&#8217;utiliser une variable nommée &laquo;&nbsp;e&nbsp;&raquo; (event), mais on peut évidemment utiliser un autre nom.</p>
<p>La méthode preventDefault() de cet objet permet d&#8217;empêcher le navigateur de déclencher son comportement par défaut.<br />
Sur un lien, cette méthode empêchera simplement le navigateur de le suivre.</p>
<p><strong>Exemple.</strong></p>
<pre><code class="prettyprint">$("a#test1").click(function(e){
  e.preventDefault(); // Empêche le navigateur de suivre le lien.
  window.alert("Clic sur a#test1.");
});
</code></pre>
<p>Démonstration : <a id="test1" href="http://www.example.com/">a#test1</a></p>
<p><script type="text/javascript"><!--
jQuery("a#test1").click(function(e){
e.preventDefault();
window.alert("Clic sur a#test1.");
});
// --></script></p>
<h4>Déclencher un événement depuis le code</h4>
<p>Il est parfois utile de déclencher un événement depuis le code. Pour cela, les mêmes méthodes seront appelées, mais cette fois sans paramètre.</p>
<p>Un exemple. &laquo;&nbsp;例&nbsp;&raquo;, dirait un japonais, mais vous n&#8217;êtes pas obligé de me croire.</p>
<p>Nous allons réutiliser l&#8217;événement précédemment défini dans le premier exemple, en le déclenchant depuis le code.</p>
<p>Lorsque le lien du second exemple ( &laquo;&nbsp;a#test2&#8243; ) sera cliqué, un clic sera déclenché sur le lien du premier exemple ( &laquo;&nbsp;a#test1&#8243; ).</p>
<p><strong>Exemple.</strong></p>
<pre><code class="prettyprint">$("a#test2").click(function(e){
  e.preventDefault();
  window.alert("Clic sur a#test2, déclenchement du clic sur a#test1...");
  $("a#test1").click();
});
</code></pre>
<p>Démonstration : <a id="test2" href="http://www.example.com/">a#test2</a></p>
<p><script type="text/javascript"><!--
jQuery("a#test2").click(function(e){
e.preventDefault();
window.alert("Clic sur a#test2, déclenchement du clic sur a#test1...");
jQuery("a#test1").click();
});
// --></script></p>
<h4>La méthode ready()</h4>
<p>Vous avez certainement déjà utilisé la méthode <code class="prettyprint">ready()</code> d&#8217;un objet jQuery contenant l&#8217;objet DOM <code class="prettyprint">document</code>.</p>
<p>Si un script est défini et exécuté dans la partie <code class="prettyprint">&lt;head&gt;</code> d&#8217;une page et qu&#8217;il essaie de manipuler des éléments, le navigateur se comportera comme s&#8217;ils n&#8217;existaient pas.</p>
<p>Le script est exécuté au moment où il est lu par le navigateur (<a href="http://www.la-grange.net/w3c/html4.01/interact/scripts.html#adef-defer">sauf avec l&#8217;attribut defer</a>). Puisque la suite du document n&#8217;a pas encore été chargée, le navigateur n&#8217;a pas connaissance de ces éléments.</p>
<p>Pour remédier à cela, il est possible d&#8217;attacher un événement <code class="prettyprint">onload</code> sur l&#8217;objet <code class="prettyprint">window</code>, qui sera déclenché lorsque la page <strong>et tous ses éléments</strong> seront chargés.</p>
<p><strong>Exemple.</strong></p>
<pre><code class="prettyprint">$(window).load(function(){
  // Le code placé ici sera déclenché
  // au chargement complet de la page.
});
</code></pre>
<p>Il s&#8217;agit de l&#8217;équivalent jQuery du célèbre <code class="prettyprint">window.onload = function(){}</code>. Évidemment, si un élément appelé sur votre page met un certain temps à répondre (une image hébergée ailleurs, ou votre outil d&#8217;analyse de statistiques basé sur un script externe), un long moment peut s&#8217;écouler avant que votre script ne soit exécuté.</p>
<p>C&#8217;est pourquoi la méthode <code class="prettyprint">ready()</code> de l&#8217;élément <code class="prettyprint">document</code> a été créée : la fonction affectée à cet événement sera déclenchée dès que le document HTML <strong>et les CSS</strong> seront chargés.</p>
<p>Le mécanisme de cet événement jQuery est plutôt intéressant. Il ne s&#8217;agit pas d&#8217;un événement natif DOM, ou pas tout à fait : Mozilla Firefox, Opera et les dernières versions de <a rel="external" href="http://webkit.org/">Webkit</a> déclenchent bien un événement DOMContentLoaded lorsque le document HTML est chargé, mais <a rel="external" href="http://my.opera.com/nicomen/blog/2007/07/08/domcontentloaded-gotcha-with-external-stylesheets">Opera n&#8217;attend pas que les styles soient chargés</a> pour le déclencher. On ne peut pas vraiment lui donner tort, puisque sur le brouillon de la spécification HTML5 <a rel="external" href="http://www.whatwg.org/specs/web-apps/current-work/#the-end">rien n&#8217;est précisé à propos du chargement des styles</a>.</p>
<p>jQuery résout ce problème sur Opera en attendant que chaque feuille de style soit disponible. Pour cela, la propriété <code class="prettyprint">disabled</code> de chacun des objets contenus dans <code class="prettyprint">document.styleSheets</code> (chaque fichier CSS) est testée jusqu&#8217;à ce qu&#8217;elle renvoie <code class="prettyprint">false</code>, c&#8217;est à dire lorsque la CSS est chargée.</p>
<p>Pour Internet Explorer, <a href="http://javascript.nwbox.com/IEContentLoaded/">l&#8217;astuce consiste à tester la méthode <code class="prettyprint">document.documentElement.doScroll("left");</code></a> jusqu&#8217;à ce qu&#8217;elle ne retourne plus d&#8217;erreur. Dès que c&#8217;est le cas, cela signifie que les styles sont chargés.</p>
<p>Pour Webkit, c&#8217;est la propriété <code class="prettyprint">document.readyState</code> qui est testée, puis un test similaire à celui utilisé pour Opera se charge de vérifier le chargement complet des CSS.</p>
<p>Certains navigateurs supportent l&#8217;événement <code class="prettyprint">document.DOMContentLoaded</code> (Mozilla Firefox), c&#8217;est donc ce dernier qui est utilisé.</p>
<p>Pour les navigateurs ne supportant pas <code class="prettyprint">document.DOMContentLoaded</code> et n&#8217;entrant pas dans les cas particuliers traités par jQuery (Opera, Webkit, Internet Explorer), c&#8217;est un simple événement <code class="prettyprint">window.onload qui est utilisé</code>.</p>
<p>Voilà, vous oubliez ça, jQuery le fait pour vous :</p>
<pre><code class="prettyprint">function bindReady(){
	if ( readyBound ) return;
	readyBound = true;

	// Mozilla, Opera (see further below for it) and webkit nightlies currently support this event
	if ( document.addEventListener &amp;&amp; !jQuery.browser.opera)
		// Use the handy event callback
		document.addEventListener( "DOMContentLoaded", jQuery.ready, false );

	// If IE is used and is not in a frame
	// Continually check to see if the document is ready
	if ( jQuery.browser.msie &amp;&amp; window == top ) (function(){
		if (jQuery.isReady) return;
		try {
			// If IE is used, use the trick by Diego Perini
			// http://javascript.nwbox.com/IEContentLoaded/
			document.documentElement.doScroll("left");
		} catch( error ) {
			setTimeout( arguments.callee, 0 );
			return;
		}
		// and execute any waiting functions
		jQuery.ready();
	})();

	if ( jQuery.browser.opera )
		document.addEventListener( "DOMContentLoaded", function () {
			if (jQuery.isReady) return;
			for (var i = 0; i &lt; document.styleSheets.length; i++)
				if (document.styleSheets[i].disabled) {
					setTimeout( arguments.callee, 0 );
					return;
				}
			// and execute any waiting functions
			jQuery.ready();
		}, false);

	if ( jQuery.browser.safari ) {
		var numStyles;
		(function(){
			if (jQuery.isReady) return;
			if ( document.readyState != "loaded" &amp;&amp; document.readyState != "complete" ) {
				setTimeout( arguments.callee, 0 );
				return;
			}
			if ( numStyles === undefined )
				numStyles = jQuery("style, link[rel=stylesheet]").length;
			if ( document.styleSheets.length != numStyles ) {
				setTimeout( arguments.callee, 0 );
				return;
			}
			// and execute any waiting functions
			jQuery.ready();
		})();
	}

	// A fallback to window.onload, that will always work
	jQuery.event.add( window, "load", jQuery.ready );
}
</code></pre>
<p>Vous l&#8217;aurez compris, il s&#8217;agit d&#8217;un extrait du code de jQuery.</p>
<p>Il existe deux autres &laquo;&nbsp;Event Helpers&nbsp;&raquo; particuliers, appelés &laquo;&nbsp;Interaction Helpers&nbsp;&raquo;. Les deux fonctionnent de la même manière, à la différence qu&#8217;ils attendent deux fonctions en paramètre plutôt qu&#8217;une.</p>
<p>La méthode <strong><code class="prettyprint">hover()</code></strong> permet de spécifier deux événements, pour l&#8217;entrée et la sortie du curseur souris dans la zone que couvre le ou les éléments de notre objet jQuery. <a href="http://www.lesintegristes.net/wp-content/uploads/2007/08/superman.jpg">Mon vieil ami Superman</a> appelle ce comportement le &laquo;&nbsp;survol&nbsp;&raquo;.</p>
<p>Ils ne sont pas tout à fait équivalents aux événements <code class="prettyprint">onmouseover</code> et <code class="prettyprint">onmouseout</code>, existant nativement en DOM.<br />
En utilisant ces derniers, lorsque le curseur se déplace d&#8217;un élément à un autre au sein de l&#8217;élément sur lequel est attaché l&#8217;événement (par exemple lorsqu&#8217;il passe sur une image se trouvant à l&#8217;intérieur d&#8217;un élément &lt;div&gt;), <code class="prettyprint">onmouseover</code> sera déclenché sur l&#8217;image (sur laquelle aucun événement n&#8217;est défini), et &laquo;&nbsp;remontera&nbsp;&raquo; jusqu&#8217;à son conteneur, pour déclencher une seconde fois l&#8217;événement. La cible de l&#8217;événement va également changer, ce sera l&#8217;image et non le conteneur.<br />
En sortant le curseur de l&#8217;image, même problème : c&#8217;est cette fois l&#8217;événement onmouseout qui sera déclenché sur le conteneur, mais avec l&#8217;image pour cible.</p>
<p>Pour en savoir plus, c&#8217;est ici : http://www.quirksmode.org/js/events_mouse.html</p>
<p>Si nous ne voulons pas de ce comportement, il faut vérifier que l&#8217;élément survolé au déclenchement de l&#8217;événement corresponde bien à l&#8217;élément sur lequel l&#8217;événement a été défini. C&#8217;est fastidieux. jQuery s&#8217;en charge automatiquement lorsque vous utilisez <code class="prettyprint">hover()</code>.</p>
<p>La seconde méthode est <strong><code class="prettyprint">toggle()</code></strong>. Elle est équivalente à la méthode <code class="prettyprint">click()</code>, mais la deuxième fonction passée sera déclenchée une fois sur deux à la place de la première, ce qui est très intéressant, par exemple pour faire apparaître et disparaître en alternance un élément à chaque clic sur un bouton. Vous pouvez également passer plus de deux fonctions, elles seront alors exécutées les unes à la suite des autres, à chaque clic.</p>
<h3>Les méthodes bind et trigger (affecter et déclencher)</h3>
<h4>La méthode bind()</h4>
<p>Vous pouvez utiliser la méthode <code class="prettyprint">bind()</code> pour affecter un <strong>ou plusieurs</strong> événements à un objet jQuery. Voici une première différence avec les &laquo;&nbsp;Event Helpers&nbsp;&raquo; vus au-dessus. Le premier paramètre doit être une chaîne de caractère, représentant les événements (séparés par des espaces) sur lesquels sera exécutée la fonction passée en deuxième paramètre. Allez !</p>
<p><strong>Exemple.</strong></p>
<pre><code class="prettyprint">$("a#test3").bind("mouseover mouseout", function(e){
  $(this).text( "-- " + $(this).text() + " --" );
});
</code></pre>
<p>Démonstration : <a id="test3" href="http://www.example.com/">a#test3</a></p>
<p><script type="text/javascript"><!--
jQuery("a#test3").bind("mouseover mouseout", function(e){
jQuery(this).text( "-- " + jQuery(this).text() + " --");
});
// --></script></p>
<p>Deux événements &laquo;&nbsp;spéciaux&nbsp;&raquo; sont disponibles avec la méthode <code class="prettyprint">bind()</code> : <code class="prettyprint">mouseenter</code> et <code class="prettyprint">mouseleave</code>.<br />
Ils correspondent à l&#8217;entrée la sortie du curseur sur un élément, sans déclencher l&#8217;événement lorsqu&#8217;un élément enfant est survolé. Ces événements correspondent à ceux définis par la méthode <code class="prettyprint">hover()</code>.</p>
<h4>La méthode trigger()</h4>
<p>Comme pour les &laquo;&nbsp;Event Helpers&nbsp;&raquo;, il est possible de déclencher depuis le code un événement défini sur un élément. La méthode <code class="prettyprint">trigger()</code> sera utilisée.</p>
<p><strong>Exemple.</strong></p>
<pre><code class="prettyprint">$("a#test4").bind("click", function(e){
  e.preventDefault();
  jQuery("a#test3").trigger("mouseover");
});
</code></pre>
<p>Démonstration : <a id="test4" href="http://www.example.com/">a#test4 : un clic sur ce lien déclenchera un survol sur l&#8217;élément a#test3 (démonstration précédente)</a><br />
<script type="text/javascript"><!--
jQuery("a#test4").bind("click", function(e){
  e.preventDefault();
  jQuery("a#test3").trigger("mouseover");
});
// --></script></p>
<h4>Supprimer un événement avec unbind()</h4>
<p>Supprimer un événement est trivial. Il suffit d&#8217;appeler la méthode <code class="prettyprint">unbind()</code> en lui passant en paramètre le ou les événements à supprimer. Si aucun événement n&#8217;est passé en paramètre, <strong>tous les événements affectés à cet objet jQuery seront supprimés</strong>.</p>
<p>Vous avez également la possibilité de passer en second paramètre une référence vers une fonction en particulier, de manière à ne pas supprimer toutes les fonctions attachées à cet événement.</p>
<p><strong>Exemple.</strong></p>
<pre><code class="prettyprint">function affiche1(){
  window.alert('1');
};
function affiche2(){
  window.alert('2');
};

$("#test").bind("click", affiche1);
$("#test").bind("click", affiche2);

// Si le script s'arrêtait ici, un clic sur l'élément afficherait "1" puis "2"

$("#test").unbind("click", affiche1);

// Mais la première fonction attachée à l'événement a été supprimée en passant sa référence, seul "2" est affiché
</code></pre>
<h4>Passer des données à un événement</h4>
<p>La méthode <code class="prettyprint">trigger()</code> permet également d&#8217;envoyer des données à la fonction déclenchée par l&#8217;événement. On passera alors ces données en second paramètre, après le nom de l&#8217;événement. Elles seront regroupées dans un tableau, sauf si un seul paramètre est passé : vous avez alors la possibilité de le passer directement.</p>
<pre><code class="prettyprint">$("a#test5").trigger("click", ["paramètre 1", 2, {parametre: "3"}]);
</code></pre>
<p>Lors de la définition de l&#8217;événement avec la méthode bind(), la fonction passée en paramètre devra définir ces paramètres pour pouvoir les utiliser.<br />
Tous les paramètres supplémentaires sont ajoutés après le premier, qui représente toujours l&#8217;objet événement (&laquo;&nbsp;e&nbsp;&raquo; dans l&#8217;exemple suivant).</p>
<p><strong>Exemple.</strong></p>
<pre><code class="prettyprint">$("a#test5").bind("click", function(e, param1, param2, param3){
  e.preventDefault();
  window.alert(param1); // Affiche "paramètre 1"
  window.alert(param2); // Affiche "2"
  window.alert(param3["parametre"]); // Affiche "3" (cet argument est un tableau associatif)
});
</code></pre>
<p>Démonstration (cliquez sur le bouton) : <button id="btn-test1">Déclencher un clic sur a#test5</button>, <a id="test5" href="http://www.example.com/">a#test5</a></p>
<p><script type="text/javascript"><!--
jQuery("a#test5").bind("click", function(e, param1, param2, param3){
  e.preventDefault();
  window.alert(param1); // Affiche "paramètre 1"
  window.alert(param2); // Affiche "2"
  window.alert(param3["parametre"]); // Affiche "3" (cet argument est un tableau associatif)
});
jQuery("#btn-test1").bind("click", function(e){
  e.preventDefault();
  jQuery("a#test5").trigger("click", ["paramètre 1", 2, {parametre: "3"}]);
});
// --></script></p>
<p>Essayez maintenant de cliquer sur le lien juste au-dessus, vous verrez que les paramètres ont la valeur <code class="prettyprint">undefined</code> la boîte de dialogue déclenchée par window.alert ne s&#8217;affiche même pas pour le troisième paramètre : le fait d&#8217;appeler une clé inexistante (<code class="prettyprint">param3["parametre"]</code>) déclenchera une erreur Javascript.</p>
<p>Comme dit plus haut, si un seul paramètre est passé, vous pouvez l&#8217;utiliser directement :</p>
<p><strong>Exemple.</strong></p>
<pre><code class="prettyprint">$("a#test5").trigger("click", "paramètre 1");
</code></pre>
<p>Bien entendu, la fonction n&#8217;attend qu&#8217;un paramètre dans ce cas :</p>
<pre><code class="prettyprint">$("a#test5").bind("click", function(e, param1){
  e.preventDefault();
  window.alert(param1); // Affiche "paramètre 1"
});
</code></pre>
<h4>Les événements &laquo;&nbsp;sur mesure&nbsp;&raquo;</h4>
<p>Il est possible d&#8217;utiliser <code class="prettyprint">bind()</code> pour affecter un événement personnalisé. Cet événement ne pourra être déclenché qu&#8217;avec la méthode <code class="prettyprint">trigger()</code>.</p>
<p>- A quoi ça sert, exactement ?<br />
- Principalement, à découper certaines parties d&#8217;un script, liées à un objet jQuery, en événements. Mais c&#8217;est quoi ces questions ? C&#8217;est pour me déstabiliser, c&#8217;est ça ?</p>
<p>Prenons un lien, auquel nous attacherons l&#8217;événement &laquo;&nbsp;StyleFunky&nbsp;&raquo;. Lorsque cet événement sera déclenché, notre lien va naturellement s&#8217;imposer dans le page, montrer à tous qu&#8217;il n&#8217;est pas le genre de lien qu&#8217;il fait bon prendre pour une ancre. En réalité, un ensemble de propriétés CSS seront définies sur cet élément, ainsi qu&#8217;un <code class="prettyprint">window.setInterval()</code> pour changer sa couleur de fond, mais ce sera transparent pour nous, une fois notre fonction définie. Seul l&#8217;événement &laquo;&nbsp;StyleFunky&nbsp;&raquo; sera ensuite déclenché.</p>
<p>Nous attacherons également un autre événement à ce lien, &laquo;&nbsp;StyleNormal&nbsp;&raquo;, qui annulera les effets de l&#8217;événement précédent (y compris le <code class="prettyprint">window.setInterval</code>) :</p>
<p><strong>Exemple.</strong></p>
<pre><code class="prettyprint">$("a#test6").bind("StyleFunky", function(){
  var jElt = $(this);
  jElt
  .css({
    "display": "block",
    "padding": "20px",
    "fontSize": "300%",
    "fontWeight": "bold",
    "textAlign": "center",
    "color": "#fff",
    "background": "#f00"
  });
  jElt.data("redBackground", true);
  jElt.data("interval", window.setInterval(function(){
    if (jElt.data("redBackground")) {
      jElt.css("background", "#f0f")
    } else {
      jElt.css("background", "#f00");
    }
    jElt.data("redBackground", ! (jElt.data("redBackground")) );
  }, 500));
});
$("a#test6").bind("StyleNormal", function(e){
  var jElt = $(this);
  window.clearInterval(jElt.data("interval"));
  jElt.css({
    "display": "inline",
    "padding": "0",
    "fontSize": "100%",
    "fontWeight": "normal",
    "textAlign": "left",
    "color": "#7F89A6",
    "background": "none"
  });
});
</code></pre>
<p>Demostración (c&#8217;est de l&#8217;espagnol) :<br />
<button type="button" id="btn-test2">$(&laquo;&nbsp;a#test6&#8243;).trigger(&laquo;&nbsp;StyleFunky&nbsp;&raquo;)</button> <button type="button" id="btn-test3">$(&laquo;&nbsp;a#test6&#8243;).trigger(&laquo;&nbsp;StyleNormal&nbsp;&raquo;)</button></p>
<p><a id="test6" href="http://www.example.com">a#test6</a></p>
<p><script type="text/javascript"><!--
jQuery("a#test6").bind("StyleFunky", function(e){
  var jElt = jQuery(this);
  jElt
  .css({
    "display": "block",
    "padding": "20px",
    "fontSize": "300%",
    "fontWeight": "bold",
    "textAlign": "center",
    "color": "#fff",
    "background": "#f00"
  });
  jElt.data("redBackground", true);
  jElt.data("interval", window.setInterval(function(){
    if (jElt.data("redBackground")) {
      jElt.css("background", "#f0f")
    } else {
      jElt.css("background", "#f00");
    }
    jElt.data("redBackground", ! (jElt.data("redBackground")) );
  }, 500));
});
jQuery("a#test6").bind("StyleNormal", function(e){
  var jElt = jQuery(this);
  window.clearInterval(jElt.data("interval"));
  jElt.css({
    "display": "inline",
    "padding": "0",
    "fontSize": "100%",
    "fontWeight": "normal",
    "textAlign": "left",
    "color": "#7F89A6",
    "background": "none"
  });
});
jQuery("#btn-test2").click(function(){jQuery("a#test6").trigger("StyleFunky")});
jQuery("#btn-test3").click(function(){jQuery("a#test6").trigger("StyleNormal")});
// --></script></p>
<h4>Les Namespaced Events (événements nommés)</h4>
<p>Nous avons vu qu&#8217;il était possible avec <code class="prettyprint">unbind()</code> de supprimer une seule des fonctions attachées à un événement, mais cette méthode est peu élégante, puisqu&#8217;elle n&#8217;autorise pas l&#8217;utilisation de fonctions anonymes.</p>
<p>Pour remédier à cela, jQuery permet de nommer une fonction attachée à un événement.<br />
Une notation similaire à celle des classes CSS est utilisée, accolée au nom de l&#8217;événement (&laquo;&nbsp;.action1&#8243;, &laquo;&nbsp;.action2&#8243; et &laquo;&nbsp;.action3&#8243; ici) :<br />
<code class="prettyprint">$(element).bind("click.action1", function(){ /* Action 1 */ });</code><br />
<code class="prettyprint">$(element).bind("click.action2", function(){ /* Action 2 */ });</code><br />
<code class="prettyprint">$(element).bind("click.action3", function(){ /* Action 3 */ });</code></p>
<p>Il sera alors possible de déclencher un événement en particulier en ciblant une fonction événement en particulier, ou toutes les fonctions attachées, en déclenchant simplement l&#8217;événement &laquo;&nbsp;click&nbsp;&raquo; :<br />
<code class="prettyprint">$(element).trigger("click.nom1"); /* Déclenche l'action 1 */</code><br />
<code class="prettyprint">$(element).trigger("click"); /* Déclenche les actions 1, 2 et 3 */</code></p>
<p>Évidemment, il  sera possible de les supprimer, individuellement, ou non.<br />
<code class="prettyprint">$(element).unbind("click.nom1"); /* Supprime l'action 1 */</code><br />
<code class="prettyprint">$(element).trigger("click"); /* Déclenche les actions 2 et 3 (la 1 vient d'être supprimée, sois attentif) */</code></p>
<h4>La méthode .triggerHandler()</h4>
<p>Pour finir, la méthode <code class="prettyprint">triggerHandler()</code> permet de déclencher les différentes fonctions attachées à un événement, sans déclencher l&#8217;action par défaut du navigateur.</p>
<p>Prenons l&#8217;événement <code class="prettyprint">focus</code> sur un champ texte de formulaire. Si vous lui affectez une action particulière (comme afficher une bulle d&#8217;information), vous pourrez alors déclencher cette action sans déplacer le curseur de l&#8217;utilisateur dans le champ :<br />
<code class="prettyprint">$(input[type=text]).bind("focus", function(){ /* Affichage de la bulle d'information */ });</code><br />
<code class="prettyprint">$(input[type=text]).trigger("focus"); /* Déplacement du curseur dans le champ texte, affichage de la bulle d'information */</code><br />
<code class="prettyprint">$(input[type=text]).triggerHandler("focus"); /* Affichage de la bulle d'information seulement */</code></p>
<p style="line-height:normal;font-size:300%"><strong>Voilà, c&#8217;est fini.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lesintegristes.net/2008/09/16/jquery-l-evenement/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Les nouveaux navigateurs débarquent (attention ils mordent)</title>
		<link>http://www.lesintegristes.net/2008/06/12/les-nouveaux-navigateurs-debarquent-attention-ils-mordent/</link>
		<comments>http://www.lesintegristes.net/2008/06/12/les-nouveaux-navigateurs-debarquent-attention-ils-mordent/#comments</comments>
		<pubDate>Thu, 12 Jun 2008 12:44:25 +0000</pubDate>
		<dc:creator>Pierre Bertet</dc:creator>
				<category><![CDATA[Actualité]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Navigateurs]]></category>

		<guid isPermaLink="false">http://www.lesintegristes.net/?p=64</guid>
		<description><![CDATA[Opera 9.5 vient tout juste de sortir dans sa version finale, et la liste des changements est impressionnante (vous pouvez également consulter un article présentant les nouveautés aux développeurs).
La date de sortie de Firefox 3 a été fixée au 17 juin.
Safari 3.1 attend ses nouveaux camarades depuis quelques temps déjà.
Dans quelques jours, les internautes auront à disposition trois navigateurs web d&#8217;excellente qualité.
Javascript
Les performances de Javascript sont plus élevées que jamais, et c&#8217;est loin d&#8217;être fini :
Firefox 4 utilisera le moteur ECMAScript de Flash Player, Tamarin.
Le projet Webkit (le moteur de rendu utilisé par&#160;[&#8230;]]]></description>
			<content:encoded><![CDATA[<p><strong>Opera 9.5</strong> <a href="http://my.opera.com/community/blog/2008/06/10/dear-opera-community">vient tout juste de sortir</a> dans sa version finale, et la <a href="http://www.opera.com/docs/changelogs/windows/950/">liste des changements</a> est impressionnante (vous pouvez également consulter un <a href="http://dev.opera.com/articles/view/opera-9-5-the-next-generation-of-web-s/">article présentant les nouveautés aux développeurs</a>).</p>
<p>La date de sortie de <strong>Firefox 3</strong> a été fixée au <a href="http://developer.mozilla.org/devnews/index.php/2008/06/11/coming-tuesday-june-17th-firefox-3/">17 juin</a>.</p>
<p><strong>Safari 3.1</strong> attend ses nouveaux camarades depuis quelques temps déjà.</p>
<p>Dans quelques jours, les internautes auront à disposition trois navigateurs web <em>d&#8217;excellente qualité</em>.</p>
<h2>Javascript</h2>
<p>Les performances de Javascript sont plus élevées que jamais, et c&#8217;est loin d&#8217;être fini :</p>
<p>Firefox 4 utilisera le moteur ECMAScript de Flash Player, <a href="http://www.mozilla.org/projects/tamarin/">Tamarin</a>.</p>
<p>Le projet Webkit (le moteur de rendu utilisé par Safari) est lui aussi en train de passer à un nouveau moteur Javascript, <a href="http://webkit.org/blog/189/announcing-squirrelfish/">SquirrelFish</a>, qui est extrêmement rapide.</p>
<p>Le nom de code de la prochaine version du navigateur Opera est <a href="http://www.opera.com/products/desktop/next/">Peregrine</a>, &laquo;&nbsp;pèlerin&nbsp;&raquo; en français, et il n&#8217;a pas été choisi au hasard :</p>
<blockquote><p>Le faucon pèlerin, ou Falco peregrinus (Tunstall, 1771), est un rapace robuste de taille moyenne, réputé pour être l’oiseau le plus rapide du monde. Les mesures de la vitesse lors de la phase plongeante de l&#8217;attaque varient généralement entre 130 et 184 km/h. La vitesse maximale mesurée serait de 390 km/h.</p></blockquote>
<h2>CSS</h2>
<p>CSS 2.1 est maintenant correctement supporté dans ces trois navigateurs (Firefox 3 permet <strong>enfin</strong> d&#8217;utiliser la propriété <code>display:inline-block</code> !), et de plus en plus de propriétés CSS 3 (qui n&#8217;est pas une recommandation et continue d&#8217;évoluer) sont d&#8217;ores et déjà implémentées.</p>
<p>Évidemment, Firefox passe avec succès le <a href="http://www.webstandards.org/files/acid2/test.html">test Acid2</a>.</p>
<h2>HTML</h2>
<p>Certains éléments de la future recommandation HTML5 (encore loin d&#8217;être finalisé) commencent réellement à être utilisables.</p>
<p>L&#8217;élément <strong><a href="http://www.whatwg.org/specs/web-apps/current-work/#the-canvas">canvas</a></strong> est en plein explosion. Les exemples suivants utilisent cet élément et fonctionnent sur Firefox 3, Opera 9.5 et Safari 3.1 :</p>
<ul>
<li><a href="http://www.abrahamjoffe.com.au/ben/canvascape/">Canvascape</a>, une démo de moteur 3D de type &laquo;&nbsp;Doom-like&nbsp;&raquo;.</li>
<li><a href="http://blog.nihilogic.dk/2008/05/8-kilobytes-of-mario.html">Un clone de Mario Bros</a></li>
<li><a href="http://blog.nihilogic.dk/2008/05/javascript-super-mario-kart.html">Un clone de Super Mario Kart</a></li>
<li><a href="http://bomomo.com/">Bomomo</a>, une expérimentation très intéressante<a href="http://bomomo.com/"><br />
</a></li>
<li><a href="http://www.pixastic.com/">Pixastic</a>, un outil de retouche photo</li>
<li><a href="http://www.nihilogic.dk/labs/chess/">Un jeu d&#8217;échecs en 3D</a></li>
</ul>
<p>Ce n&#8217;est qu&#8217;un début : <a href="http://blog.vlad1.com/2007/11/26/canvas-3d-gl-power-web-style/">l&#8217;élément canvas3D</a> devrait permettre d&#8217;utiliser l&#8217;accélération 3D des cartes graphiques.</p>
<p>Le support de <strong>SVG</strong> s&#8217;améliore encore, et il est maintenant aussi simple d&#8217;afficher des images vectorielles que d&#8217;afficher une image bitmap (Jpeg, PNG) dans une page. Les nouvelles versions de Safari et d&#8217;Opera permettent d&#8217;utiliser des images SVG dans la propriété CSS background-image.</p>
<p>Des versions expérimentales de Firefox, Opera et Safari permettent d&#8217;utiliser l&#8217;élément <a href="http://www.whatwg.org/specs/web-apps/current-work/#video"><strong>video</strong> défini dans HTML5</a>.</p>
<h2>Et Internet Explorer ?</h2>
<p>Il semblerait que plus personne n&#8217;attende quoi que ce soit de ce navigateur. L&#8217;innovation sur le web, longtemps paralysée, est enfin repartie à plein régime, laissant de côté ce navigateur.</p>
<p>Internet Explorer 6 est toujours en circulation, et la plupart des sites se doivent encore de le prendre en compte aujourd&#8217;hui, mais on est très loin des méthodes de conception utilisées il y a quelques années : créer différentes versions d&#8217;un site par navigateur est non seulement impossible, mais également inadapté au web d&#8217;aujourd&#8217;hui, standard et universel.</p>
<p>Les méthodes de travail ont changé : un site est d&#8217;abord conçu pour les standards, puis adapté pour Internet Explorer, de manière <a href="http://www.lesintegristes.net/2008/04/08/cibler-internet-explorer-dans-une-css-oui-et-sans-hack/">plus</a> ou <a href="http://www.lesintegristes.net/2008/01/08/ie7js-v20-beta/">moins</a> élégante. Des hacks existent pour émuler SVG, l<a href="http://code.google.com/p/explorercanvas/">&#8216;élément canvas </a>et CSS2.1. Les exigences pour ce navigateur ont été globalement revues à la baisse : l&#8217;essentiel est que l&#8217;internaute accède aux informations.</p>
<p>Internet Explorer 8 nous promet de belles choses, mais personne ne l&#8217;attend plus. <a href="http://standblog.org/blog/post/2005/11/06/93114485-promouvoir-le-choix-et-l-innovation"><strong>Le choix et l&#8217;innovation sur le web sont définitivement de retour</strong></a>, et ils s&#8217;en passeront volontiers.</p>
<p>Comment voyez-vous l&#8217;évolution du web dans les douze prochains mois ?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lesintegristes.net/2008/06/12/les-nouveaux-navigateurs-debarquent-attention-ils-mordent/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Cibler Internet Explorer dans une CSS ? Oui, et sans hack.</title>
		<link>http://www.lesintegristes.net/2008/04/08/cibler-internet-explorer-dans-une-css-oui-et-sans-hack/</link>
		<comments>http://www.lesintegristes.net/2008/04/08/cibler-internet-explorer-dans-une-css-oui-et-sans-hack/#comments</comments>
		<pubDate>Tue, 08 Apr 2008 21:01:58 +0000</pubDate>
		<dc:creator>Pierre Bertet</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Internet Explorer]]></category>
		<category><![CDATA[Intégration]]></category>
		<category><![CDATA[Navigateurs]]></category>

		<guid isPermaLink="false">http://www.lesintegristes.net/?p=60</guid>
		<description><![CDATA[La méthode commence à être rodée : pour intégrer un design en CSS, on commence par le faire sur un navigateur &#171;&#160;moderne&#160;&#187;, puis on corrige les différents problèmes rencontrés sur Internet Explorer, surtout dans sa version 6, qui commence à sérieusement à s&#8217;incruster.
Pour cela, il existe plusieurs solutions.
Eviter les embrouilles
Avec la pratique, un certain nombre de réflexes se mettent en place, et on anticipe immédiatement les problèmes.
Un float:left, avec une marge sur sa gauche ? Un display:inline placé dans la même déclaration permet d&#8217;éviter le bug de la double marge. Tous les navigateurs ignorent ce display:inline,&#160;[&#8230;]]]></description>
			<content:encoded><![CDATA[<p>La méthode commence à être rodée : pour intégrer un design en CSS, on commence par le faire sur un navigateur &laquo;&nbsp;moderne&nbsp;&raquo;, puis on corrige les différents problèmes rencontrés sur Internet Explorer, surtout dans sa version 6, qui commence à sérieusement à s&#8217;incruster.</p>
<p>Pour cela, il existe plusieurs solutions.</p>
<h2>Eviter les embrouilles</h2>
<p>Avec la pratique, un certain nombre de réflexes se mettent en place, et on anticipe immédiatement les problèmes.<br />
Un <code class="prettyprint">float:left</code>, avec une marge sur sa gauche ? Un <code class="prettyprint">display:inline</code> placé dans la même déclaration permet d&#8217;éviter le <a href="http://www.positioniseverything.net/explorer/doubled-margin.html">bug de la double marge</a>. Tous les navigateurs ignorent ce <code class="prettyprint">display:inline</code>, car la propriété <code class="prettyprint">float</code> est prioritaire. C&#8217;est toujours ça de pris.</p>
<p>Malheureusement ça ne suffit pas toujours, et il n&#8217;y a parfois d&#8217;autre solution que de déclarer une propriété spécialement pour IE.</p>
<h2>Le bon vieux hack</h2>
<p>Allons-y joyeusement, il faut résoudre un bug sur IE6, et les hacks semblent pratiques et simples à utiliser.<br />
Allez, au hasard&#8230; Le sélecteur d&#8217;enfant : <code class="prettyprint">html &gt; body</code></p>
<p>IE6 ne comprend pas le sélecteur &laquo;&nbsp;&gt;&nbsp;&raquo;. Il donc est possible de profiter de ce bug pour cibler IE6, de cette façon :</p>
<pre><code class="prettyprint">.my_element{margin-left:5px;} /* Cette déclaration est interprétée par tous les navigateurs */
html &gt; body .my_element{margin-left:8px;} /* ... Puis est écrasée par la suivante, sauf pour IE6 qui ne comprendra pas cette déclaration. */</code></pre>
<p>C&#8217;est pratique. Seulement IE7 ne corrige pas le bug pour lequel nous devions corriger la propriété margin. Pour le sélecteur d&#8217;enfants, pas de problème, IE7 l&#8217;interprète. Logiquement, le bug réapparaît.</p>
<p>En suivant la même méthode, il faut donc trouver un nouveau bug de sélecteur dans IE7, et revoir la CSS. Il arrive également que IE7 ne doive pas recevoir la même correction. Il faut donc trouver un bug qui s&#8217;applique à IE7 <strong>mais pas</strong> à IE6.<br />
Et comment être sûr de ne cibler qu&#8217;IE6 ? Un autre navigateur ne prenant pas en charge ce sélecteur pourrait exister.</p>
<p>Il nous faut une autre solution, permettant de cibler efficacement Internet Explorer.</p>
<h2>Les commentaires conditionnels</h2>
<p>Microsoft a ajouté quelque chose de formidable à Internet Explorer : les commentaires conditionnels.</p>
<p>Ils permettent de ne servir un contenu qu&#8217;à Internet Explorer en général, ou à une de ses versions, en utilisant une syntaxe particulière à l&#8217;intérieur de commentaires HTML.</p>
<p>Ils n&#8217;ont certainement pas être prévus pour ça au départ, mais ils sont aujourd&#8217;hui principalement utilisés pour corriger les bugs de ce navigateur.</p>
<p>Il est donc possible d&#8217;utiliser le code suivant :</p>
<pre><code class="prettyprint">&lt;!--[if IE 6]&gt; &lt;link rel="stylesheet" href="styles/internet-explorer-6.css" type="text/css" media="screen" /&gt; &lt;![endif]--&gt;
</code></pre>
<p>Pour un navigateur suivant la <a href="http://www.w3.org/TR/html4/intro/sgmltut.html#h-3.2.4">spécification HTML4.01</a>, la balise <code class="prettyprint">&lt;link&gt;</code> est simplement ignorée car elle est placée dans un commentaire, mais pas pour Internet Explorer. Il va lire ce commentaire, et si une condition est déclarée, et qu&#8217;elle correspond au navigateur utilisé, le code sera tout de même interprété.</p>
<p>Cette solution est fiable, car il n&#8217;existe aucune raison pour qu&#8217;un autre navigateur interprète, dans le passé ou l&#8217;avenir, un commentaire de ce type.</p>
<p>Il est donc possible de créer une CSS pour IE6, une autre pour IE7 au cas où, et allez, encore une pour les versions d&#8217;IE inférieures à 8, histoire de cibler toutes les version passées de ce vieil ami.</p>
<p>Nous voici donc avec notre feuille de style, et une, deux voire trois nouvelles pour Internet Explorer. Si les CSS du site sont réparties sur plusieurs fichiers, il va falloir créer autant de nouveaux ensembles de fichiers &laquo;&nbsp;IE&nbsp;&raquo;, ou les utiliser de manière globale en prenant le risque d&#8217;appliquer à certaines pages des styles qui ne leur sont pas destinés.</p>
<p>Avec le temps, cette solution est beaucoup moins pratique : il faut jongler avec plusieurs fichiers, se souvenir que la déclaration de la ligne 310 du fichier &laquo;&nbsp;home.css&nbsp;&raquo; est corrigée à la ligne 14 du fichier &laquo;&nbsp;internet-explorer-6.css&nbsp;&raquo;, mais aussi à la ligne 8 du fichier &laquo;&nbsp;internet-explorer-7.css&nbsp;&raquo;.</p>
<p>Il se pourrait aussi qu&#8217;un jour cette correction provoque un effet indésirable, placée dans un certain contexte. Il faudrait alors se souvenir que cet élément a été corrigé dans l&#8217;autre CSS, et que cette correction peut être la cause du dysfonctionnement.</p>
<p>Mais existe-t-il une méthode fiable <strong>et</strong> pratique ? P&#8217;t'êt&#8217; bien, ouais.</p>
<h2>Les commentaires conditionnels, en plus malin</h2>
<p>Il s&#8217;agit avec cette technique d&#8217;utiliser les commentaires conditionnels non pas pour appeler une feuille de style, mais pour entourer la page d&#8217;un conteneur qui prendra comme attribut &laquo;&nbsp;id&nbsp;&raquo; <code>IE6</code>, <code>IE7</code>, <code>IE</code> ou encore <code>NOTIE</code>.</p>
<p>Cet identifiant permettra de cibler précisément une version d&#8217;Internet Explorer, dans une CSS &laquo;&nbsp;normale&nbsp;&raquo;.</p>
<p>Le code se présente sous cette forme :</p>
<pre><code class="prettyprint">&lt;body&gt;
&lt;!--[if IE 6]&gt;&lt;div id="IE6"&gt;&lt;![endif]--&gt;</code></pre>
<p>Et avant la balise de fermeture <code class="prettyprint">&lt;/body&gt;</code> :</p>
<pre><code class="prettyprint">&lt;!--[if IE 6]&gt;&lt;/div&gt;&lt;![endif]--&gt;
&lt;/body&gt;</code></pre>
<p>Pour les navigateurs &laquo;&nbsp;normaux&nbsp;&raquo; et un outil de validation html, il s&#8217;agit de commentaires html tout à fait classiques, et sont ignorés.</p>
<p>De cette manière, il est aussi possible d&#8217;ajouter le support d&#8217;IE, en ajoutant une balise d&#8217;ouverture  <code class="prettyprint">&lt;div id="IE7"&gt;</code> en haut et en modifiant la condition du bas pour cibler IE6 et IE7 à la fois.</p>
<p>Nous pouvons aussi utiliser des conditions de type &laquo;&nbsp;n&#8217;est pas&nbsp;&raquo;, ce qui permet de cibler tous les navigateurs sauf IE.</p>
<p>Voici le code modifié :</p>
<pre><code class="prettyprint">&lt;body&gt;
&lt;!--[if IE 6]&gt;&lt;div id="IE6"&gt;&lt;![endif]--&gt;
&lt;!--[if IE 7]&gt;&lt;div id="IE7"&gt;&lt;![endif]--&gt;
&lt;!--[if (IE) &amp; (!IE 6) &amp; (!IE 7)]&gt;&lt;div id="IE"&gt;&lt;![endif]--&gt; &lt;!-- Pour les anciennes et prochaines versions d'Internet Explorer (autres que 6 et 7) --&gt;
&lt;!--[if !IE]&gt;--&gt;&lt;div id="NOTIE"&gt;&lt;!--&lt;![endif]--&gt; &lt;!-- Le commentaire est fermé, puis rouvert --&gt;

&lt;!-- Structure HTML de la page --&gt;

&lt;/div&gt; &lt;!-- Une simple fermeture de balise à la fin, car tous les navigateurs sont ciblés. --&gt;
&lt;/body&gt;
</code></pre>
<p>Il suffit ensuite d&#8217;utiliser ces sélecteurs de la même manière qu&#8217;un hack, mais plus clairement, plus facilement et surtout de manière <strong>fiable</strong> :</p>
<pre><code class="prettyprint">.mon_element{margin-left:2px;}
#IE .mon_element{margin-left:3px;}
#IE6 .mon_element{margin-left:4px;}
#IE7 .mon_element{margin-left:5px;}
#NOTIE .mon_element{margin-left:6px;}</code></pre>
<p>Evidemment l&#8217;exemple est stupide, puisqu&#8217;il n&#8217;y a aucune raison de cibler tous ces éléments à la fois.</p>
<p>Les avantages sont nombreux :</p>
<ul>
<li>C&#8217;est <strong>fiable</strong> : une nouvelle version d&#8217;Internet Explorer sera considérée comme &laquo;&nbsp;standard&nbsp;&raquo; (mais attention à l&#8217;utilisation de #NOTIE, qui ne sera vraisemblablement pas reconnue par les futures version d&#8217;Internet Explorer)</li>
<li>Une seule CSS à maintenir</li>
<li>Le code HTML et CSS reste parfaitement valide</li>
<li>La déclaration a du sens, il n&#8217;est pas utile de commenter ceci : <code>#IE6 .mon_element{margin:-3px;}</code></li>
<li>Lors de la sortie d&#8217;une nouvelle version d&#8217;IE, il suffit de lister les bugs qui n&#8217;ont pas été corrigés, et d&#8217;ajouter une nouvelle déclaration (IE8) pour ceux-ci.</li>
</ul>
<p>A vous ensuite de composer avec ces différents exemples pour créer une structure adaptée à vos besoins : l&#8217;utilisation des éléments <code class="prettyprint">&lt;div id="IE6"&gt;</code> et <code class="prettyprint">&lt;div id="IE7"&gt;</code> devraient suffire à la majorité des cas.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lesintegristes.net/2008/04/08/cibler-internet-explorer-dans-une-css-oui-et-sans-hack/feed/</wfw:commentRss>
		<slash:comments>28</slash:comments>
		</item>
		<item>
		<title>Les formulaires d&#8217;inscription doivent disparaître (traduction)</title>
		<link>http://www.lesintegristes.net/2008/03/25/les-formulaires-d-inscription-doivent-disparaitre-traduction/</link>
		<comments>http://www.lesintegristes.net/2008/03/25/les-formulaires-d-inscription-doivent-disparaitre-traduction/#comments</comments>
		<pubDate>Tue, 25 Mar 2008 09:46:51 +0000</pubDate>
		<dc:creator>Pierre Bertet</dc:creator>
				<category><![CDATA[Accessibilité]]></category>
		<category><![CDATA[Ergonomie]]></category>
		<category><![CDATA[Traduction]]></category>

		<guid isPermaLink="false">http://www.lesintegristes.net/2008/03/25/traduction-les-formulaires-denregistrement-devraient-disparaitre-sign-up-forms-must-die/</guid>
		<description><![CDATA[Voici la traduction d&#8217;un article publié sur A List Apart par Luke Wroblewski, dont le titre original est &#171; Sign Up Forms Must Die &#187;.
Il y est question de différentes solutions regroupées sous l&#8217;appellation &#171;&#160;engagement progressif&#160;&#187;, permettant à vos visiteurs de comprendre et d&#8217;utiliser votre service avant (ou pendant) l&#8217;inscription, en évitant autant que possible le classique et indigeste formulaire d&#8217;inscription.
Les formulaires d&#8217;inscription doivent disparaître
Nous sommes heureux de vous présenter un extrait du chapitre 13 du prochain livre de Luke Wroblewski : Web Form Design: Filling in the Blanks (Rosenfeld Media, 2008). — Ed.
Je vais simplement&#160;[&#8230;]]]></description>
			<content:encoded><![CDATA[<p>Voici la traduction d&#8217;un article publié sur <a href="http://www.alistapart.com/">A List Apart</a> par <a href="http://www.lukew.com/">Luke Wroblewski</a>, dont le titre original est &laquo; <a href="http://www.alistapart.com/articles/signupforms">Sign Up Forms Must Die</a> &raquo;.</p>
<p>Il y est question de différentes solutions regroupées sous l&#8217;appellation &laquo;&nbsp;engagement progressif&nbsp;&raquo;, permettant à vos visiteurs de comprendre et d&#8217;utiliser votre service avant (ou pendant) l&#8217;inscription, en évitant autant que possible le classique et indigeste formulaire d&#8217;inscription.</p>
<h3>Les formulaires d&#8217;inscription doivent disparaître</h3>
<p><em>Nous sommes heureux de vous présenter un extrait du chapitre 13 du prochain livre de Luke Wroblewski : <a href="http://www.rosenfeldmedia.com/books/webforms/"><cite>Web Form Design: Filling in the Blanks</cite></a> (Rosenfeld Media, 2008). — Ed.</em></p>
<p>Je vais simplement dire ceci : les formulaires d&#8217;inscription doivent mourir. Dans l&#8217;introduction de ce livre, je décris le processus de découverte ou de recommandation d&#8217;un service web. Vous arrivez sur le site, empressé d&#8217;essayer ce nouveau service, et que trouvez-vous en guise d&#8217;accueil ? Un formulaire d&#8217;inscription.</p>
<p>Nous pouvons faire mieux. En fait, je pense que l&#8217;on peut amener des personnes à utiliser un service web en leur expliquant comment il fonctionne, et pourquoi ils devraient l&#8217;utiliser. Je pense également que nous pouvons y parvenir sans leur faire remplir un formulaire dès la première étape.</p>
<p>Mais avant d&#8217;aborder le potentiel de l&#8217;engagement progressif (la route vers un enregistrement &laquo;&nbsp;imperceptible&nbsp;&raquo;), regardons comment fonctionne le processus d&#8217;engagement classique pour un service en ligne. 2007 fut une grande année pour la vidéo en ligne. Nous pouvons supposer que nombre de personnes se connectent aujourd&#8217;hui pour publier une de leurs vidéos. Peut-être ont-ils entendu que <a href="http://video.google.com/">Google Video</a> était un bon service pour y parvenir. Dès l&#8217;arrivée sur le site, ils trouvent un lien pour partager leurs vidéos, et que se passe-t-il ensuite ? Le formulaire illustré sur la figure 13.1. apparaît.</p>
<p><img src="http://www.lesintegristes.net/wp-content/uploads/2008/03/13-1.gif" alt="Les utilisateurs potentiels doivent remplir un formulaire d'enregistrement avant de commencer à utiliser Google Video." /><br />
Figure 13.1<br />
Un formulaire d&#8217;enregistrement accueille les nouveaux clients de Google Vidéo.</p>
<p>Vous devez leur donner votre adresse email, choisir un mot de passe, indiquer votre nom, votre adresse, déchiffrer cet étrange mot, accepter les conditions d&#8217;utilisation et enfin, vous verrez ce qu&#8217;il y a après ce formulaire.</p>
<p>Contrastons maintenant cette approche avec celle d&#8217;un autre service vidéo en ligne : <a href="http://jumpcut.com/">Jumpcut</a>. Sur la page d&#8217;accueil, les actions principales sont &laquo;&nbsp;Make a movie&nbsp;&raquo; (Créer un film) et &laquo;&nbsp;Try a demo&nbsp;&raquo; (Démonstration), comme illustré sur la figure 13.2 (Ndt : la page a changé : un bouton &laquo;&nbsp;Register&nbsp;&raquo; -Créer un compte-, dirigeant sur l&#8217;identification ou la création d&#8217;un compte Yahoo, a pris place au centre de la page&#8230;). Jumpcut vous explique immédiatement comment fonctionne leur service, et en quoi il peut vous intéresser. Allons-y.</p>
<p>Sélectionner &laquo;&nbsp;Make a movie&nbsp;&raquo; (Créer un film) affichera un simple champ permettant saisir le titre de votre vidéo, et quelques options que vous pouvez utiliser pour envoyer les différents fichiers utilisés pour la création de votre vidéo. Choisir &laquo;&nbsp;Upload&nbsp;&raquo; (Téléchargement) dans cette liste vous permettra d&#8217;ajouter des images, du son et de la vidéo depuis votre ordinateur. Ceci fait, vous êtes dirigé vers l&#8217;outil de création vidéo en ligne de Jumpcut. Vous pouvez modifier votre vidéo, ajouter des styles, coordonner vos sons, vidéos, images, etc.</p>
<p><img src="http://www.lesintegristes.net/wp-content/uploads/2008/03/13-2_jumpcut_home.jpg" alt="Jumpcut encourage les utilisateurs à créer un film dans leur navigateur." /><br />
<img src="http://www.lesintegristes.net/wp-content/uploads/2008/03/13-2_jumpcut_step3.jpg" alt="Jumpcut, étape 3 : Choisir un style pour votre film." /><br />
Figure 13.2<br />
Le processus d&#8217;ajout de vidéo à Jumpcut vous présente le service que propose le site : l&#8217;édition vidéo en ligne.</p>
<p>Jusqu&#8217;à présent, aucun formulaire. Ce n&#8217;est qu&#8217;au moment où vous voudrez publier ou partager votre film que Jumpcut vous demandera votre nom et votre email, ainsi vous et les autres utilisateurs pourrez accéder au film que vous venez de créer. A travers ce processus, vous avez vu ce que permettait de faire Jumpcut, et cela sans avoir à passer par un formulaire d&#8217;inscription. Il s&#8217;agit d&#8217;un engagement progressif.</p>
<p>Voyons un autre exemple. <a href="http://www.geni.com/">Geni</a> est un service web permettant à quiconque de créer un arbre généalogique et de le partager avec ses amis ou sa famille. Quelle est la première chose que les clients potentiels doivent faire en arrivant sur Geni ? Remplir un formulaire d&#8217;inscription ? Non, ils créent un arbre généalogique. Après tout, c&#8217;est ce pourquoi Geni est fait.</p>
<p>La page d&#8217;accueil de Geni (Figure 13.3) indique clairement ce que propose le site. On commence par créer une famille en entrant son nom et son adresse email. Ensuite, vous pouvez entrer vos parents, leurs frères et sœurs ou les vôtres, et en quelques instants, vous obtenez un petit arbre généalogique. Pendant ce temps, Geni vous a envoyé un email contenant votre nom d&#8217;utilisateur et votre mot de passe : vous pourrez ainsi revenir sur votre arbre généalogique quand vous le désirerez.</p>
<p><img src="http://www.lesintegristes.net/wp-content/uploads/2008/03/13-3_geni1.gif" alt="Page d'accueil de Geni : créer un arbre généalogique." /><br />
<img src="http://www.lesintegristes.net/wp-content/uploads/2008/03/13-3_geni2.gif" alt="Geni: Ajouter vos parents à votre arbre généalogique." /><br />
Figure 13.3<br />
La création d&#8217;un arbre généalogique sur Geni ne contient pas de formulaire d&#8217;enregistrement explicite et informe immédiatement les utilisateurs.</p>
<p>Encore une fois, au travers du processus d&#8217;engagement progressif, vous avez appris ce que proposait un service web, et ceci sans inscription explicite vous obligeant à fournir une certaine quantité d&#8217;informations. Dans le cas de Geni, l&#8217;approche de l&#8217;engagement progressif leur a donné cinq millions d&#8217;utilisateurs en cinq mois. Pas mal.</p>
<p>Un autre exemple d&#8217;engagement progressif nous est proposé par <a href="http://www.tripit.com/">TripIt</a> : ce service web propose aux utilisateurs d&#8217;assembler un itinéraire de voyage complet, comprenant la météo et les feuilles de route, en utilisant uniquement leurs emails de confirmations de vols, d&#8217;hôtels et de location de voiture.<br />
La première étape pour commencer à utiliser ce service est d&#8217;envoyer à TripIt un email de confirmation d&#8217;un voyage passé ou à venir. TripIt vous renverra un email vous permettant d&#8217;accéder à un itinéraire de voyage personnel créé automatiquement (Figure 13.4).</p>
<p><img src="http://www.lesintegristes.net/wp-content/uploads/2008/03/13-4_tripit1.gif" alt="TripIt: La page d'accueil vous explique rapidement comment fonctionne le service et vous encourage à l'utiliser." /><br />
<img src="http://www.lesintegristes.net/wp-content/uploads/2008/03/13-4_tripit2.gif" alt="TripIt: Commencez par envoyer à TripIt votre projet de voyage." /><br />
Figure 13.4<br />
Pour commencer à utiliser TripIt, il faut lui renvoyer ses emails de confirmation, et pas s&#8217;inscrire en utilisant un formulaire.</p>
<p>Encore une fois, la première étape pour utiliser TripIt n&#8217;est pas de s&#8217;inscrire en passant par un formulaire. A la place, vous découvrez le service tout en l&#8217;utilisant. TripIt récupère votre nom et votre email à l&#8217;aide des emails que vous renvoyez au service. Ensuite, si vous voulez modifier votre nom, votre email, ou créer un mot de passe pour accéder au site, vous pouvez le faire. Il y a de grandes chances pour que vous le fassiez, maintenant que vous savez en quoi consiste ce service et ce qu&#8217;il peut vous apporter.</p>
<p>En étudiant si l&#8217;engagement progressif peut être utilisé sur votre service web, il est important de penser à la façon dont une série d&#8217;interactions pourrait expliquer à vos clients potentiels comment ils peuvent utiliser le service et ce qu&#8217;il peut leur apporter. L&#8217;engagement progressif ne consiste pas simplement à répartir les champs de votre formulaire d&#8217;inscription en plusieurs pages séparées.</p>
<p>Je salue volontiers la tentative de <a href="http://www.fidelity.com/myplan">Fidelity’s myplan</a> de simplifier leur formulaire de planification de placements financiers (Figure 13.5), mais je ne suis pas sûr que séparer leurs différents champs de saisies en plusieurs pages sous forme de curseurs glissants soit le meilleur moyen d&#8217;atteindre leur but, qui est d&#8217;expliquer aux visiteurs ce que Fidelity peut faire pour eux.</p>
<p><img src="http://www.lesintegristes.net/wp-content/uploads/2008/03/13-5_forms_fidelity_wizard1.gif" alt="Fidelity: Quel âge avez-vous ?" /><br />
<img src="http://www.lesintegristes.net/wp-content/uploads/2008/03/13-5_forms_fidelity_wizard2.gif" alt="Fidelity: Quel est votre style d'investissement ? (l'utilisateur positionne le curseur sur la barre indiquant le niveau de sécurité des placements.)" /><br />
Figure 13.5<br />
Le formulaire de Fidelity’s myplan divise une série de champs de saisie en plusieurs curseurs glissants, présentés l&#8217;un après l&#8217;autre.</p>
<h4><strong>Bonnes pratiques</strong></h4>
<ul>
<li>En étudiant la première expérience d&#8217;un utilisateur sur votre site web, pensez à la manière dont vous pouvez éviter l&#8217;utilisation d&#8217;un formulaire d&#8217;inscription en faveur d&#8217;un engagement progressif.</li>
<li>Si vous optez pour une solution d&#8217;engagement progressif, assurez-vous qu&#8217;elle apporte à vos clients potentiels des informations sur le fonctionnement de votre service, et ce qu&#8217;il peut leur apporter.</li>
<li>Si vous choisissez d&#8217;auto-générer les comptes de vos clients potentiels, assurez-vous qu&#8217;ils disposent d&#8217;un moyen clair d&#8217;accéder à leur compte. Il y a des chances pour que les utilisateurs ignorent ou ne voient pas votre email confirmation indiquant la création de leur compte, et qu&#8217;ils ne sachent pas exactement s&#8217;ils ont un compte ou pas.</li>
<li>Evitez les solutions d&#8217;engagement progressif qui répartissent simplement les différents champs de votre formulaire d&#8217;inscription sur plusieurs pages. Il y a de fortes chances que cela en réduise l&#8217;efficacité, sans pour autant l&#8217;alléger.</li>
</ul>
<p>Translated with the permission of <a href="http://www.alistapart.com/">A List Apart Magazine</a> and the author[s].”</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lesintegristes.net/2008/03/25/les-formulaires-d-inscription-doivent-disparaitre-traduction/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>Internet Explorer 8 Beta 1 !</title>
		<link>http://www.lesintegristes.net/2008/03/06/internet-explorer-8-beta-1/</link>
		<comments>http://www.lesintegristes.net/2008/03/06/internet-explorer-8-beta-1/#comments</comments>
		<pubDate>Thu, 06 Mar 2008 01:59:35 +0000</pubDate>
		<dc:creator>Pierre Bertet</dc:creator>
				<category><![CDATA[Actualité]]></category>
		<category><![CDATA[Internet Explorer]]></category>

		<guid isPermaLink="false">http://www.lesintegristes.net/2008/03/06/internet-explorer-8-beta-1/</guid>
		<description><![CDATA[Microsoft vient de publier la première beta de la prochaine version de son navigateur, Internet Explorer 8.
Un article sur le blog dédié nous en liste les différentes améliorations :

La version définitive apportera un support complet de CSS 2.1.
Ils ont contribué à la création de plus de 700 tests en collaboration avec le Groupe de travail CSS du W3C, publiés sous licence BSD. Selon l&#8217;équipe, la spécification CSS est bien conçue mais pas suffisante, car ambigüe sur de nombreux points. Une suite de tests devrait permettre aux éditeurs de mieux les interpréter, en s&#8217;appuyant sur des tests pouvant&#160;[&#8230;]]]></description>
			<content:encoded><![CDATA[<p>Microsoft vient de publier la première beta de la prochaine version de son navigateur, <a href="http://www.microsoft.com/windows/products/winfamily/ie/ie8/default.mspx">Internet Explorer 8</a>.</p>
<p><a href="http://blogs.msdn.com/ie/archive/2008/03/05/internet-explorer-8-beta-1-for-developers-now-available.aspx">Un article sur le blog dédié</a> nous en liste les différentes améliorations :</p>
<ol>
<li>La version définitive apportera un <strong>support complet de CSS 2.1</strong>.</li>
<li><strong>Ils ont contribué à la création de <a href="http://samples.msdn.microsoft.com/csstestpages/default.htm">plus de 700 tests en collaboration avec le Groupe de travail CSS du W3C</a></strong>, publiés sous <a href="http://fr.wikipedia.org/wiki/Licence_BSD">licence BSD</a>. Selon l&#8217;équipe, la spécification CSS est bien conçue mais pas suffisante, car ambigüe sur de nombreux points. Une suite de tests devrait permettre aux éditeurs de mieux les interpréter, en s&#8217;appuyant sur des tests pouvant être suivis par l&#8217;ensemble des éditeurs.</li>
<li><strong>De meilleures performances pour les scripts.</strong> Il s&#8217;agit d&#8217;un gros enjeu pour les navigateurs ( <a href="http://ajaxian.com/archives/firefox-3-performance-numbers">Firefox 3 sera lui aussi bien plus rapide</a>, et Safari se présente d&#8217;emblée comme <q><a href="http://www.apple.com/fr/macosx/features/safari.html">[Le] navigateur web [...] le plus rapide de la planète</a>.</q> ) : les bibliothèques Javascript permettent aujourd&#8217;hui de créer de véritables applications en ligne, bien plus complexes et gourmandes qu&#8217;il y a quelques années. Le navigateur est allé bien au-delà de son rôle principal : il est devenu une plate-forme de choix pour de nombreuses applications innovantes.</li>
<li>Un début de support d&#8217;<strong>HTML5</strong>.</li>
<li>La création prochaine d&#8217;<strong>outils pour débugger les CSS et le Javascript</strong>.</li>
<li>Une fonctionnalité appelée &laquo;&nbsp;<strong>Activities</strong>&nbsp;&raquo; apparaît. Elle permet de mieux intégrer les différents services web au navigateur, comme sélectionner du texte sur une page et l&#8217;envoyer vers son blog, ou rechercher directement une adresse sur un service de cartes en ligne. Voici une excellente occasion d&#8217;ajouter un support des microformats, mais <a href="http://blogs.msdn.com/ie/archive/2008/03/05/internet-explorer-8-beta-1-for-developers-now-available.aspx#8056045">en fait non</a>. C&#8217;est une bonne opportunité pour Microsoft d&#8217;amener plus d&#8217;utilisateurs vers ses différents services, bien que <a href="http://ie.microsoft.com/activities/en-en/default.aspx">des concurrents soient également présents</a>, comme <del>Facebook</del> <del>Yahoo</del> eBay. Non, pas Google.</li>
<li>Une autre fonctionnalité a été intégrée, appelée &laquo;&nbsp;<strong>WebSlices</strong>&laquo;&nbsp;. Globalement, ça ressemble aux <a href="http://www.apple.com/fr/macosx/features/safari.html">Web Clips de Safari</a>, mais ne nous y laissons pas prendre : ce sont les WebSlices, d&#8217;Internet Explorer.</li>
</ul>
<p>Le <a href="http://pg55kw.bay.livefilestore.com/y1pUDkAicOt_vyC5sKeiTisk6iDLVzIz06FOco6V23vED02jeElqnnRvSyAMZ5Kn3ji4l6uCP4x96Mk88_Bx4C1XA/iAcid2.PNG">test Acid2 ne passe pas tout à fait</a> s&#8217;il est effectué sur un autre domaine que <em>www.webstandards.org</em>, <a href="http://blogs.msdn.com/ie/default.aspx">pour une raison de sécurité</a>. Ce devrait être réglé dans la prochaine beta.</p>
<p>Vous pourrez le télécharger ici : <a href="http://www.microsoft.com/windows/products/winfamily/ie/ie8/default.mspx">http://www.microsoft.com/windows/products/winfamily/ie/ie8/default.mspx</a><br />
Tristan Nitot en parle : <a href="http://standblog.org/blog/post/2008/03/05/Internet-Explorer-8-et-les-standards-le-retour">http://standblog.org/blog/post/2008/03/05/Internet-Explorer-8-et-les-standards-le-retour</a></p>
<p><a href="http://blogs.msdn.com/ie/archive/2008/03/03/microsoft-s-interoperability-principles-and-ie8.aspx">Peu de temps après l&#8217;abandon</a> in extremis de solutions permettant d&#8217;activer le moteur de rendu &laquo;&nbsp;moderne&nbsp;&raquo; pour finalement l&#8217;activer par défaut (il faudra à l&#8217;inverse demander explicitement à passer en &laquo;&nbsp;mode compatible&nbsp;&raquo;), Microsoft semble plus que jamais impliqué dans une nouvelle guerre des navigateurs, mais du côté des standards cette fois.</p>
<p>Qu&#8217;en pensez-vous ?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lesintegristes.net/2008/03/06/internet-explorer-8-beta-1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Des problèmes avec Firebug depuis Firefox 2.0.0.12 ?</title>
		<link>http://www.lesintegristes.net/2008/02/13/des-problemes-avec-firebug-depuis-firefox-20012/</link>
		<comments>http://www.lesintegristes.net/2008/02/13/des-problemes-avec-firebug-depuis-firefox-20012/#comments</comments>
		<pubDate>Wed, 13 Feb 2008 22:43:18 +0000</pubDate>
		<dc:creator>Pierre Bertet</dc:creator>
				<category><![CDATA[Intégration]]></category>
		<category><![CDATA[Outils]]></category>

		<guid isPermaLink="false">http://www.lesintegristes.net/2008/02/13/des-problemes-avec-firebug-depuis-firefox-20012/</guid>
		<description><![CDATA[Depuis la dernière mise à jour de Firefox (2.0.0.12), l’onglet &#171;&#160;HTML&#160;&#187; de Firebug n&#8217;affiche plus le style des liens.
Firebug 1.1 beta n&#8217;a pas ce problème : vous trouverez cette version sur le site du projet Fireclipse, dont le but est d&#8217;apporter une interaction entre Firebug et Eclipse.
Diverses améliorations et corrections de bugs ont été apportées au passage à notre très chère extension, mais il ne s&#8217;agit pas d&#8217;un fork : la version 1.1 finale sera bien distribuée sur getfirebug.com, comme l&#8217;indique un billet sur le blog du site.
Fireclipse regroupe les éléments suivants :

L&#8217;extension Firebug patchée
Un&#160;[&#8230;]]]></description>
			<content:encoded><![CDATA[<p>Depuis la dernière mise à jour de Firefox (2.0.0.12), l’onglet &laquo;&nbsp;HTML&nbsp;&raquo; de Firebug n&#8217;affiche plus le style des liens.</p>
<p>Firebug 1.1 beta n&#8217;a pas ce problème : vous trouverez cette version sur le site du projet <a href="http://fireclipse.xucia.com/">Fireclipse</a>, dont le but est d&#8217;apporter une interaction entre <a href="http://www.getfirebug.com/">Firebug</a> et <a href="http://www.eclipse.org/">Eclipse</a>.<br />
Diverses améliorations et corrections de bugs ont été apportées au passage à notre très chère extension, mais il ne s&#8217;agit pas d&#8217;un <a href="http://fr.wikipedia.org/wiki/Fork" rel="help">fork</a> : la version 1.1 finale sera bien distribuée sur getfirebug.com, comme l&#8217;indique <a href="http://www.getfirebug.com/blog/2008/02/05/firebug-11-moving-to-getfirebugcom/">un billet sur le blog du site</a>.</p>
<p>Fireclipse regroupe les éléments suivants :</p>
<ol>
<li>L&#8217;extension Firebug patchée</li>
<li>Un plugin Eclipse</li>
<li>Une extension à Firebug, lui permettant d&#8217;interagir avec Eclipse</li>
</ol>
<p>Ainsi, l&#8217;extension Firebug améliorée est totalement indépendante, et peut être installée seule.</p>
<p>Voici la liste des modifications apportées :</p>
<blockquote cite="http://fireclipse.xucia.com/#Downloads" lang="en">
<ul>
<li>eval() debugging</li>
<li>External editor interface</li>
<li>Browser-generated event handler debugging</li>
<li>Executable lines marked with green line numbers</li>
<li>User-controlled naming of eval() buffers</li>
<li>Stack side panel on &laquo;&nbsp;Script&nbsp;&raquo; panel for callstack</li>
<li>Supports Firefox 3</li>
<li>&laquo;&nbsp;Better&nbsp;&raquo; debugging icons</li>
<li>CSS errors report against source lines</li>
<li>Bug fixes (incl. issues 8, 69, 218, 230, 239, 249, 269, 314, 321, 345)</li>
<li>Internal firebug debug output</li>
</ul>
</blockquote>
<p>Je profite du sujet pour mentionner l&#8217;extension <a href="http://developer.yahoo.com/yslow/">YSlow pour Firebug</a> proposée par Yahoo!, permettant d&#8217;analyser vos pages (poids des éléments, nombre de requêtes, &#8230;) puis de consulter diverses optimisations afin d&#8217;en accélérer le rendu. Très pratique !</p>
<p>Télécharger Fireclipse / Firebug 1.1b : <a href="http://fireclipse.xucia.com/#Downloads">http://fireclipse.xucia.com/#Downloads</a><br />
Télécharger YSlow : <a href="https://addons.mozilla.org/en-US/firefox/addon/5369">https://addons.mozilla.org/en-US/firefox/addon/5369</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lesintegristes.net/2008/02/13/des-problemes-avec-firebug-depuis-firefox-20012/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Webkit supporte document.query&#173;Selector&#173;All();</title>
		<link>http://www.lesintegristes.net/2008/02/10/webkit-supporte-documentqueryselectorall/</link>
		<comments>http://www.lesintegristes.net/2008/02/10/webkit-supporte-documentqueryselectorall/#comments</comments>
		<pubDate>Sun, 10 Feb 2008 12:00:33 +0000</pubDate>
		<dc:creator>Pierre Bertet</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.lesintegristes.net/2008/02/10/webkit-supporte-documentqueryselectorall/</guid>
		<description><![CDATA[Le seul moyen de sélectionner des éléments en Javascript est d&#8217;utiliser les méthodes DOM classiques : document.getElementById(), getElementsByTagName(), nexSibling(), etc.
C&#8217;est assez fastidieux, et n&#8217;incite pas vraiment les développeurs à concevoir leurs scripts de manière non-intrusive.
Voilà pourquoi plusieurs librairies Javascript ont ajouté une couche supplémentaire : il suffit de passer une chaîne de sélecteur CSS, et cette chaîne est retranscrite en méthodes DOM classique par le moteur de la librairie pour retourner un tableau d&#8217;éléments correspondant à ce sélecteur. Evidemment, toutes ces opérations ont un coût en termes de performances.
Selectors API propose de régler ce problème : il&#160;[&#8230;]]]></description>
			<content:encoded><![CDATA[<p>Le seul moyen de sélectionner des éléments en Javascript est d&#8217;utiliser les méthodes DOM classiques : <code class="prettyprint">document.getElementById()</code>, <code class="prettyprint">getElementsByTagName()</code>, <code class="prettyprint">nexSibling()</code>, etc.</p>
<p>C&#8217;est assez fastidieux, et n&#8217;incite pas vraiment les développeurs à concevoir leurs scripts de manière non-intrusive.</p>
<p>Voilà pourquoi plusieurs librairies Javascript ont ajouté une couche supplémentaire : il suffit de passer une chaîne de sélecteur CSS, et cette chaîne est retranscrite en méthodes DOM classique par le moteur de la librairie pour retourner un tableau d&#8217;éléments correspondant à ce sélecteur. Evidemment, toutes ces opérations ont un coût en termes de performances.</p>
<p><a href="http://www.w3.org/TR/selectors-api/#documentselector">Selectors API</a> propose de régler ce problème : il sera tout simplement possible de passer une chaîne CSS à la méthode <code class="prettyprint">document.querySelectorAll();</code>, qui renverra un tableau d&#8217;éléments correspondant à la sélection. Bien entendu, cette méthode sera exécutée par le navigateur, ce qui est beaucoup plus intéressant.</p>
<p>La dernière version de Webkit vient d&#8217;intégrer cette méthode, et les résultats sont très concluants. Pour le démontrer, ils ont utilisé le benchmark <a href="http://mootools.net/slickspeed/">slickspeed</a> du projet <a href="http://mootools.net/slickspeed/">mootools</a>, permettant justement de comparer les performances des sélecteurs CSS pour chaque bibliothèque : http://webkit.org/perf/slickspeed/ .</p>
<p>Les différentes bibliothèques utilisant un sélecteur de ce type, comme jQuery, peuvent d&#8217;ores et déjà prendre en compte les navigateurs supportant cette méthode : il suffit de tester <code class="prettyprint">document.querySelectorAll()</code>, et de lui passer la main s&#8217;il existe.</p>
<p>L&#8217;article sur Webkit.org : <a href="http://webkit.org/blog/156/queryselector-and-queryselectorall/">http://webkit.org/blog/156/queryselector-and-queryselectorall/</a><br />
Télécharger la dernière version de Webkit : <a href="http://nightly.webkit.org/">http://nightly.webkit.org/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lesintegristes.net/2008/02/10/webkit-supporte-documentqueryselectorall/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
