<?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>jQuery &#8211; Les intégristes</title>
	<atom:link href="/tag/jquery/feed/" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description></description>
	<lastBuildDate>Thu, 31 Mar 2016 16:46:46 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.0</generator>
	<item>
		<title>Les plugins, nos amis qui nous rendent la vie dure&#8230;</title>
		<link>/2012/11/07/les-plugins-nos-amis-qui-nous-rendent-la-vie-dure/</link>
					<comments>/2012/11/07/les-plugins-nos-amis-qui-nous-rendent-la-vie-dure/#comments</comments>
		
		<dc:creator><![CDATA[Guillaume Richard]]></dc:creator>
		<pubDate>Wed, 07 Nov 2012 12:36:22 +0000</pubDate>
				<category><![CDATA[Front-end]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<guid isPermaLink="false">/?p=3264</guid>

					<description><![CDATA[On le sait, jQuery et sa facilité de prise en main ont fait énormément de bien à la communauté.
Via le biais des plugins, tout le monde a pu commencer à faire des effets « wahou » en deux secondes et a pu commencé à vouloir écrire ses propres plugins&#8230; Rendons à César ce qui est à César et remercions jQuery pour avoir apporté une idée différente du framework javascript. Dans une discussion future, je me ferai peut-être moins respectueux en évoquant les différents maux que cette librairie a pu apporter.
Rapidité &#60; Qualité
Ce qui reste très agaçant, surtout&#160;[&#8230;]]]></description>
										<content:encoded><![CDATA[<p>On le sait, jQuery et sa facilité de prise en main ont fait énormément de bien à la communauté.</p>
<p>Via le biais des plugins, tout le monde a pu commencer à faire des effets « wahou » en deux secondes et a pu commencé à vouloir écrire ses propres plugins&#8230; Rendons à César ce qui est à César et remercions jQuery pour avoir apporté une idée différente du framework javascript. Dans une discussion future, je me ferai peut-être moins respectueux en évoquant les différents maux que cette librairie a pu apporter.</p>
<h2>Rapidité &lt; Qualité</h2>
<p>Ce qui reste très agaçant, surtout lorsqu&rsquo;on commence à prendre un peu de niveau dans son métier, c&rsquo;est quand un chef de projet vous pose cette question: « pourquoi tu n&rsquo;as pas utilisé un <em>plugin tout fait</em> à la place ? »; alors que vous auriez bien aimé tout de même avoir la chance de pouvoir démontrer que vous pouviez faire mieux et surtout : <strong>plus adapté au projet</strong>.<br />
Qui ne s&rsquo;est jamais arraché les cheveux à <em>faire rentrer un plugin dans un projet</em> en bidouillant l&rsquo;impossible, ajoutant des options dans l&rsquo;objet d&rsquo;options même si ce n&rsquo;était pas vraiment le meilleur endroit&#8230;</p>
<p>Mais plus loin encore, est-ce là un vrai travail responsable que d&rsquo;accepter l&rsquo;utilisation de plugins par son équipe technique ?<br />
Non seulement l&rsquo;équipe ne risque pas de prendre du niveau et très certainement se ramollir, voir se démotiver, mais en plus, vous rendez votre travail dépendant de ce qui se passe ailleurs, <em>chez les autres&#8230; </em>dépendant donc de la veille « plugin ».<br />
C&rsquo;est un peu comme à l&rsquo;époque du designers que les intégrateurs bridaient afin de pouvoir avoir des maquettes intégrables « <em>comme on l&rsquo;a toujours fait depuis des années</em>« , à force on obtenait presque toujours les mêmes briefs: « <em>A gauche donc, on aura une sidebar, à droite.. le contenu et puis au milieu, un jQuery Carousel de chez bidule »</em>; Grisant.<br />
D&rsquo;ailleurs, la version 2013 de ces pratiques sera « <em>en haut, le header, au milieu&#8230; et bah un bon gros jQuery mansonry hein ? t&rsquo;en dis quoi ? le footer ? Oh y&rsquo;en a pas besoin..</em>. »</p>
<p>Donnez-vous une année comme cela, sans faire un peu de programmation chez vous et vous allez vite voir que vous allez très rapidement perdre vos compétences.</p>
<p>Petite blague à part: Vous n&rsquo;avez jamais remarqué que sur stackoverflow, à chaque question en js natif il y a toujours une armée de réponses type « <em>pourquoi tu n&rsquo;utilises pas jQuery</em>« . Et si demain vous ne deviez pas l&rsquo;utilisez, pour des raisons d&rsquo;optimisations ? Et si sans jQuery vous vous rendiez compte que vous ne compreniez qu&rsquo;une partie de la DOM API et donc, à votre métier ? True story que cela et je vous la raconterai peut-être en temps voulu&#8230; mais autre sujet, autre journée.</p>
<h2>L&rsquo;artisanat français</h2>
<p><small>Oui monsieur&#8230;</small></p>
<p>Il reste aussi le problème de l&rsquo;honnêteté.<br />
La plupart de ces <em>plugins</em> sont souvent réalisés à des fins de promotion personnelle, donner à ceux qui ne savent pas programmer l&rsquo;occasion d&rsquo;avoir un petit plus sur leur blog ou de réutiliser plusieurs fois un travail réalisé pour un client ou encore simplement démontrer un concept, une idée simple.</p>
<p>Il est évident qu&rsquo;à un certain niveau de la hiérarchie, on ne se préoccupe pas trop de comment un projet est commencé et fini, il faut tout simplement qu&rsquo;il soit fini.<br />
Là où cela devient préoccupant, c&rsquo;est lorsque le chef de projet technique ne s&rsquo;en préoccupe pas non plus&#8230; et encore plus préoccupant d&rsquo;entendre ce genre de propos dans la bouche d&rsquo;un développeur front-end.</p>
<p>C&rsquo;est peut-être du au fait qu&rsquo;en France, au delà de 8 à 10 ans en tant que technicien, il est inconcevable de ne pas rechercher ou accepter un magnifique poste de manager et / ou de chef de projet, poste qui fera systématiquement, si on n&rsquo;y prête pas garde, perdre le fil de la veille technologique (en fait plutôt les compétences que la veille).<br />
Quelle belle récompense pour tant d&rsquo;année de bon et loyaux services, mais ça, c&rsquo;est déjà un sujet assez récurrent sur ce blog et je n&rsquo;y reviendrais plus (promis juré !)</p>
<p>Cela est peut-être aussi du au fait que depuis les <em>plugins à tout va</em>, on sait qu&rsquo; un site Internet coutera moins cher et sera surtout réalisé plus rapidement. Par conséquent, « on » est toujours plutôt gagnant&#8230; enfin sauf pour les « techos » mais eux, ils attendent patiemment leur 8 à 10 ans pour devenir chef de projet (quoi, vous voulez pas être CP ou manager ? Mais puisqu&rsquo;on vous dit que vous n&rsquo;avez pas le choix !)</p>
<p>La seule question qui restent à mes yeux importante :  Est-ce un service que nous rendons au <strong>métier</strong> ?<br />
Je m&rsquo;étonne bien souvent de notre retard sur les points de l&rsquo;UX, de l&rsquo;UI et du design de site Internet mais n&rsquo;est-ce pas avant tout parce que nous travaillons presque toujours à l&rsquo;inspiration en regardant un peu ce qui a déjà été fait et finalement très peu en workshop ? Que les commerciaux vendent d&rsquo;office des promesses impossibles à tenir ? Ou, peut-être est-ce parce qu&rsquo;on s&rsquo;obstine à rechercher des ninjas en PHP/MYSQL/AS3/CSS3/HTML5/JS/ASP au lieu de profils spécialisés dans l&rsquo;interface utilisateur&#8230; Ou pire, que certains bloggeurs influents parlent partout de <em>webresponsive </em>sans exactement comprendre les implications (encore un bon sujet potentiel que celui-ci)</p>
<h2>Be open! Oui mais&#8230;</h2>
<p>Alors, au final, merci jQuery mais par pitié, vous, développeurs de plugins, soyez fermes avec vos licences d&rsquo;utilisations et menez la vie dure aux entreprises qui utilisent vos plugins sans en avoir l&rsquo;autorisation. De cette manière, nous pourrons ainsi tous combattre l&rsquo;utilisation de plugins en entreprise tout en permettant aux gens de s&rsquo;inspirer et/ou regarder directement le code via GitHub pour <strong>apprendre</strong> sans pour autant réutiliser&#8230; sinon dans quelques années, il faudra ajouter la ligne « <strong>google-isation de plugins</strong> » sur nos CVs.</p>
<p>Il serait d&rsquo;ailleurs intéressant de savoir ce que pense certaines personnes de l&rsquo;utilisation de leurs plugins pour des projets professionnels vendus à quelques dizaines voir centaines de milliers de <em>brouzoufs</em>&#8230; qui se souvient encore de l&rsquo;utilisation d&rsquo;un blog Dotclear pour un site Internet vivant à promouvoir certaines lois que l&rsquo;état était désireux de passer ? Et qui se souvient du prix à laquelle ce Dotclear avait été vendu ?</p>
]]></content:encoded>
					
					<wfw:commentRss>/2012/11/07/les-plugins-nos-amis-qui-nous-rendent-la-vie-dure/feed/</wfw:commentRss>
			<slash:comments>19</slash:comments>
		
		
			</item>
		<item>
		<title>Stylez-moi ce formulaire !</title>
		<link>/2010/08/17/stylez-moi-ce-formulaire/</link>
					<comments>/2010/08/17/stylez-moi-ce-formulaire/#comments</comments>
		
		<dc:creator><![CDATA[Eric Le Bihan]]></dc:creator>
		<pubDate>Tue, 17 Aug 2010 13:52:16 +0000</pubDate>
				<category><![CDATA[Front-end]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[jQuery]]></category>
		<guid isPermaLink="false">/?p=1120</guid>

					<description><![CDATA[Après avoir essayé à plusieurs reprises et par tous les moyens de styler les éléments d’un formulaire html pour donner vie aux créations des graphistes, il a bien fallu se rendre à l’évidence : ce n’est pas possible ! Déjà les styles ne sont pas appliqués de façon identique selon les navigateurs, mais en plus ces éléments diffèrent selon les systèmes d’exploitation et leurs versions successives, CQFD. 
Après avoir tenu ce discours : &#171;Non les formulaires, on ne peut pas les styler, désolé&#187; pendant des années, les webdesigners les plus tenaces sont revenus avec des exemples de sites en nous&#160;[&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Après avoir essayé à plusieurs reprises et par tous les moyens de styler les éléments d’un formulaire html pour donner vie aux créations des graphistes, il a bien fallu se rendre à l’évidence : ce n’est pas possible ! Déjà les styles ne sont pas appliqués de façon identique selon les navigateurs, mais en plus ces éléments diffèrent selon les systèmes d’exploitation et leurs versions successives, <a href="http://www.456bereastreet.com/archive/200409/styling_form_controls/">CQFD</a>. </p>
<p>Après avoir tenu ce discours : &laquo;Non les formulaires, on ne peut pas les styler, désolé&raquo; pendant des années, les webdesigners les plus tenaces sont revenus avec des exemples de sites en nous disant : &laquo;Tu me dis que c’est pas possible, mais là sur tel site, ils l’ont fait.&raquo;”</p>
<p>Ok, reprenons : styler des éléments de fomulaire html, ça ne donne pas un résultat terrible, mais&#8230; avec javascript on arrive à voir un résultat plutôt satisfaisant. La question est : faut-il utiliser du JS pour faire de la cosmétique ? Parce que la seule chose qu’on fait avec JS ce n’est pas styler des éléments de formulaires, mais au mieux cacher des éléments de formulaires (ou les rendre invisibles) pour leur substituer des éléments graphiques, au pire remplacer des éléments de formulaires par d’autres balises html qui elles pourront être stylées avec CSS. Par exemple, remplacer un select par une liste non ordonnée. Est-ce que le jeu en vaut la chandelle ? Est-ce qu’on va alourdir les pages et retarder leur affichage pour quelques effets que l’utilisateur ne remarquera même pas ?</p>
<p>La question que tout le monde se pose (ou peut-être qu’il n’y a que moi qui me la pose), c’est pourquoi on ne peut pas styler les éléments de formulaire ? Ok pour les input de type texte (et encore pas avec tous les navigateurs), mais pourquoi pas les listes déroulantes de type select, les cases à cocher ou autres boutons radio ? Y-a-t-il une raison à ça ou les fabricants de navigateurs, se sont dit : &laquo;oups, on a oublié les formulaires !&raquo; &laquo;Laisse tomber on va dire que c’est fait exprès.&raquo;</p>
<p>Argumentons dans le sens où c’est fait exprès : les internautes ont l’habitude de leur système d’exploitation, du coup ils vont toujours identifier ces éléments quelque soit le navigateur dans lequel ils sont, et ça en terme d’utilisabilité c’est imbattable ! Mouais, pas vraiment convaincant tout ça&#8230;</p>
<p>Est-ce qu’on se posait la question avant ? &laquo;Fais moi ça en flash c’est plus joli&raquo;. Ce serait de la faute de flash, alors ? Toujours est-il qu’on trouve de plus en plus de plugins qui permettent de faire ça facilement, tentant, non ? J’en ai essayé deux ou trois, je vous donne mon avis :</p>
<dl>
<dt><a href="http://www.filamentgroup.com/lab/jquery_ui_selectmenu_an_aria_accessible_plugin_for_styling_a_html_select/">jQuery UI selectmenu</a></dt>
<dd>Pas des plus facile à manipuler, mais très complet, il couvre largement le spectre des utilisations de menus avec des listes déroulantes. Trop de styles inline qui complique le skinning des css externes. A noter que ce plugin utilise les attributs ARIA pour l&rsquo;accessibilité.</dd>
<dt><a href="http://www.protofunc.com/scripts/jquery/checkbox-radiobutton/">jQuery UI checkbox</a></dt>
<dd>Simplissime. Par exemple pour une case à cocher il suffit d’initialiser le script de cette façon <code>$('input').checkBox();</code><br />
Et la case à cocher est remplacée par un span avec la classe “ui-checkbox”, il ne reste plus qu’à appliquer les CSS.</dd>
<dt><a href="http://www.prismstudio.co.uk/plugins/stylish-select/0.4/">jQuery Stylish select</a></dt>
<dd>Je ne l’ai pas testé personnellement, mais ça a été utilisé sur un projet récent dans ma boîte. Complètement customisable en CSS et ultra light.</dd>
<dt><a href="http://pixelmatrixdesign.com/uniform/">Uniform</a></dt>
<dd>Je suis tombé sur celui-ci il y a quelques jours, il me parait assez complet et facilement skinnable, une image sprite pour tous les éléments (vous pouvez créer des thèmes et les proposer sur le site), une fois les éléments stylés la navigation au clavier me parait correcte, reste juste à mettre plus en avant le focus sur les éléments.</dd>
</dl>
<p></p>
<p>Après c’est vous qui voyez&#8230; Personnellement, je ne trouve pas ça indispensable, mais pourquoi pas si les contraintes de conception ne sont pas trop draconiennes.</p>
<p>Bon je repose ma question aux concepteurs de navigateurs : Pourquoi les éléments de formulaire ne peuvent être stylés de la même façon que les autres balises html ?</p>
]]></content:encoded>
					
					<wfw:commentRss>/2010/08/17/stylez-moi-ce-formulaire/feed/</wfw:commentRss>
			<slash:comments>15</slash:comments>
		
		
			</item>
		<item>
		<title>jQuery Mobile, pourquoi le tactile est-il toujours mobile ?</title>
		<link>/2010/08/14/l-equipe-de-jquery-vient-d-annoncer-un-nouvea/</link>
					<comments>/2010/08/14/l-equipe-de-jquery-vient-d-annoncer-un-nouvea/#comments</comments>
		
		<dc:creator><![CDATA[Pierre Bertet]]></dc:creator>
		<pubDate>Sat, 14 Aug 2010 15:14:24 +0000</pubDate>
				<category><![CDATA[Front-end]]></category>
		<category><![CDATA[Interface]]></category>
		<category><![CDATA[jQuery]]></category>
		<guid isPermaLink="false">/?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,&#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" style="width: 330px" class="wp-caption alignnone"><img aria-describedby="caption-attachment-1103" loading="lazy" src="/wp-content/uploads/2010/08/jquery-ui-mobile.png" alt="" title="jquery-ui-mobile" width="320" height="480" class="size-full wp-image-1103" srcset="/wp-content/uploads/2010/08/jquery-ui-mobile.png 320w, /wp-content/uploads/2010/08/jquery-ui-mobile-200x300.png 200w" sizes="(max-width: 320px) 100vw, 320px" /><p id="caption-attachment-1103" 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>/2010/08/14/l-equipe-de-jquery-vient-d-annoncer-un-nouvea/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>jQuery : l’événement !</title>
		<link>/2008/09/16/jquery-l-evenement/</link>
					<comments>/2008/09/16/jquery-l-evenement/#comments</comments>
		
		<dc:creator><![CDATA[Pierre Bertet]]></dc:creator>
		<pubDate>Mon, 15 Sep 2008 23:23:32 +0000</pubDate>
				<category><![CDATA[Front-end]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<guid isPermaLink="false">/?p=63</guid>

					<description><![CDATA[Enfin « les », é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 « Event Helpers »
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&#160;[&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Enfin « les », événements. Je voulais un titre sensationnel.</p>
<p>Vous connaissez certainement <a href="http://jquery.com/">jQuery</a>, l&rsquo;excellente bibliothèque Javascript. Non ? Alors <a href="/category/jquery/">c&rsquo;est ici</a>.</p>
<p>Le développement DOM/Javascript repose en grande partie sur les événements. Vous savez certainement qu&rsquo;il est possible d&rsquo;affecter un événement à un objet jQuery, c&rsquo;est à dire qu&rsquo;une fonction se déclenchera lors d&rsquo;un événement sur l&rsquo;objet sélectionné.</p>
<p>jQuery propose deux manières de définir les événements : nous allons les analyser.</p>
<h3>Les « Event Helpers »</h3>
<p>Joli nom. Pas très causant, mais sympa comme tout.</p>
<p>Il s&rsquo;agit d&rsquo;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&rsquo;événement DOM, allégé de son préfixe « <strong>on</strong> » (onclick, onmouseout, etc. ).</p>
<p>Si aucun paramètre n&rsquo;est passé, cette méthode <strong>déclenche</strong> l&rsquo;événement.</p>
<p>Si une fonction est passée en paramètre, elle s&rsquo;exécutera lorsque l&rsquo;événement sera déclenché (depuis le code comme vu juste au-dessus, ou « naturellement »).</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&rsquo;événement <code class="prettyprint">onclick</code> peut être défini sur un objet jQuery à l&rsquo;aide de la méthode <code class="prettyprint">click()</code> à laquelle est passée une fonction :</p>
<pre><code class="language-javascript">$("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&rsquo;objet événement, et possède plusieurs propriétés et méthodes. J&rsquo;ai l&rsquo;habitude d&rsquo;utiliser une variable nommée « e » (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="language-javascript">$("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. « 例 », dirait un japonais, mais vous n&rsquo;êtes pas obligé de me croire.</p>
<p>Nous allons réutiliser l&rsquo;é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 ( « a#test2 » ) sera cliqué, un clic sera déclenché sur le lien du premier exemple ( « a#test1 » ).</p>
<p><strong>Exemple.</strong></p>
<pre><code class="language-javascript">$("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="language-javascript">ready()</code> d&rsquo;un objet jQuery contenant l&rsquo;objet DOM <code class="language-javascript">document</code>.</p>
<p>Si un script est défini et exécuté dans la partie <code class="language-javascript">&lt;head&gt;</code> d&rsquo;une page et qu&rsquo;il essaie de manipuler des éléments, le navigateur se comportera comme s&rsquo;ils n&rsquo;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&rsquo;attribut defer</a>). Puisque la suite du document n&rsquo;a pas encore été chargée, le navigateur n&rsquo;a pas connaissance de ces éléments.</p>
<p>Pour remédier à cela, il est possible d&rsquo;attacher un événement <code class="language-javascript">onload</code> sur l&rsquo;objet <code class="language-javascript">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="language-javascript">$(window).load(function(){
  // Le code placé ici sera déclenché
  // au chargement complet de la page.
});
</code></pre>
<p>Il s&rsquo;agit de l&rsquo;équivalent jQuery du célèbre <code class="language-javascript">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&rsquo;analyse de statistiques basé sur un script externe), un long moment peut s&rsquo;écouler avant que votre script ne soit exécuté.</p>
<p>C&rsquo;est pourquoi la méthode <code class="language-javascript">ready()</code> de l&rsquo;élément <code class="language-javascript">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&rsquo;agit pas d&rsquo;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&rsquo;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&rsquo;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="language-javascript">disabled</code> de chacun des objets contenus dans <code class="language-javascript">document.styleSheets</code> (chaque fichier CSS) est testée jusqu&rsquo;à ce qu&rsquo;elle renvoie <code class="language-javascript">false</code>, c&rsquo;est à dire lorsque la CSS est chargée.</p>
<p>Pour Internet Explorer, <a href="http://javascript.nwbox.com/IEContentLoaded/">l&rsquo;astuce consiste à tester la méthode <code class="language-javascript">document.documentElement.doScroll("left");</code></a> jusqu&rsquo;à ce qu&rsquo;elle ne retourne plus d&rsquo;erreur. Dès que c&rsquo;est le cas, cela signifie que les styles sont chargés.</p>
<p>Pour Webkit, c&rsquo;est la propriété <code class="language-javascript">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&rsquo;événement <code class="language-javascript">document.DOMContentLoaded</code> (Mozilla Firefox), c&rsquo;est donc ce dernier qui est utilisé.</p>
<p>Pour les navigateurs ne supportant pas <code class="language-javascript">document.DOMContentLoaded</code> et n&rsquo;entrant pas dans les cas particuliers traités par jQuery (Opera, Webkit, Internet Explorer), c&rsquo;est un simple événement <code class="language-javascript">window.onload qui est utilisé</code>.</p>
<p>Voilà, vous oubliez ça, jQuery le fait pour vous :</p>
<pre><code class="language-javascript">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&rsquo;aurez compris, il s&rsquo;agit d&rsquo;un extrait du code de jQuery.</p>
<p>Il existe deux autres « Event Helpers » particuliers, appelés « Interaction Helpers ». Les deux fonctionnent de la même manière, à la différence qu&rsquo;ils attendent deux fonctions en paramètre plutôt qu&rsquo;une.</p>
<p>La méthode <strong><code class="language-javascript">hover()</code></strong> permet de spécifier deux événements, pour l&rsquo;entrée et la sortie du curseur souris dans la zone que couvre le ou les éléments de notre objet jQuery. <a href="/wp-content/uploads/2007/08/superman.jpg">Mon vieil ami Superman</a> appelle ce comportement le « survol ».</p>
<p>Ils ne sont pas tout à fait équivalents aux événements <code class="language-javascript">onmouseover</code> et <code class="language-javascript">onmouseout</code>, existant nativement en DOM.<br />
En utilisant ces derniers, lorsque le curseur se déplace d&rsquo;un élément à un autre au sein de l&rsquo;élément sur lequel est attaché l&rsquo;événement (par exemple lorsqu&rsquo;il passe sur une image se trouvant à l&rsquo;intérieur d&rsquo;un élément &lt;div&gt;), <code class="language-javascript">onmouseover</code> sera déclenché sur l&rsquo;image (sur laquelle aucun événement n&rsquo;est défini), et « remontera » jusqu&rsquo;à son conteneur, pour déclencher une seconde fois l&rsquo;événement. La cible de l&rsquo;événement va également changer, ce sera l&rsquo;image et non le conteneur.<br />
En sortant le curseur de l&rsquo;image, même problème : c&rsquo;est cette fois l&rsquo;événement onmouseout qui sera déclenché sur le conteneur, mais avec l&rsquo;image pour cible.</p>
<p>Pour en savoir plus, c&rsquo;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&rsquo;élément survolé au déclenchement de l&rsquo;événement corresponde bien à l&rsquo;élément sur lequel l&rsquo;événement a été défini. C&rsquo;est fastidieux. jQuery s&rsquo;en charge automatiquement lorsque vous utilisez <code class="language-javascript">hover()</code>.</p>
<p>La seconde méthode est <strong><code class="language-javascript">toggle()</code></strong>. Elle est équivalente à la méthode <code class="language-javascript">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="language-javascript">bind()</code> pour affecter un <strong>ou plusieurs</strong> événements à un objet jQuery. Voici une première différence avec les « Event Helpers » 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="language-javascript">$("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 « spéciaux » sont disponibles avec la méthode <code class="language-javascript">bind()</code> : <code class="language-javascript">mouseenter</code> et <code class="language-javascript">mouseleave</code>.<br />
Ils correspondent à l&rsquo;entrée la sortie du curseur sur un élément, sans déclencher l&rsquo;événement lorsqu&rsquo;un élément enfant est survolé. Ces événements correspondent à ceux définis par la méthode <code class="language-javascript">hover()</code>.</p>
<h4>La méthode trigger()</h4>
<p>Comme pour les « Event Helpers », il est possible de déclencher depuis le code un événement défini sur un élément. La méthode <code class="language-javascript">trigger()</code> sera utilisée.</p>
<p><strong>Exemple.</strong></p>
<pre><code class="language-javascript">$("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&rsquo;é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&rsquo;appeler la méthode <code class="language-javascript">unbind()</code> en lui passant en paramètre le ou les événements à supprimer. Si aucun événement n&rsquo;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="language-javascript">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="language-javascript">trigger()</code> permet également d&rsquo;envoyer des données à la fonction déclenchée par l&rsquo;événement. On passera alors ces données en second paramètre, après le nom de l&rsquo;é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="language-javascript">$("a#test5").trigger("click", ["paramètre 1", 2, {parametre: "3"}]);</code></pre>
<p>Lors de la définition de l&rsquo;é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&rsquo;objet événement (« e » dans l&rsquo;exemple suivant).</p>
<p><strong>Exemple.</strong></p>
<pre><code class="language-javascript">$("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="language-javascript">undefined</code> la boîte de dialogue déclenchée par window.alert ne s&rsquo;affiche même pas pour le troisième paramètre : le fait d&rsquo;appeler une clé inexistante (<code class="language-javascript">param3["parametre"]</code>) déclenchera une erreur Javascript.</p>
<p>Comme dit plus haut, si un seul paramètre est passé, vous pouvez l&rsquo;utiliser directement :</p>
<p><strong>Exemple.</strong></p>
<pre><code class="language-javascript">$("a#test5").trigger("click", "paramètre 1");</code></pre>
<p>Bien entendu, la fonction n&rsquo;attend qu&rsquo;un paramètre dans ce cas :</p>
<pre><code class="language-javascript">$("a#test5").bind("click", function(e, param1){
  e.preventDefault();
  window.alert(param1); // Affiche "paramètre 1"
});</code></pre>
<h4>Les événements « sur mesure »</h4>
<p>Il est possible d&rsquo;utiliser <code class="language-javascript">bind()</code> pour affecter un événement personnalisé. Cet événement ne pourra être déclenché qu&rsquo;avec la méthode <code class="language-javascript">trigger()</code>.</p>
<p>&#8211; A quoi ça sert, exactement ?<br />
&#8211; Principalement, à découper certaines parties d&rsquo;un script, liées à un objet jQuery, en événements. Mais c&rsquo;est quoi ces questions ? C&rsquo;est pour me déstabiliser, c&rsquo;est ça ?</p>
<p>Prenons un lien, auquel nous attacherons l&rsquo;événement « StyleFunky ». Lorsque cet événement sera déclenché, notre lien va naturellement s&rsquo;imposer dans le page, montrer à tous qu&rsquo;il n&rsquo;est pas le genre de lien qu&rsquo;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&rsquo;un <code class="language-javascript">window.setInterval()</code> pour changer sa couleur de fond, mais ce sera transparent pour nous, une fois notre fonction définie. Seul l&rsquo;événement « StyleFunky » sera ensuite déclenché.</p>
<p>Nous attacherons également un autre événement à ce lien, « StyleNormal », qui annulera les effets de l&rsquo;événement précédent (y compris le <code class="language-javascript">window.setInterval</code>) :</p>
<p><strong>Exemple.</strong></p>
<pre><code class="language-javascript">$("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&rsquo;est de l&rsquo;espagnol) :<br />
<button type="button" id="btn-test2">$(« a#test6 »).trigger(« StyleFunky »)</button> <button type="button" id="btn-test3">$(« a#test6 »).trigger(« StyleNormal »)</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&rsquo;il était possible avec <code class="language-javascript">unbind()</code> de supprimer une seule des fonctions attachées à un événement, mais cette méthode est peu élégante, puisqu&rsquo;elle n&rsquo;autorise pas l&rsquo;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&rsquo;événement (« .action1 », « .action2 » et « .action3 » ici) :</p>
<pre><code class="language-javascript">$(element).bind("click.action1", function(){ /* Action 1 */ });
$(element).bind("click.action2", function(){ /* Action 2 */ });
$(element).bind("click.action3", function(){ /* Action 3 */ });</code></pre>
<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&rsquo;événement « click » :</p>
<pre><code class="language-javascript">$(element).trigger("click.nom1"); /* Déclenche l'action 1 */
$(element).trigger("click"); /* Déclenche les actions 1, 2 et 3 */</code></pre>
<p>Évidemment, il  sera possible de les supprimer, individuellement, ou non.</p>
<pre><code class="language-javascript">$(element).unbind("click.nom1"); /* Supprime l'action 1 */
$(element).trigger("click"); /* Déclenche les actions 2 et 3 (la 1 vient d'être supprimée, sois attentif) */</code></pre>
<h4>La méthode .triggerHandler()</h4>
<p>Pour finir, la méthode <code class="language-javascript">triggerHandler()</code> permet de déclencher les différentes fonctions attachées à un événement, sans déclencher l&rsquo;action par défaut du navigateur.</p>
<p>Prenons l&rsquo;événement <code class="language-javascript">focus</code> sur un champ texte de formulaire. Si vous lui affectez une action particulière (comme afficher une bulle d&rsquo;information), vous pourrez alors déclencher cette action sans déplacer le curseur de l&rsquo;utilisateur dans le champ :</p>
<pre><code class="language-javascript">$(input[type=text]).bind("focus", function(){ /* Affichage de la bulle d'information */ });
$(input[type=text]).trigger("focus"); /* Déplacement du curseur dans le champ texte, affichage de la bulle d'information */
$(input[type=text]).triggerHandler("focus"); /* Affichage de la bulle d'information seulement */</code></pre>
<p style="line-height:normal;font-size:300%"><strong>Voilà, c&rsquo;est fini.</strong></p>
]]></content:encoded>
					
					<wfw:commentRss>/2008/09/16/jquery-l-evenement/feed/</wfw:commentRss>
			<slash:comments>12</slash:comments>
		
		
			</item>
		<item>
		<title>jQuery : codez branché !</title>
		<link>/2008/01/14/jquery-codez-branche/</link>
					<comments>/2008/01/14/jquery-codez-branche/#comments</comments>
		
		<dc:creator><![CDATA[Pierre Bertet]]></dc:creator>
		<pubDate>Sun, 13 Jan 2008 23:41:00 +0000</pubDate>
				<category><![CDATA[Front-end]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<guid isPermaLink="false">/2008/01/14/jquery-codez-branche/</guid>

					<description><![CDATA[Vous avez toujours voulu être branché ? Non ? Pourquoi tu dis rien ?
T&#8217;aimes pas les accroches interrogatives 
Voici donc la suite de notre série d&#8217;articles consacrés à jQuery, avec aujourd&#8217;hui : le plugin !
La conception de jQuery, centrée sur un même objet, permet d&#8217;étendre naturellement notre bibliothèque en créant de nouvelles méthodes. Un plugin sera alors utilisé de cette façon :
$("p").monplugin();
Nous créerons pour l&#8217;exemple un plugin qui fait danser les éléments sélectionnés, appelons-le « jQuery Dance ».
On pourra éventuellement lui passer des options : le tempo, et la taille de la piste de danse&#160;[&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Vous avez toujours voulu être branché ? Non ? Pourquoi tu dis rien ?</p>
<p>T&rsquo;aimes pas les accroches interrogatives <img src="/wp-content/uploads/2007/12/interrogation.png" alt="?" style="width:200px;vertical-align:middle" /></p>
<p>Voici donc la suite de notre série d&rsquo;articles consacrés à jQuery, avec aujourd&rsquo;hui : le plugin !</p>
<p>La conception de jQuery, centrée sur un même objet, permet d&rsquo;étendre naturellement notre bibliothèque en créant de nouvelles méthodes. Un plugin sera alors utilisé de cette façon :</p>
<pre class="brush:js;">$("p").monplugin();</pre>
<p>Nous créerons pour l&rsquo;exemple un plugin qui fait danser les éléments sélectionnés, appelons-le « jQuery Dance ».</p>
<p>On pourra éventuellement lui passer des options : le tempo, et la taille de la piste de danse bien entendu !</p>
<p>Il sera utilisé ainsi :</p>
<pre class="brush:js;">$("p").dance();</pre>
<p>Ah, vous l&rsquo;aviez certainement noté : la sonorité de jQuery est proche de celle de charcuterie. Et comme pour la <a href="http://fr.wikipedia.org/wiki/Saucisson" title="Saucisson - Wikipedia">rosette</a>, certaines règles sont à respecter pour créer un <a href="http://docs.jquery.com/Plugins/Authoring" title="Créer un plugin jQuery sur la documentation officielle">plugin de qualité</a>, les voici.</p>
<h3>Nommez votre fichier</h3>
<p>Un plugin doit toujours se nommer ainsi, de manière à ce qu&rsquo;il soit immédiatement identifiable : <strong>jquery.nom_du_plugin.js</strong><br />
Notre fichier se nommera donc <strong>jquery.dance.js</strong>.</p>
<h3>Isolez votre code</h3>
<p>Dans ce fichier nouvellement créé, nous allons commencer par englober tout ce qui va être écrit dans une fonction anonyme qui sera immédiatement executée. De cette manière, toutes les variables que vous créerez ne rentrerons pas en collision avec les autres scripts présents sur la page.</p>
<pre class="brush:js;">(function(){
	// Code
})()</pre>
<p>Nous allons en profiter pour passer la variable jQuery (dont $ n&rsquo;est qu&rsquo;un alias) à cette fonction, de cette manière :</p>
<pre class="brush:js;">(function($){
	// Code
})(jQuery)</pre>
<p>Cela permettra d&rsquo;utiliser la variable <code>$</code> à l&rsquo;intérieur de notre fonction.<br />
Pourquoi, puisque <code>$</code> est déjà un alias de <code>jQuery</code> ?</p>
<p>jQuery permet de renommer cette fonction à l&rsquo;aide de <a href="http://docs.jquery.com/Core/jQuery.noConflict">jQuery.noConflict()</a>.<br />
Il est donc possible de faire cohabiter jQuery et l&rsquo;une des nombreuses librairies utilisant la fonction <code>$()</code> (comme <a href="http://www.prototypejs.org/">Prototype</a>), en renommant l&rsquo;alias comme bon nous semble :</p>
<pre class="brush:js;">var $j = jQuery.noConflict();</pre>
<p>Nous devons donc nous assurer que la fonction <code>$()</code> existe bien, et que nous n&rsquo;utilisons pas une autre librairie à la place de <code>jQuery</code>.</p>
<h3>Ajoutez votre nouvelle méthode à jQuery.fn</h3>
<p>Après avoir créé notre environnement, nous sommes prêts à écrire notre plugin.<br />
Nous voulons donc ajouter une nouvelle méthode aux objets jQuery. Il faut pour cela ajouter une nouvelle fonction à l&rsquo;objet jQuery.fn. Dans cette fonction, le mot-clé <code>this</code> représente l&rsquo;objet jQuery sélectionné par l&rsquo;utilisateur de votre plugin.</p>
<p>Dans le cas où notre plugin serait défini de cette façon :</p>
<pre class="brush:js;">(function($){
	$.fn.dance = function(){
		alert(this == ma_selection);
	};
})(jQuery)</pre>
<p>Et qu&rsquo;une variable globale (absence du mot <code>var</code>) <code>ma_selection</code> soit définie ainsi :</p>
<pre class="brush:js;">// Au chargement...
$(function(){
	ma_selection = $("p");
	ma_selection.dance();
});</pre>
<p>Le message affiché par la fonction <code>alert()</code> serait <code>true</code>.</p>
<h3>Bouclez sur les éléments sélectionnés</h3>
<p>Vous devez toujours considérer que plusieurs éléments ont été sélectionnés avant d&rsquo;appeler votre méthode.</p>
<p>Pour traiter chacun de ces éléments, la méthode <a href="http://docs.jquery.com/Core/each#callback"><code>each()</code></a> de jQuery sera utilisée. cette méthode prend en paramètre une fonction, qui sera executée pour chaque élément. Dans cette boucle, le mot <code>this</code> correspondra cette fois à chacun des éléments DOM de cette sélection.<br />
Pour obtenir un objet jQuery, il faudra passer cet élément à la fonction <code>$()</code>.</p>
<pre class="brush:js;">(function($){
	$.fn.dance = function(){
		this.each(function(){
		  // this : élément DOM classique
		  // $(this) : élément jQuery
		});
	};
})(jQuery)</pre>
<p>Gardez à l&rsquo;esprit que cette fonction est executée pour chacun des éléments de la sélection. Il est donc préférable de ne placer dans cette fonction que les traitements liés à chaque élément en particulier.</p>
<pre class="brush:js;">(function($){
	$.fn.dance = function(){

		// Le tempo est le même pour tous les éléments,
		// inutile de le redéfinir à chaque  fois.
		var tempo = 300;

		// Cette fonction n'est définie qu'une fois,
		// puis appelée par chacun des éléments.
		function move(jElt){
			// Nous placerons ici le code permettant
			// de faire danser le Boogie Woogie à un élément
		};

		this.each(function(){
			move( $(this) );
		});
	};
})(jQuery)</pre>
<h3>Retournez l&rsquo;objet sélectionné</h3>
<p>Cette pratique permettra d&rsquo;<a href="/2007/08/16/jquery-dansez-maintenant/" title="jQuery : dansez maintenant !">utiliser plusieurs méthodes en chaîne</a> :</p>
<pre class="brush:js;">$("p").dance().css("color", "red");</pre>
<p>Evidemment, si votre plugin renvoie une information, il ne sera alors pas possible de chaîner plusieurs méthodes (comme avec la méthode width() par exemple).</p>
<p>Il faudra donc que votre méthode retourne <code>this</code> avant de  se terminer.</p>
<pre class="brush:js;">(function($){
	$.fn.dance = function(){

		// Code...

		<strong>return this;</strong>
	};
})(jQuery)</pre>
<p>Et puisque la méthode each() de jQuery renvoie l&rsquo;élément sélectionné, vous pouvez retourner votre sélection en bouclant sur chacun des éléments :</p>
<pre class="brush:js;">(function($){
	$.fn.dance = function(){

		// Code...

		<strong>return this</strong>.each(function(){
			move( $(this) );
		});
	};
})(jQuery)</pre>
<p>Bien, nous avons vu les bases de la création d&rsquo;un plugin. Le plugin « jQuery Dance » peut maintenant être utilisé de cette façon :</p>
<pre class="brush:js;">$("p").dance().css("border","1px");</pre>
<h3>Passez des paramètres à votre méthode</h3>
<p>Comme nous l&rsquo;avons vu au début de cet article, la méthode <code>dance()</code> prendra deux paramètres : <code>tempo</code> et <code>dancefloorArea</code>, correspondant respectivement à la fréquence d&rsquo;execution de chaque mouvement(en millisecondes), et à la surface que pourra utiliser cet élément (en pixels).</p>
<p>Définir des paramètres pour notre méthode est très simple :</p>
<pre class="brush:js;">(function($){
	$.fn.dance = function(<strong>tempo</strong>, <strong>dancefloorArea</strong>){

		// Code...

	};
})(jQuery)</pre>
<p>La méthode pourra donc être appelée de cette façon :</p>
<pre class="brush:js;">$("p").dance(<strong>300</strong>, <strong>400</strong>)</pre>
<h3>Etendez vos paramètres optionnels</h3>
<p>Avant d&rsquo;avancer dans la réalisation de jQuery Dance et de permettre à nos éléments de se déhancher sur le dancefloor, nous allons voir une dernière technique, permettant de passer des paramètres optionnels à une méthode jQuery.</p>
<p>Nos paramètres ne seront alors plus passés directement, mais à l&rsquo;aide d&rsquo;un tableau associatif :</p>
<pre class="brush:js;">$("p").dance(<strong>{tempo: 300, danceFloorArea: 400}</strong>)</pre>
<p>La fonction <a href="http://docs.jquery.com/Utilities/jQuery.extend#targetobject1objectN"><code>jQuery.extend(a, b)</code></a> permet d&rsquo;étendre un objet <code>a</code> avec un objet <code>b</code>, en écrasant les propriétés redéfinies.<br />
Voici un exemple :</p>
<pre class="brush:js;">var objet_a = {
	param_1: "Bonjour",
	param_2: "les p'tits gars"
};
var objet_b = {
	param_2: "tout le monde",
	param_3: "ça va ?"
};

$.extend(objet_a, objet_b);

alert(objet_a.param_1); // Bonjour
alert(objet_a.param_2); // tout le monde
alert(objet_a.param_3); // ça va ?</pre>
<p>En plus de l&rsquo;étendre, cette fonction renvoie le premier objet modifié, ce qui est très pratique lorsque le premier objet est défini en paramètre :</p>
<pre class="brush:js;">var objet_b = {
	param_2: "tout le monde",
	param_3: "ça va ?"
};

var objet_a = $.extend({
	param_1: "Bonjour",
	param_2: "les p'tits gars"
}, objet_b);</pre>
<p>Nous utiliserons cette technique pour étendre nos paramètres par défaut avec ceux passés à la méthode, de cette façon :</p>
<pre class="brush:js;">(function($){
	$.fn.dance = function(params){

		// Si aucun paramètre n'est passé
		// et que params est vide, alors $.extend()
		// renverra simplement le premier objet passé
		var params = $.extend({
			tempo: 300,
			dancefloorArea: 400
		},params);

		function move(jElt){
			// Boogie Woogie
		};

		return this.each(function(){
			move( $(this) );
		});
	};
})(jQuery)</pre>
<h3>Voulez-vous danser mademoiselle ?</h3>
<p>Chacun de nos éléments sera déplacé, au hasard, sur la surface définie par <code>dancefloorArea</code> (400px par défaut). Chacun de ces déplacements sera déclenché selon l&rsquo;intervalle définie par <code>tempo</code> (300 millisecondes par défaut).</p>
<p>Nous allons définir une nouvelle fonction (tirée de la <a href="http://developer.mozilla.org/fr/docs/R%C3%A9f%C3%A9rence_de_JavaScript_1.5_Core:Objets_globaux:Math:random">documentation Mozilla</a>), permettant d&rsquo;obtenir un nombre entier situé entre les deux passés en paramètres.</p>
<p>Nous allons également définir les variables <code>minPosition</code> et <code>maxPosition</code> d&rsquo;après <code>params.dancefloorArea</code></p>
<pre class="brush:js;">(function($){
	$.fn.dance = function(params){

		// Paramètres
		var params = $.extend({
			tempo: 300,
			dancefloorArea: 400
		},params);

		// Renvoie un entier situé entre min et max
		<strong>function getRandomInt(min, max)</strong>{
		  return Math.floor(Math.random() * (max - min + 1)) + min;
		};

		// Positions minimales et maximales
		// que pourra prendre un élément
		<strong>var minPosition</strong> = -(params.dancefloorArea/2);
		<strong>var maxPosition</strong> = params.dancefloorArea/2;

		// Mouvement d'un élément
		function move(jElt){
			<strong>var topPos</strong> = getRandomInt(minPosition, maxPosition);
			<strong>var leftPos</strong> = getRandomInt(minPosition, maxPosition);
		};

		return this.each(function(){
			move( $(this) );
		});
	};
})(jQuery)</pre>
<p>Pour chaque élément, une position sera définie à l&rsquo;aide des variables <code>leftPos</code> et <code>topPos</code>.</p>
<p>Il nous reste donc à animer notre élément vers cette position pendant le temps défini par <code>tempo</code>, puis à appeler cette fonction, encore et encore, jusqu&rsquo;au bout de la nuit. Nous utiliserons la méthode <a href="http://docs.jquery.com/Effects/animate#paramsdurationeasingcallback"><code>animate()</code></a> de jQuery. Les éléments seront également positionnés en relatif pour être déplacés par rapport à leur position, sans gêner les voisins parce que bon, ils n&rsquo;ont rien demandé eux.</p>
<pre class="brush:js;">(function($){
	$.fn.dance = function(params){

		// Paramètres
		var params = $.extend({
			tempo: 300,
			dancefloorArea: 400
		},params);

		// Renvoie un entier situé entre min et max
		function getRandomInt(min, max){
		  return Math.floor(Math.random() * (max - min + 1)) + min;
		};

		// Positions minimales et maximales
		// que pourra prendre un élément
		var minPosition = -(params.dancefloorArea/2);
		var maxPosition = params.dancefloorArea/2;

		// Mouvement d'un élément
		function move(jElt){
			var topPos = getRandomInt(minPosition, maxPosition);
			var leftPos = getRandomInt(minPosition, maxPosition);

			// Préfixer une variable par la lettre j
			// (ou ce qui vous semblera pertinent)
			// permet d'identifier facilement un objet jQuery.
			<strong>jElt.animate</strong>(

				// Premier paramètre : les nouvelles propriétés CSS
				// vers lesquelles l'élément va être animé.
				{
					<strong>top: topPos + "px"</strong>,
					<strong>left: leftPos + "px"</strong>
				},

				// Deuxième paramètre : le temps que durera l'animation
				<strong>params.tempo</strong>,

				// Troisième paramètre, la fonction qui sera appelée
				// lorsque l'animation sera terminée.
				function(){
					<strong>move(jElt);</strong> // Nous appelons à nouveau la fonction move()
				}
			);
		};

		return this<strong>.css("position", "relative")</strong>.each(function(){
			move( $(this) );
		});
	};
})(jQuery)</pre>
<p>Vous trouverez une démonstration de notre plugin à cette adresse : <a href="/demos/jquery/dance.html" title="Démonstration du plugin jQuery Dance">/demos/jquery/dance.html</a></p>
<p>Je dois avouer, et vous le reconnaîtrez sûrement, que le résultat est affligeant. Mais bon, hein.</p>
]]></content:encoded>
					
					<wfw:commentRss>/2008/01/14/jquery-codez-branche/feed/</wfw:commentRss>
			<slash:comments>10</slash:comments>
		
		
			</item>
		<item>
		<title>jQuery : dansez maintenant !</title>
		<link>/2007/08/16/jquery-dansez-maintenant/</link>
					<comments>/2007/08/16/jquery-dansez-maintenant/#comments</comments>
		
		<dc:creator><![CDATA[Pierre Bertet]]></dc:creator>
		<pubDate>Wed, 15 Aug 2007 22:27:40 +0000</pubDate>
				<category><![CDATA[Front-end]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<guid isPermaLink="false">/2007/08/16/jquery-dansez-maintenant/</guid>

					<description><![CDATA[Il est grand temps de publier la suite du précédent article sur jQuery, dans lequel nous abordions le fonctionnement global de la bibliothèque, suivi de la construction d&#8217;un objet.
Nous allons maintenant voir ce qu&#8217;il est possible de faire à partir de cet objet.
Méthodes de jQuery
L&#8217;objet jQuery, comme tout objet, dispose de méthodes. Grossièrement, il s&#8217;agit d&#8217;actions qu&#8217;un objet sait accomplir.
Pour comparaison, si notre objet était une grosse voiture rouge (on vend du rêve sur lesintegristes.net), elle aurait la faculté d&#8217;avancer vite.
Ca pourrait donner en français la syntaxe suivante :
Voiture, avance (vite) !
jQuery dispose&#160;[&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Il est grand temps de publier la suite du <a href="/2007/06/11/inauguration-et-introduction-a-jquery/" title="Introduction à jQuery">précédent article sur jQuery</a>, dans lequel nous abordions le fonctionnement global de la bibliothèque, suivi de la construction d&rsquo;un objet.</p>
<p>Nous allons maintenant voir ce qu&rsquo;il est possible de faire à partir de cet objet.</p>
<h3>Méthodes de jQuery</h3>
<p>L&rsquo;objet jQuery, comme tout objet, dispose de méthodes. Grossièrement, il s&rsquo;agit d&rsquo;actions qu&rsquo;un objet sait accomplir.<br />
Pour comparaison, si notre objet était une grosse voiture rouge (on vend du rêve sur lesintegristes.net), elle aurait la faculté d&rsquo;avancer vite.</p>
<p>Ca pourrait donner en français la syntaxe suivante :<br />
Voiture, avance (vite) !</p>
<p>jQuery dispose de la méthode <code class="prettyprint">fadeOut()</code>, pour masquer les éléments englobés dans notre objet jQuery avec un effet de fondu certifié « Ouais bah deux pouin zéro. »<br />
&#8211; « Hein ? »<br />
&#8211; « Ouais bah j&rsquo;dis c&rsquo;que j&rsquo;veux. »</p>
<p>Prenons pour exemple ce petit morceau de HTML, qui ne se doute de rien :</p>
<pre><code class="prettyprint">&lt;p class="outi"&gt;Lalalala, je me balade dans la forêt...&lt;/p&gt;</code></pre>
<p>Nous allons maintenant sélectionner ce paragraphe, et le faire disparaître avec un effet de fondu :</p>
<pre><code class="prettyprint">$("p.outi").fadeOut();</code></pre>
<p>Notre objet est <code class="prettyprint">$("p.outi")</code>, à qui nous demandons de disparaître ( <code class="prettyprint">.fadeOut()</code> ).</p>
<p>La méthode <code class="prettyprint">fadeOut()</code> accepte un paramètre qui permet de modifier la vitesse de l&rsquo;effet : on peut lui passer le temps, en millisecondes, ou les chaînes « slow », « normal » et « fast » :</p>
<pre><code class="prettyprint">$("p.outi").fadeOut("slow");
$("p.outi").fadeOut(300);</code></pre>
<p>Il est également possible de passer un deuxième paramètre, appelé callback. Il s&rsquo;agit d&rsquo;une fonction qui va être appelée lorsque l&rsquo;effet sera terminé. Essayons !</p>
<pre><code class="prettyprint">// Au chargement du DOM...
$(function(){
	// On sélectionne notre paragraphe
	$("p.outi")
	// On lui applique l'effet fadeOut()
	.fadeOut(
		// Avec "slow" en premier paramètre
		"slow",
		// Et une fonction de "callback"
		// en deuxième paramètre
		function(){$(this).fadeIn("slow");}
	);
});</code></pre>
<p>Dans notre callback, nous utilisons <code class="prettyprint">this</code>, qui correspond dans ce contexte à l&rsquo;objet DOM sur lequel l&rsquo;effet est appliqué.<br />
Nous le transformons donc en objet jQuery avant de lui appliquer la méthode <code class="prettyprint">fadeIn()</code>, qui va comme vous l&rsquo;avez deviné faire exactement l&rsquo;inverse de <code class="prettyprint">fadeOut()</code>, et faire apparaître de nouveau notre paragraphe.</p>
<h3>Les méthodes en chaîne</h3>
<p>La plupart des méthodes de jQuery ont une particularité : elles renvoient l&rsquo;objet jQuery lui-même.<br />
Prenons un exemple, à l&rsquo;aide de <a href="http://www.mozilla-europe.org/fr/products/firefox/">Mozilla Firefox</a> et de son excellent plugin <a href="http://www.getfirebug.com/">Firebug</a>, qui permet (entre autres) d&rsquo;afficher n&rsquo;importe quel objet à l&rsquo;aide de l&rsquo;objet <code class="prettyprint">console</code>.<br />
Nous allons utiliser la méthode <code class="prettyprint">css()</code>, qui permet de modifier une ou plusieurs propriétés CSS des éléments sélectionnés :</p>
<pre><code class="prettyprint">$(function(){
	console.log( $("p.outi") );
	// Affiche [p.outi]

	console.log( $("p.outi").css("color", "red") );
	// Affiche [p.outi], la méthode css()
	// renvoie bien notre objet.
});
</code></pre>
<p>Ainsi, il va être possible de réutiliser notre objet, pour lui appliquer tout ce que l&rsquo;on veut.</p>
<p>Pour illustrer ceci, nous allons créer notre premier script « utile ».<br />
Notre client s&rsquo;est réveillé cette nuit pour noter une idée, qui va à coup sûr donner un énorme avantage technologique à son  site sur la concurrence :<br />
&#8211; « Le texte de ce paragraphe apparaîtra en&#8230; glissant, après avoir survolé le bouton rouge : Survolez-moi ! »<br />
&#8211; « Ha »<br />
&#8211; « Imaginez la tête du visiteur ! »<br />
&#8211; « &#8230; »<br />
&#8211; « Sinon ça va, vous ? »<br />
&#8211; « &#8230; O&#8230; Oui, ça va. »</p>
<p>Bon, il est temps d&rsquo;enfiler notre costume de Superman pour trouver une solution accessible avec ça.</p>
<p><img src="/wp-content/uploads/2007/08/superman.jpg" alt="Superman" style="margin: 0pt 0pt 14px; float: left" /><br />
&#8211;  » Ca gratte un peu, mais bon.  »</p>
<p style="clear: left">Pour que ce texte reste accessible à tout ce qui n&rsquo;utilise pas Javascript, il va devoir être masqué au chargement de la page, en Javascript.<br />
Le bouton qui permettra de l&rsquo;afficher n&rsquo;ayant aucun sens sans script, nous allons également le générer. Il nous restera ensuite à créer l&rsquo;effet voulu.<br />
Hop :</p>
<pre><code class="prettyprint">$(function(){
	$("p.outi").before("&lt;span&gt;Survolez-moi !&lt;/span&gt;").hide();
});
</code></pre>
<p>Nous avons sélectionné le paragraphe, ajouté un élément <code class="prettyprint">&lt;span&gt;</code> qui va nous servir de bouton, puis nous avons masqué notre paragraphe, car la méthode <code class="prettyprint">before()</code>, qui permet d&rsquo;ajouter un élément avant celui sélectionné, va retourner l&rsquo;objet jQuery.</p>
<p>Nous allons maintenant modifier notre sélection jQuery, à l&rsquo;aide de la méthode <code class="prettyprint">prev()</code>, qui permet de sélectionner l&rsquo;élément précédent (le <code class="prettyprint">&lt;span&gt;</code>).<br />
Nous voyons donc ici notre première méthode qui ne retourne pas l&rsquo;objet jQuery premièrement sélectionné.<br />
C&rsquo;est très intéressant, car cela va nous permettre de continuer à « chaîner » nos méthodes à partir de l&rsquo;élément <code class="prettyprint">&lt;span&gt;</code> nouvellement créé.</p>
<p>Nous lui appliquerons ensuite un style à l&rsquo;aide de la méthode <code class="prettyprint">css()</code> que nous avons vu précédemment.<br />
Mais plutôt que de modifier une seule propriété en passant deux chaînes de caractère, nous allons lui passer un tableau associatif, contenant toutes les propriétés CSS que nous voulons définir.</p>
<pre><code class="prettyprint">$(function(){
	$("p.outi").before("&lt;span&gt;Survolez-moi !&lt;/span&gt;").hide()
	.prev().css({
		display: "block",
		height: "30px",
		width: "100px",
		lineHeight: "30px",
		textAlign: "center",
		border: "1px solid #f00",
		cursor: "pointer"
	});
});
</code></pre>
<p>Facile, non ?</p>
<p>Il ne nous reste plus qu&rsquo;à attacher un événement au survol de cet élément. jQuery propose un tas de méthodes, permettant d&rsquo;associer des événements à des éléments. Leur nom reprend ceux de DOM, sans le préfixe « on ». Ils prennent en paramètre une fonction.<br />
Nous allons donc utiliser la méthode <code class="prettyprint">mouseover()</code> :</p>
<pre><code class="prettyprint">$(function(){
	$("p.outi").before("&lt;span&gt;Survolez-moi !&lt;/span&gt;").hide()
	.prev().css({
		display: "block",
		height: "30px",
		width: "100px",
		lineHeight: "30px",
		textAlign: "center",
		border: "1px solid #f00",
		cursor: "pointer"
	})
	.mouseover(function(){
		$(this).next().slideDown();
	});
});
</code></pre>
<p>A l&rsquo;intérieur de cette fonction, qui va se déclencher au survol, nous avons englobé notre <code class="prettyprint">&lt;span&gt;</code>, représenté par <code class="prettyprint">this</code>, dans un objet jQuery, puis sélectionné l&rsquo;élément suivant à l&rsquo;aide de <code class="prettyprint">next()</code>, et finalement affiché notre paragraphe à l&rsquo;aide de la méthode <code class="prettyprint">slideDown()</code>.</p>
<p>Vous avez remarqué ?<br />
Nous sommes partis d&rsquo;une unique sélection, <code class="prettyprint">$("p.outi")</code>.</p>
<p>Oui, c&rsquo;est beau. Oui, c&rsquo;est propre. C&rsquo;est jQuery.</p>
]]></content:encoded>
					
					<wfw:commentRss>/2007/08/16/jquery-dansez-maintenant/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
		<item>
		<title>Inauguration et introduction à jQuery</title>
		<link>/2007/06/11/inauguration-et-introduction-a-jquery/</link>
					<comments>/2007/06/11/inauguration-et-introduction-a-jquery/#comments</comments>
		
		<dc:creator><![CDATA[Pierre Bertet]]></dc:creator>
		<pubDate>Mon, 11 Jun 2007 19:30:33 +0000</pubDate>
				<category><![CDATA[Front-end]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<guid isPermaLink="false">/2007/06/11/inauguration-et-introduction-a-jquery/</guid>

					<description><![CDATA[Inauguration de ce nouveau blog !
Eric, Gafour et moi-même, à travers l&#8217;expérience que nous accumulons chaque jour, allons essayer de faire quelque chose d&#8217;intelligent ici, et c&#8217;est loin d&#8217;être gagné !
Nous y parlerons standards, accessibilité, technique, organisation et méthodes de travail.
Commençons technique, avec cette bibliothèque Javascript que j&#8217;apprécie particulièrement :
jQuery
Il existe déjà quelques tutoriels et présentations sur jQuery, mais je vais essayer d&#8217;en expliquer les bases à ma façon, en espérant que ça puisse aider quelqu&#8217;un.
jQuery repose sur une seule fonction, c&#8217;en est d&#8217;ailleurs effrayant de simplicité : $(). C&#8217;est tout.
Mmm&#8230; d&#8217;accord, je&#160;[&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Inauguration de ce nouveau blog !</p>
<p>Eric, Gafour et moi-même, à travers l&rsquo;expérience que nous accumulons chaque jour, allons essayer de faire quelque chose d&rsquo;intelligent ici, et c&rsquo;est loin d&rsquo;être gagné !</p>
<p>Nous y parlerons standards, accessibilité, technique, organisation et méthodes de travail.</p>
<p>Commençons technique, avec cette bibliothèque Javascript que j&rsquo;apprécie particulièrement :</p>
<h2>jQuery</h2>
<p>Il existe déjà quelques tutoriels et présentations sur <a href="http://jquery.com/" title="Site officiel de jQuery" lang="en">jQuery</a>, mais je vais essayer d&rsquo;en expliquer les bases à ma façon, en espérant que ça puisse aider quelqu&rsquo;un.</p>
<p>jQuery repose sur une seule fonction, c&rsquo;en est d&rsquo;ailleurs effrayant de simplicité : <code class="prettyprint"><strong style="font-size: 20px">$()</strong></code>. C&rsquo;est tout.<br />
Mmm&#8230; d&rsquo;accord, je vais développer un peu.</p>
<p>Selon les paramètres que l&rsquo;on va lui passer, cette fonction va réagir de différentes manières. Voici les types de paramètres que l&rsquo;on peut lui passer :</p>
<h3>Une fonction</h3>
<p>Dans ce cas, jQuery va charger cette fonction lorsque la page sera chargée par le navigateur.</p>
<p>Mais pourquoi ne pas utiliser le classique <code class="prettyprint">window.onload = function(){}</code> ?</p>
<p>Principalement parce que window.onload attend que la page <strong>et les éléments qu&rsquo;elle contient</strong> soient complètement chargés, ce qui peut être très long.</p>
<p>Pour reprendre le processus :</p>
<ol>
<li>Le fichier html est téléchargé.</li>
<li>Il est lu par le navigateur.</li>
<li>Le navigateur commence à télécharger les éléments auxquels le fichier html fait référence (images, css&#8230;).</li>
<li><strong>Le code situé dans <code>$(function(){})</code> est exécuté dès que possible.</strong></li>
<li><strong>Lorsque tout est téléchargé, le code situé dans <code>window.onload = function(){}</code> est exécuté, en dernier.</strong></li>
</ol>
<p>Théoriquement, ce code devrait même être exécuté avant l&rsquo;affichage, mais en réalité le navigateur peut commencer à afficher la page avant qu&rsquo;elle ne soit complètement téléchargée.<br />
De plus, les téléchargements ne se font pas un par un, car le navigateur n&rsquo;attend pas qu&rsquo;une image arrive pour en télécharger une autre, heureusement !</p>
<p>Voilà qui facilite le côté non-intrusif du Javascript :<br />
Si un élément ne doit apparaître qu&rsquo;au survol de la souris, par exemple, il faut bien que cet élément soit visible lorsque Javascript n&rsquo;est pas activé : il peut alors simplement être placé dans le code de la page, et dissimulé en Javascript au chargement, pour réapparaître au survol, en une animation à couper le souffle !</p>
<p>On peut l&rsquo;utiliser en stockant la fonction dans une variable pour la passer ensuite à jQuery :</p>
<pre><code class="prettyprint">var ma_fonction = function(){
	// Tout ce qui est ici sera exécuté au chargement du DOM.
};
$(ma_fonction);
</code></pre>
<p>Ou, plus directement, en passant simplement une fonction anonyme à jQuery :</p>
<pre><code class="prettyprint">$(function(){
	// Tout ce qui est ici sera exécuté au chargement du DOM.
});
</code></pre>
<h3>Un élément, ou un tableau d&rsquo;éléments <acronym title="Document Object Model" lang="en">DOM</acronym></h3>
<p>Vous vous en doutiez, jQuery, cet insolent, n&rsquo;est pas qu&rsquo;un « super loader ».<br />
En lui passant des éléments du DOM, la fonction <code class="prettyprint">$()</code> va nous renvoyer un objet jQuery qui va contenir les éléments qui lui ont été passés, et sur lesquels on va pouvoir user et abuser de toute la puissance de jQuery.</p>
<p>Un peu comme une grosse boîte magique, dans laquelle on va mettre tout ça.</p>
<p><img src="/wp-content/uploads/2007/06/jquery_boite.png" title="Un objet jQuery est une boîte magique !" alt="Un objet jQuery est une boîte magique !" /></p>
<p>Il est possible de passer un élément, ou un tableau d&rsquo;éléments à jQuery.<br />
Il va sans dire que le code suivant doit être placé dans le « chargeur » jQuery, vu juste au-dessus, pour être exécuté :</p>
<pre><code class="prettyprint">var mon_element = document.getElementById("id_de_mon_element_html");
var mon_objet_jquery = $(mon_element);
</code></pre>
<h3>Une chaine de caractères</h3>
<p>Notre formidable sens de la déduction nous a immédiatement permis de comprendre la raison du « j ». Mais pourquoi « Query » ?</p>
<p>En passant une chaine de catactères à la fonction <code class="prettyprint">$()</code>, nous allons lui demander de nous retourner un objet jQuery rempli d&rsquo;éléments, sans même avoir à sélectionner préalablement les objets DOM.</p>
<p><em style="font-size: 14px">&#8211; Sorcellerie !</em></p>
<p>Ecoutez, calmez vous et posez cette fourche, sinon nous allons avoir du mal à avancer.</p>
<p>Plusieurs possibilités vous permettront de sélectionner les éléments désirés : les sélecteurs <abbr title="Cascading Style Sheets" lang="en">CSS</abbr> de niveaux 1 à 3, <abbr title="XML Path Language" lang="en">XPath</abbr>, ainsi que quelques sélecteurs jQuery.</p>
<h4>Les sélecteurs CSS</h4>
<p>J&rsquo;imagine que si vous lisez ceci, vous avez au moins une vague connaissance du langage CSS, et c&rsquo;est merveilleux !</p>
<p>Prenons cette structure <abbr title="HyperText Markup Language" lang="en">HTML</abbr> :</p>
<pre><code class="prettyprint">&lt;div id="fixe"&gt;
&lt;h2&gt;Je suis un titre, j'ai de l'importance.&lt;/h2&gt;
&lt;p class="ique"&gt;Ca va les chevilles là-haut ?&lt;/p&gt;
&lt;p&gt;Lorem ipsum sont des mots qui vont très bien ensemble, très bien ensemble.&lt;/p&gt;
&lt;/div&gt;
</code></pre>
<p>Nous voulons sélectionner le premier élément <code>&lt;p&gt;</code>.<br />
Voici différentes possibilités :</p>
<pre><code class="prettyprint">// Sélection des éléments ayant pour classe "ique", dans l'élément ayant pour id "fixe"
var mon_objet_jquery = $("#fixe .ique");      

// Sélection du premier élément &lt;p&gt; de l'élément &lt;div&gt;.
var mon_objet_jquery = $("div p:first-child");      

// Sélection des éléments &lt;p&gt;, enfants directs d'un élement &lt;div&gt; et ayant pour classe "ique".
var mon_objet_jquery = $("div &gt; p.ique");</code></pre>
<p>Le langage CSS offre suffisamment de flexibilité pour permettre une sélection fine et souple.</p>
<p>Que se passe-t-il dans la boîte ? Comme vous vous en doutiez, ces sélecteurs CSS n&rsquo;ont aucun rapport avec l&rsquo;interprétation CSS de votre navigateur.</p>
<p>jQuery va lire cette phrase et la transformer en sélection DOM, mixer cette <a href="http://developer.mozilla.org/en/docs/Gecko_DOM_Reference" title="Geck DOM Reference" lang="en">joyeuse troupe</a> d&rsquo;une façon dont vous n&rsquo;aurez absolument pas à vous préoccuper, pour vous retourner précisément le résultat de votre requête, et le tout soigneusement emballé dans un objet jQuery, poil au nombril.</p>
<p>Imaginez le cas suivant : vous souhaitez sélectionner tous les éléments p ayant pour classe « ique ».<br />
On peut alors utiliser la méthode <code class="prettyprint">getElementsByTagName("p")</code>, qui va nous retourner un tableau d&rsquo;éléments p.<br />
Nous pourrons ensuite trier ce tableau à l&rsquo;aide d&rsquo;une boucle, pour ne garder que ceux ayant pour classe « ique ». On imagine sans peine les quelques lignes nécessaires à une sélection pourtant triviale.</p>
<p>Avec jQuery, une ligne suffit : <code class="prettyprint">$("p.ique");</code>.<br />
C&rsquo;est beau, c&rsquo;est simple, et cette phrase a un parfum de slogan minable.</p>
<p>Il est bien sûr possible, comme en CSS, d&rsquo;utiliser plusieurs sélecteurs à la fois :</p>
<pre><code class="prettyprint">var mon_objet_jquery = $("#fixe .ique, #fixe :last-child");</code></pre>
<p>Vous trouverez sur la <a href="http://docs.jquery.com/Main_Page">documentation de jQuery</a> une liste des sélecteurs supportés par jQuery, ceux dont la syntaxe diffère légèrement de la spécification CSS, ceux qui n&rsquo;auraient aucun sens pour jQuery (E:visited, E:first-letter), et ceux qui ne sont pas supportés en raison d&rsquo;un manque d&rsquo;utilité réelle :<br />
<a href="http://docs.jquery.com/DOM/Traversing/Selectors#CSS_Selectors" lang="en">Documentation des sélecteurs jQuery</a></p>
<h4>XPath</h4>
<p>jQuery ajoute à cela une implémentation basique de <a href="http://www.w3.org/TR/xpath" title="XML Path Language - W3C Recommendation">XPath</a>.</p>
<p>Voici comment sélectionner les éléments p enfants de body, lui-même enfant de html :</p>
<pre><code class="prettyprint">$("/html/body//p");</code></pre>
<p><a href="http://docs.jquery.com/DOM/Traversing/Selectors#XPath_Selectors" lang="en">Documentation XPath de jQuery</a></p>
<h4>Les sélecteurs jQuery</h4>
<p>Il existe également une série de sélecteurs n&rsquo;ayant aucun équivalent CSS ou XPath ; ces derniers peuvent se révéler très pratiques comme dans les exemples suivants :</p>
<p>Sélection des éléments impairs :</p>
<pre><code class="prettyprint">$("div p:odd");</code></pre>
<p>Sélection des éléments inférieurs à (<strong>l</strong>ess <strong>t</strong>han) 4 :</p>
<pre><code class="prettyprint">$("div p:lt(4)");</code></pre>
<p>Ou encore la sélection des éléments d&rsquo;un formulaire (input, select, textarea, button) :</p>
<pre><code class="prettyprint">$("div p:input");</code></pre>
<p>Vous trouverez l&rsquo;intégralité des exemples sur la documentation. Contrairement à XPath que j&rsquo;utilise finalement assez rarement, ces derniers sont utiles dans de nombreuses situations, pensez-y :<br />
<a href="http://docs.jquery.com/DOM/Traversing/Selectors#Custom_Selectors" lang="en">Documentation des sélecteurs propres à jQuery</a></p>
<p>Chemise sous le chapeau, il est possible de <a href="http://docs.jquery.com/DOM/Traversing/Selectors#Using_CSS_and_XPath_Together" lang="en">combiner les différents types de sélecteurs</a> que nous venons de voir, dans une même requête !</p>
<p>Voilà, nous avons vu comment remplir notre boîte magique, nous verrons lors du prochain article comment remuer tout ça !</p>
<p>Quelques jQueryfiseries :</p>
<ul>
<li><a href="http://jquery.com/" title="Site officiel de jQuery">Site de jQuery</a></li>
<li><a href="http://docs.jquery.com/Main_Page" title="Documentation de jQuery">Documentation de jQuery</a></li>
<li><a href="http://jquery.com/blog/" title="Blog officiel de jQuery">Blog officiel de jQuery</a></li>
<li><a href="http://docs.jquery.com/Tutorials" title="Tutoriels jQuery">Tutoriels jQuery</a></li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>/2007/06/11/inauguration-et-introduction-a-jquery/feed/</wfw:commentRss>
			<slash:comments>20</slash:comments>
		
		
			</item>
	</channel>
</rss>
