<?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>Blog de la rubrique Web &#187; Bovino</title>
	<atom:link href="https://blog.developpez.com/web/pauthor/Bovino/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/web</link>
	<description></description>
	<lastBuildDate>Thu, 16 Jan 2014 14:31:09 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>HTML Media Capture : prenez des photos depuis un champ de formulaire</title>
		<link>https://blog.developpez.com/web/p12432/web/html-media-capture-prenez-des-photos-depuis-un-champ-de-formulaire</link>
		<comments>https://blog.developpez.com/web/p12432/web/html-media-capture-prenez-des-photos-depuis-un-champ-de-formulaire#comments</comments>
		<pubDate>Thu, 16 Jan 2014 14:29:47 +0000</pubDate>
		<dc:creator><![CDATA[Bovino]]></dc:creator>
				<category><![CDATA[(X)HTML/CSS]]></category>
		<category><![CDATA[Astuces]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[W3C]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/web/?p=307</guid>
		<description><![CDATA[HTML Media Capture et l&#8217;attribut capture. Mettez à profit les périphériques de votre mobile pour remplir les champ file HTML5 apporte de nombreuses nouvelles fonctionnalités, notamment concernant les formulaires. Nous allons voir dans ce billet la spécification HTML Media Capture. Celle-ci permet d&#8217;élargir les capacités des champs de formulaires de type file. Jusqu&#8217;à présent, les [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><strong>HTML Media Capture et l&rsquo;attribut capture.</strong><br />
<strong>Mettez à profit les périphériques de votre mobile pour remplir les champ file</strong></p>
<p>HTML5 apporte de nombreuses nouvelles fonctionnalités, notamment concernant les formulaires.</p>
<p>Nous allons voir dans ce billet la spécification <em>HTML Media Capture</em>.<br />
Celle-ci permet d&rsquo;élargir les capacités des champs de formulaires de type <code class="codecolorer text default"><span class="text">file</span></code>.<br />
Jusqu&rsquo;à présent, les champs de formulaires de type <code class="codecolorer text default"><span class="text">file</span></code> permettaient juste d&rsquo;ouvrir une fenêtre pour récupérer dans le système de fichiers celui (ou ceux) à envoyer avec le formulaire.<br />
Il est dorénavant possible d&rsquo;utiliser ces mêmes champs pour utiliser l&rsquo;un des périphériques de capture (audio, vidéo ou image) pour créer le fichier à envoyer.</p>
<p><strong>Comment le mettre en œuvre ?</strong><br />
La mise en place d&rsquo;un tel système est particulièrement simple.<br />
Il suffit d&rsquo;ajouter au champ un attribut <code class="codecolorer text default"><span class="text">capture</span></code> et le tour est joué ! Cet attribut étant de type booléen, c&rsquo;est-à-dire que sa seule présence (sans valeur ou quelle que soit sa valeur) suffit à indiquer au navigateur le comportement souhaité.</p>
<p>Enfin&#8230; il suffit&#8230; pas tant que ça en fait.<br />
En réalité, l&rsquo;attribut <code class="codecolorer text default"><span class="text">capture</span></code> n&rsquo;est pas suffisant, en effet, ce seul attribut ne permet pas de savoir quel type de media est demandé, donc quel périphérique utiliser.<br />
Il est donc nécessaire de préciser aussi l&rsquo;attribut <code class="codecolorer text default"><span class="text">accept</span></code> avec une valeur correspondant au type mime souhaité.</p>
<p>Notez que l&rsquo;attribut <code class="codecolorer text default"><span class="text">capture</span></code> n&rsquo;oblige pas l&rsquo;utilisateur à utiliser un périphérique : il lui est demandé s&rsquo;il veut envoyer un fichier existant ou s&rsquo;il veut utiliser le périphérique approprié.</p>
<p>Exemples.<br />
Voici les trois cas possibles d&rsquo;utilisation à l&rsquo;heure actuelle :</p>
<div class="codecolorer-container html4strict default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/form.html"><span style="color: #000000; font-weight: bold;">form</span></a> <span style="color: #000066;">action</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;...&quot;</span> <span style="color: #000066;">method</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;post&quot;</span> <span style="color: #000066;">enctype</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;multipart/form-data&quot;</span>&gt;</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">&lt;!-- Pour une image (appareil photo) --&gt;</span><br />
&nbsp; &nbsp; <span style="color: #ddbb00;">&amp;lt;</span>input type=&quot;file&quot; name=&quot;image&quot; accept=&quot;image/*&quot; capture<span style="color: #ddbb00;">&amp;gt;</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">&lt;!-- Pour une vidéo (caméra) --&gt;</span><br />
&nbsp; &nbsp; <span style="color: #ddbb00;">&amp;lt;</span>input type=&quot;file&quot; name=&quot;video&quot; accept=&quot;video/*&quot; capture<span style="color: #ddbb00;">&amp;gt;</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">&lt;!-- Pour un son (micro) --&gt;</span><br />
&nbsp; &nbsp; <span style="color: #ddbb00;">&amp;lt;</span>input type=&quot;file&quot; name=&quot;son&quot; accept=&quot;audio/*&quot; capture<span style="color: #ddbb00;">&amp;gt;</span><br />
&nbsp; &nbsp; <span style="color: #ddbb00;">&amp;lt;</span>input type=&quot;submit&quot; value=&quot;Upload&quot;<span style="color: #ddbb00;">&amp;gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/form.html"><span style="color: #000000; font-weight: bold;">form</span></a>&gt;</span></div></div>
<p><strong>Compatibilité.</strong><br />
À l&rsquo;heure actuelle, seuls les navigateurs pour mobiles et tablettes semblent supporter cette fonctionnalité.<br />
<a href="http://mobilehtml5.org/">Voir la table de compatibilité pour mobiles</a>.<br />
Mais gageons que les versions desktop des navigateurs vont l&rsquo;implémenter rapidement.</p>
<p><a href="http://www.w3.org/TR/html-media-capture/">Voir les spécifications du W3C</a> (comprenant des exemples plus avancés).</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Forcer le chargement d&#8217;un fichier en HTML5</title>
		<link>https://blog.developpez.com/web/p12304/php/forcer-le-chargement-dun-fichier-en-html5</link>
		<comments>https://blog.developpez.com/web/p12304/php/forcer-le-chargement-dun-fichier-en-html5#comments</comments>
		<pubDate>Thu, 31 Oct 2013 15:37:20 +0000</pubDate>
		<dc:creator><![CDATA[Bovino]]></dc:creator>
				<category><![CDATA[(X)HTML/CSS]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[W3C]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/web/?p=298</guid>
		<description><![CDATA[Lorsque vous proposez une ressource aux visiteurs de votre site (images, documents PDF ou autres, etc.), les navigateurs vont essayer de les afficher via des fonctionnalités intégrées ou des extensions/plugins. Or, si vous souhaitez juste proposer ces ressources au téléchargement, vous serez obligé de &#171;&#160;forcer la main&#160;&#187; au navigateur côté serveur : solution en PHP [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Lorsque vous proposez une ressource aux visiteurs de votre site (images, documents PDF ou autres, etc.), les navigateurs vont essayer de les afficher via des fonctionnalités intégrées ou des extensions/plugins.<br />
Or, si vous souhaitez juste proposer ces ressources au téléchargement, vous serez obligé de &laquo;&nbsp;forcer la main&nbsp;&raquo; au navigateur côté serveur :</p>
<ul>
<li><a href="http://php.developpez.com/faq/?page=fichiers_upload#fichiers_forcedownload" title="solution en PHP">solution en PHP</a> ;</li>
<li><a href="http://javaweb.developpez.com/faq/struts/?page=files#download" title="solution en Java">solution en Java</a> ;</li>
<li><a href="http://dotnet.developpez.com/faq/asp/csharp/?page=navigationgeneral#downloadcurrentwindow" title="solution en C#">solution en C#</a>.</li>
</ul>
<p>En gros, la technique consiste à associer au fichier souhaité un en-tête HTTP <code class="codecolorer text default"><span class="text">Content-Disposition</span></code> qui indiquera que celui-ci doit être téléchargé et non affiché.</p>
<p>Bien entendu, si votre page est uniquement en (X)HTML, vous êtes de la revue ! La seule technique possible est de transformer votre fichier dans un format qui ne peut être affiché par le navigateur (la technique la plus classique étant de le compresser en archive zip).</p>
<p>Mais cela, c&rsquo;était avant.<br />
Car désormais, HTML5 vous permet de rendre vos fichiers téléchargeables, quel que soit leur format, de façon très simple.</p>
<p>Il suffit d&rsquo;utiliser l&rsquo;attribut <code class="codecolorer text default"><span class="text">download</span></code>.<br />
<span id="more-298"></span><br />
<strong>Comment s&rsquo;utilise cet attribut ?</strong><br />
Le plus simplement du monde : en l&rsquo;intégrant à la balise <code class="codecolorer html4strict default"><span class="html4strict"><span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/a.html"><span style="color: #000000; font-weight: bold;">a</span></a>&gt;</span></span></code> ou <code class="codecolorer html4strict default"><span class="html4strict"><span style="color: #009900;">&lt;area&gt;</span></span></code> !</p>
<p><strong>Quelle valeur donner à cet attribut ?</strong><br />
Celle que vous souhaitez.<br />
Plus exactement, la valeur va correspondre au nom de fichier présélectionné dans la fenêtre de téléchargement, mais si vous ne précisez pas de valeur (<code class="codecolorer html4strict default"><span class="html4strict">download</span></code>) ou si vous mettez une valeur vide (<code class="codecolorer html4strict default"><span class="html4strict">download=&quot;&quot;</span></code>), alors le nom de fichier par défaut sera celui du fichier original.<br />
Exemples :</p>
<div class="codecolorer-container html4strict default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/a.html"><span style="color: #000000; font-weight: bold;">a</span></a> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;foo.png&quot;</span>&gt;</span>Enregistrer<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/a.html"><span style="color: #000000; font-weight: bold;">a</span></a>&gt;</span><br />
<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/a.html"><span style="color: #000000; font-weight: bold;">a</span></a> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;foo.png&quot;</span>&gt;</span>Enregistrer<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/a.html"><span style="color: #000000; font-weight: bold;">a</span></a>&gt;</span><br />
<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/a.html"><span style="color: #000000; font-weight: bold;">a</span></a> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;foo.png&quot;</span>&gt;</span>Enregistrer<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/a.html"><span style="color: #000000; font-weight: bold;">a</span></a>&gt;</span></div></div>
<p><strong>Quels types de fichiers peuvent être téléchargés ?</strong><br />
Il n&rsquo;y a pas de restriction sur les types de fichiers que vous pouvez proposer en téléchargement, néanmoins, ils devront respecter la <em>Same Origin Policy</em> (même domaine, même TLD, même sous domaine, même protocole, même port).<br />
Notez aussi que vous pouvez proposer en téléchargement des fichiers encodés en base64, donc en particulier des fichiers générés depuis le navigateur.</p>
<p><strong>Mais alors, mes codes serveur peuvent être téléchargés ?</strong><br />
Bien sûr que non, heureusement !<br />
Si vous demandez un fichier .php par exemple sur le serveur, celui-ci sera d&rsquo;abord interprété avant d&rsquo;être envoyé. Ce sera donc le fichier généré qui sera récupéré et non le fichier contenant le code source.<br />
Il est donc en revanche possible de proposer de télécharger des fichiers images (par exemples) générés dynamiquement sur le serveur.</p>
<p><strong>Quel est le support des navigateur ?</strong><br />
C&rsquo;est le bémol concernant cet attribut&#8230;<br />
À l&rsquo;heure actuelle, seuls Firefox, Chrome et Opera (en version desktop ou mobile) ne reconnaissent cet attribut, pour les autres navigateurs, vous devrez passer par une solution de contournement.</p>
<p><strong>Comment savoir si un navigateur prend en charge download ?</strong><br />
Il est possible, avec JavaScript, de détecter si la fonctionnalité est supportée, pour cela, on crée un nouvel élément <code class="codecolorer html4strict default"><span class="html4strict"><span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/a.html"><span style="color: #000000; font-weight: bold;">a</span></a>&gt;</span></span></code> et on vérifie s&rsquo;il possède une propriété <code class="codecolorer html4strict default"><span class="html4strict">download</span></code> :</p>
<div class="codecolorer-container javascript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> testA <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'a'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'download'</span> <span style="color: #000066; font-weight: bold;">in</span> testA<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">// Le navigateur supporte l'attribut download</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #000066; font-weight: bold;">else</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">// Le navigateur ne supporte pas l'attribut download</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p><a href="http://dmouronval.developpez.com/download/" title="Voir une page d'exemple">Voir une page d&rsquo;exemple</a>.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML5 : quelques nouveautés de l&#8217;API DOM pour JavaScript</title>
		<link>https://blog.developpez.com/web/p11267/web/html5_quelques_nouveautes_de_l_api_dom_p</link>
		<comments>https://blog.developpez.com/web/p11267/web/html5_quelques_nouveautes_de_l_api_dom_p#comments</comments>
		<pubDate>Fri, 31 Aug 2012 13:55:31 +0000</pubDate>
		<dc:creator><![CDATA[Bovino]]></dc:creator>
				<category><![CDATA[(X)HTML/CSS]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[W3C]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[La spécification HTML5 définit différents modules indépendants. Cette modularité a pour avantage de permettre de travailler sur certains aspects du standard sans avoir besoin de se soucier de l&#8217;état d&#8217;avancement des autres. Parmi ces modules, l&#8217;API DOM est celui qui permet de définir les propriétés et méthodes disponibles en JavaScript pour manipuler le DOM. Nous [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>La spécification HTML5 définit différents modules indépendants. Cette modularité a pour avantage de permettre de travailler sur certains aspects du standard sans avoir besoin de se soucier de l&rsquo;état d&rsquo;avancement des autres.<br />
Parmi ces modules, l&rsquo;API DOM est celui qui permet de définir les propriétés et méthodes disponibles en JavaScript pour manipuler le DOM.<br />
Nous allons voir les différentes nouveautés particulièrement utiles de cette API.<br />
<span id="more-79"></span></p>
<ul>
<li>Standardisation de <strong>innerHTML</strong></li>
</ul>
<p>Introduite par Internet Explorer 4 (de mémoire&#8230;), la propriété <strong>innerHTML</strong> permet de définir le contenu d&rsquo;un élément en lui affectant sous forme de chaine une portion de code HTML.</p>
<div class="codecolorer-container javascript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">HTMLElement.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'&lt;p&gt;chaine HTML&lt;/p&gt;'</span></div></div>
<p><em>Notez qu&rsquo;il s&rsquo;agit d&rsquo;une propriété et non d&rsquo;une méthode, on l&rsquo;utilise donc sous forme d&rsquo;une affectation et non comme un appel de fonction.</em><br />
Bien que propriétaire IE, cette propriété (sic) s&rsquo;est largement répandue sur les autres navigateurs et est depuis longtemps largement compatible.<br />
Elle est désormais standardisée (<a href="http://www.w3.org/TR/html5/embedded-content-0.html#dom-innerhtml">innerHTML</a>) et fait pleinement partie de la spécification HTML5.</p>
<ul>
<li><strong>getElementsByClassName()</strong></li>
</ul>
<p>Nous connaissions déjà les classiques <em>getElementById()</em>, <em>getElementsByName()</em> et <em>getElementsByTagName()</em>, mais beaucoup de développeurs ont longtemps regretté l&rsquo;absence de possibilité de recherche d&rsquo;éléments à partir d&rsquo;un nom de classe (ce qui amenait souvent à utiliser une bibliothèque JavaScript pour pallier ce manque).<br />
C&rsquo;est désormais rectifié avec l&rsquo;apparition de la méthode <strong>getElementsByClassName()</strong>.<br />
Cette méthode peut être appliquée à l&rsquo;objet <em>document</em> ou à un objet <em>HTMLElement</em>. Comme le &lsquo;s&rsquo; de &lsquo;elements&rsquo; le laisse supposer, elle retourne une collection d&rsquo;éléments (il est donc nécessaire de faire une boucle sur la collection pour traiter individuellement chaque élément).<br />
Il est possible de spécifier plusieurs noms de classe pour un élément séparés par des espaces, la méthode prend bien entendu en compte cette subtilité.</p>
<div class="codecolorer-container javascript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> coll <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementsByClassName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'classe'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
<span style="color: #003366; font-weight: bold;">var</span> coll <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'un_id'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">getElementsByClassName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'classe'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>Cette méthode est accessible sur tous les navigateurs récents, y compris Internet Explorer depuis sa version 8.</p>
<ul>
<li><strong>querySelector()</strong> / <strong>querySelectorAll()</strong></li>
</ul>
<p>Ces deux nouvelles méthodes font leur apparition avec un fonctionnement un peu différent des précédentes.<br />
Les méthodes du type <em>getElement[s]By&#8230;</em> prennent comme argument une chaine correspondant au type d&rsquo;élément recherché (un id, un nom de balise, de classe ou un name).<br />
Les méthodes <strong>querySelector()</strong> et <strong>querySelectorAll()</strong> prennent quant à elles en argument une chaine qui correspond à un sélecteur CSS.<br />
Normalement, toute chaine pouvant servir de sélecteur en CSS est acceptée, y compris les plus complexes. Nous ne listerons pas ici les différents sélecteurs possibles, je vous laisse faire vos propres tests.<br />
Ces méthodes s&rsquo;appliquent soit à l&rsquo;objet <em>document</em>, soit à un objet <em>HTMLElement</em>.<br />
querySelector() renvoie un élément HTML qui correspond au premier élément trouvé dans le DOM correspondant au sélecteur, son résultat peut donc être exploité directement.<br />
querySelectorAll() renvoie une collection d&rsquo;éléments HTML correspondant à tous les éléments correspondant au sélecteur. Pour traiter son résultat, il faudra donc faire une boucle sur chacun de ses membres.</p>
<div class="codecolorer-container javascript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> complexSelection <span style="color: #339933;">=</span> document.<span style="color: #660066;">querySelector</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'.aChoisir ul[title=&quot;Liste à puce&quot;], li &amp;gt; a[href^=www]'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
<span style="color: #003366; font-weight: bold;">var</span> allImportantDivInMyParagraph <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'My'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">querySelectorAll</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'div.important'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>Ces méthodes sont disponibles sur tous les navigateurs modernes y compris Internet Explorer depuis la version 9.</p>
<ul>
<li><strong>matchesSelector()</strong></li>
</ul>
<p>Cette méthode permet de vérifier si un élément correspond à un sélecteur CSS. Tout comme les précédentes, elle prend en argument une chaine correspondant à un sélecteur. Elle renvoie un booléen.</p>
<div class="codecolorer-container javascript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> el1 <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'elem1'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
<span style="color: #003366; font-weight: bold;">var</span> el2 <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'div'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <br />
<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>el1.<span style="color: #660066;">matchesSelector</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'h1'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">// traitement si l'élément est un titre de niveau 1 </span><br />
<span style="color: #009900;">&#125;</span> <br />
<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>el2.<span style="color: #660066;">matchesSelector</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#toto'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">// traitement si la première div du document possède l'id &quot;toto&quot; </span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>Cette méthode est disponible sur tous les navigateurs récents y compris Internet Explorer depuis la version 9, cependant, seules les versions préfixées sont reconnues : <em>mozMatchesSelector()</em>, <em>webkitMatchesSelector()</em>, <em>oMatchesSelector()</em> et <em>msMatchesSelector()</em>.</p>
<ul>
<li>L&rsquo;interface <strong>classList</strong></li>
</ul>
<p>Jusqu&rsquo;à présent, pour manipuler les classes CSS d&rsquo;un élément, il était nécessaire d&rsquo;utiliser des méthodes assez complexes, que ce soit pour vérifier la présence d&rsquo;un nom de classe, pour en ajouter ou en retirer. Il fallait utiliser le plus souvent des expressions régulières et se méfier des erreurs possibles (typiquement, qu&rsquo;une recherche sur &laquo;&nbsp;classe&nbsp;&raquo; ne renvoie pas vrai si l&rsquo;élément possède la classe &laquo;&nbsp;classeN&nbsp;&raquo;).<br />
L&rsquo;interface <strong>classList</strong> permet de simplifier tout cela.<br />
Elle s&rsquo;applique à un élément HTML et renvoie une collection de ses noms de classe.</p>
<div class="codecolorer-container javascript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> allClasses <span style="color: #339933;">=</span> HTMLElement.<span style="color: #660066;">classList</span><span style="color: #339933;">;</span></div></div>
<p>Elle dispose aussi de plusieurs méthodes permettant de manipuler cette liste de classes :</p>
<ul>
<li><strong>add()</strong> permet d&rsquo;ajouter un nom de classe à l&rsquo;élément ;</li>
<li><strong>remove()</strong> permet de retirer un nom de classe à l&rsquo;élément ;</li>
<li><strong>toggle()</strong> permet d&rsquo;ajouter un nom de classe si l&rsquo;élément ne la possède pas, à le retirer sinon ;</li>
<li><strong>contains()</strong> permet de vérifier l&rsquo;existence d&rsquo;un nom de classe parmi celles de l&rsquo;élément.</li>
</ul>
<p>Cette interface est disponible sur tous les navigateurs modernes à l&rsquo;exception d&rsquo;Internet Explorer avant la version 10.</p>
<ul>
<li><strong>Conclusion</strong></li>
</ul>
<p>Ces différentes propriétés et méthodes apportent beaucoup aux développeurs pour ce qui est de la manipulation du DOM. Cependant, il me semble que de nombreuses méthodes utiles ont été oubliées, que ce soit en rapport à l&rsquo;insertion d&rsquo;éléments dans le DOM, à la possibilité de faire des recherches en remontant l&rsquo;arborescence (retrouver facilement un élément à partir d&rsquo;un de ses descendants). Espérons que les futures implémentations combleront ces manques en s&rsquo;inspirant, par exemple, des différentes bibliothèques JavaScript.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Personnalisez le menu contextuel avec Firefox</title>
		<link>https://blog.developpez.com/web/p10804/web/personnalisez_le_menu_contextuel_avec_fi</link>
		<comments>https://blog.developpez.com/web/p10804/web/personnalisez_le_menu_contextuel_avec_fi#comments</comments>
		<pubDate>Thu, 08 Mar 2012 15:30:06 +0000</pubDate>
		<dc:creator><![CDATA[Bovino]]></dc:creator>
				<category><![CDATA[(X)HTML/CSS]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[HTML5 redéfinit certains aspects et certaines balises du HTML. Parmi les éléments qui retrouvent une nouvelle jeunesse figure la balise menu. Bien sûr, évoquer cette balise ne présente que peu d&#8217;intérêt puisqu&#8217;elle n&#8217;est, à l&#8217;heure actuelle (et sauf erreur de ma part) reconnue par aucun navigateur&#8230; Par aucun navigateur ? Vraiment ? En fait, pas [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>HTML5 redéfinit certains aspects et certaines balises du HTML.<br />
Parmi les éléments qui retrouvent une nouvelle jeunesse figure la balise <a href="http://www.w3.org/TR/html5/interactive-elements.html#the-menu-element" title="W3C">menu</a>.<br />
Bien sûr, évoquer cette balise ne présente que peu d&rsquo;intérêt puisqu&rsquo;elle n&rsquo;est, à l&rsquo;heure actuelle (et sauf erreur de ma part) reconnue par aucun navigateur&#8230;</p>
<p><strong>Par aucun navigateur ? Vraiment ?</strong></p>
<p>En fait, pas tout à fait : parmi les différentes utilisations de la balise <em>menu</em>, une est utilisable par Firefox depuis la version 8 : la personnalisation du menu contextuel lié à un élément de la page (ou de la page elle-même).</p>
<p>La syntaxe de la balise <em>menu</em> est la suivante :</p>
<div class="codecolorer-container html4strict default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&lt;menu <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;...&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;...&quot;</span>&gt;</span></div></div>
<p>où <code class="codecolorer text default"><span class="text">type</span></code> correspond au comportement attendu pour le menu et <code class="codecolorer text default"><span class="text">id</span></code> l&rsquo;identifiant du menu.<br />
Cette balise peut (dans le cadre du menu contextuel) contenir soit des sous-menus représentés par une nouvelle balise <code class="codecolorer text default"><span class="text">menu</span></code> soit des éléments de menu représentés par des balises <code class="codecolorer text default"><span class="text">menuitem</span></code>.</p>
<p>Bon, assez d&rsquo;explications théoriques, passons à la pratique avec un exemple :</p>
<div class="codecolorer-container html4strict default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&lt;menu <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;context&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;developpez&quot;</span>&gt;</span> <br />
&nbsp; &nbsp;<br />
&nbsp; <span style="color: #009900;">&lt;menu&gt;</span> <br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>menu&gt;</span> <br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>menu&gt;</span></div></div>
<p>Dans cet exemple (relativement simple), nous ajoutons des liens vers developpez.com et différents forums du site.<br />
Vous pouvez constater que le type de menu est <code class="codecolorer text default"><span class="text">context</span></code> pour préciser qu&rsquo;il s&rsquo;agit de personnaliser le menu contextuel.<br />
D&rsquo;autre part, le sous-menu et les éléments des menus possèdent des attributs <code class="codecolorer text default"><span class="text">label</span></code> indiquant le texte à afficher correspondant à chaque option.<br />
Les éléments de menus possèdent quant à eux des attributs <code class="codecolorer text default"><span class="text">icon</span></code> (image apposée à côté de l&rsquo;élément) et <code class="codecolorer text default"><span class="text">onclick</span></code> (action JavaScript à lancer au clic sur cet élément).</p>
<p>Pour autant, vous aurez beau ajouter cette portion de code dans votre page et faire des clics droits partout dans la page (sur Firefox bien entendu) pour tester, rien ne se passera !<br />
En fait, nous avons oublié l&rsquo;essentiel : déterminer à quel élément de la page le menu contextuel est associé.<br />
Pour préciser cela, il suffit d&rsquo;ajouter un attribut <code class="codecolorer text default"><span class="text">contextmenu</span></code> à l&rsquo;élément souhaité. La valeur de cet attribut doit correspondre à l&rsquo;identifiant (attribut <code class="codecolorer text default"><span class="text">id</span></code>) du menu.<br />
Dans l&rsquo;exemple suivant, nous posons cet attribut sur la balise <code class="codecolorer text default"><span class="text">body</span></code> afin que le menu contextuel s&rsquo;applique sur toute la page :</p>
<div class="codecolorer-container html4strict default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/title.html"><span style="color: #000000; font-weight: bold;">title</span></a>&gt;</span>Menu contextuel<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/title.html"><span style="color: #000000; font-weight: bold;">title</span></a>&gt;</span> <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; html, body{ <br />
&nbsp; &nbsp; &nbsp; height: 100% <br />
&nbsp; &nbsp; } <br />
&nbsp; &nbsp; h1{ <br />
&nbsp; &nbsp; &nbsp; text-align: center; <br />
&nbsp; &nbsp; } <br />
&nbsp; &nbsp;<br />
&nbsp;<br />
&nbsp;<br />
&nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/h1.html"><span style="color: #000000; font-weight: bold;">h1</span></a>&gt;</span>Exemple de menu contextuel personnalisé<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/h1.html"><span style="color: #000000; font-weight: bold;">h1</span></a>&gt;</span> <br />
&nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a>&gt;</span>Faites un clic droit dans la page pour voir les options ajoutées au menu contextuel.<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a>&gt;</span> <br />
<span style="color: #009900;">&lt;menu <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;context&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;developpez&quot;</span>&gt;</span> <br />
&nbsp; &nbsp;<br />
&nbsp; <span style="color: #009900;">&lt;menu&gt;</span> <br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>menu&gt;</span> <br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>menu&gt;</span></div></div>
<p>Notre exemple est maintenant fonctionnel. Vous pouvez voir <a href="http://dmouronval.developpez.com/menu/" title="Exemple en ligne">un exemple en ligne</a>.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Comprendre la balise script</title>
		<link>https://blog.developpez.com/web/p10687/web/comprendre_la_balise_alt_scriptg_1</link>
		<comments>https://blog.developpez.com/web/p10687/web/comprendre_la_balise_alt_scriptg_1#comments</comments>
		<pubDate>Tue, 31 Jan 2012 20:58:20 +0000</pubDate>
		<dc:creator><![CDATA[Bovino]]></dc:creator>
				<category><![CDATA[(X)HTML/CSS]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[S&#8217;il est bien une balise qui est souvent mal utilisée en HTML, c&#8217;est la balise &#60;script&#62;. Nous allons essayer dans ce billet de faire le point sur cette balise en comprenant pourquoi. La syntaxe La syntaxe de base est relativement simple et ne pose pas de problème : &#160; Il est toutefois important de noter [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>S&rsquo;il est bien une balise qui est souvent mal utilisée en HTML, c&rsquo;est la balise <em>&lt;script&gt;</em>.<br />
Nous allons essayer dans ce billet de faire le point sur cette balise en comprenant pourquoi.</p>
<ul>
<li><strong>La syntaxe</strong></li>
</ul>
<p>La syntaxe de base est relativement simple et ne pose pas de problème :<br />
<code class="codecolorer text default"><span class="text">&nbsp;</span></code><br />
Il est toutefois important de noter que même si elle ne possède pas forcément de contenu, elle reste susceptible d&rsquo;en avoir (le script en lui-même) ce qui fait que contrairement à une balise <em></em> mais à l&rsquo;instar d&rsquo;une balise <em></em>, elle n&rsquo;est pas autofermante et doit posséder une balise fermante.</p>
<ul>
<li><strong>Les attributs</strong></li>
</ul>
<p>L&rsquo;attribut <em>src</em> ne pose habituellement pas de gros soucis.<br />
Cet attribut correspond à l&rsquo;URL à laquelle se trouve le fichier correspondant. Attention toutefois, dans le cas d&rsquo;une URL relative, de bien comprendre où se trouve le script en fonction de l&rsquo;URL effective (celle affichée par le navigateur) qui appellera le script. Attention donc par exemple aux <em>include</em> en PHP.</p>
<p>En revanche, deux attributs sont assez souvent confondus, il s&rsquo;agit des attributs <em>language</em> et <em>type</em>.<br />
Il faut déjà savoir que le premier est <em>deprecated</em> depuis HTML 4 alors qu&rsquo;au contraire, le second est <em>required</em>. Cela signifie qu&rsquo;il faut bannir <em>language</em>.<br />
La syntaxe correcte devient donc<br />
<code class="codecolorer text default"><span class="text">&nbsp;</span></code><br />
Mais alors, si l&rsquo;attribut <em>language</em> est à bannir, pourquoi le retrouve-t-on si souvent ?<br />
D&rsquo;abord, parce que malheureusement, plusieurs facteurs empêchent de l&rsquo;éradiquer.<br />
Déjà, de nombreux scripts usuels sont bien référencés et recopiés tels quels bien que très anciens. Du coup, l&rsquo;attribut se propage facilement.<br />
D&rsquo;autre part, peut-être surtout, parce que beaucoup ignorent la signification de cet attribut.<br />
A la base, il servait à indiquer le langage et la version du langage de script utilisé. Cependant, aucune norme n&rsquo;a été trouvée pour savoir ce qu&rsquo;il pouvait bien contenir, ce qui a donc amené à ce qu&rsquo;il soit déprécié. De toute façon, le seul langage de script universellement reconnu par les navigateurs est JavaScript (quelle que soit sa déclinaison : ECMAScript, JScript, &#8230;) donc l&rsquo;information n&rsquo;a que peu d&rsquo;intérêt. De même, préciser une version à utiliser n&rsquo;a pas vraiment de sens : JavaScript, pour des raisons de rétro-compatibilté ne perd pas de fonctionnalités, il ne fait qu&rsquo;en accepter de nouvelles !</p>
<p><strong>Note :</strong> en HTML5, l&rsquo;attribut <em>type</em> n&rsquo;est plus requis et dans cette version, la syntaxe<br />
<code class="codecolorer text default"><span class="text">&nbsp;</span></code><br />
est désormais suffisante.</p>
<ul>
<li><strong>Le contenu</strong></li>
</ul>
<p>Pendant longtemps (et on retrouve encore couramment la syntaxe), les scripts étaient entourés soit de commentaires HTML soit d&rsquo;entités <em>CDATA</em> :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;!-- <br />
&nbsp; &nbsp; // Code JavaScript <br />
--&gt;</div></div>
<p>Là encore, la pratique remonte à un temps que les moins de 20 ans (voire plus !) n&rsquo;ont pas connue !<br />
Ces syntaxes, héritées du XML, servaient à l&rsquo;origine à éviter que les navigateurs ne possédant pas d&rsquo;interpréteur JavaScript (on ne parle pas de ceux qui ont JavaScript désactivé, bien de ceux pour lesquels JavaScript n&rsquo;existe tout simplement pas !) n&rsquo;essayent d&rsquo;interpréter le contenu du script comme du HTML. De mémoire, on parle là de IE3 et de NS3. Il me semble que la part de marché de ces navigateurs atteint depuis longtemps un seuil qui rend cette technique quelque peu obsolète !</p>
<ul>
<li><strong>Où placer les scripts ?</strong></li>
</ul>
<p>Plusieurs écoles s&rsquo;affrontent à ce niveau.<br />
Une chose est sure : il est demandé de séparer les différentes couches du document : le HTML pour le contenu, le CSS pour la mise en forme et le JavaScript pour l&rsquo;ergonomie (ou le le comportement). Ainsi, insérer ses scripts en plein milieu du document est assez maladroit.<br />
Pendant un temps, les bonnes pratiques recommandaient de placer les scripts entre les balises <em>&lt;head&gt;</em> et de les initialiser via l&rsquo;événement <em>onload</em> de l&rsquo;objet <em>window</em>.<br />
Cette façon de procéder est plutôt satisfaisante mais l&rsquo;événement <em>onload</em> implique que l&rsquo;ensemble du contenu de la page soit chargé avant de lancer les scripts (donc y compris les éléments dits remplacés : images, iframes, object, etc.) et comme les pages Web deviennent de plus en plus gourmandes en ressources externes, cela fini par nuire à l&rsquo;expérience utilisateur.<br />
Différentes techniques existent pour pallier cela, entre autre, l&rsquo;utilisation de l&rsquo;événement <em>DOMContentLoaded</em>, mais qui n&rsquo;est pas (encore) suffisamment universel pour être totalement satisfaisant.<br />
La problématique est que pour pouvoir utiliser un script, il faut que les éléments du DOM qu&rsquo;il va utiliser existent au moment où il est appelé. Une solution efficace est alors de placer les scripts juste avant la fermeture du document (avant la balise <em>&lt;/body&gt;</em>), ce qui permet d&rsquo;être sûr que les éléments du DOM ont été créés et de conserver la notion de séparation des couches.<br />
Gardez toutefois à l&rsquo;esprit que quelle que soit la solution choisie, elle aura une importance majeure lors de l&rsquo;écriture de codes destinés à être réutilisés.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Comprendre document.write() en JavaScript</title>
		<link>https://blog.developpez.com/web/p10659/web/comprendre_document_write_en_javascript</link>
		<comments>https://blog.developpez.com/web/p10659/web/comprendre_document_write_en_javascript#comments</comments>
		<pubDate>Wed, 18 Jan 2012 19:47:56 +0000</pubDate>
		<dc:creator><![CDATA[Bovino]]></dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[S&#8217;il est bien une méthode méconnue en JavaScript, c&#8217;est la méthode write() de l&#8217;objet document. La syntaxe est pourtant simple : document.write(arg1, arg2, ..., argn); Les arguments attendus sont des chaînes de caractères (ou tout du moins des arguments possédant une méthode toString()) Vous noterez au passage que le nombre de paramètres que l&#8217;on peut [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>S&rsquo;il est bien une méthode méconnue en JavaScript, c&rsquo;est la méthode <em>write()</em> de l&rsquo;objet <em>document</em>.</p>
<p>La syntaxe est pourtant simple :<br />
<code class="codecolorer text default"><span class="text">document.write(arg1, arg2, ..., argn);</span></code><br />
Les arguments attendus sont des chaînes de caractères (ou tout du moins des arguments possédant une méthode <em>toString()</em>)<br />
Vous noterez au passage que le nombre de paramètres que l&rsquo;on peut passer à cette méthode est indéterminé.<br />
L&rsquo;instruction précédente aura pour effet d&rsquo;ajouter la valeur de chaque paramètre dans la page.<br />
Par exemple<br />
<code class="codecolorer text default"><span class="text">document.write('toto', 12, [1,2,3]);</span></code><br />
affichera :</p>
<blockquote><p>toto121,2,3</p></blockquote>
<p>Notez que chaque argument est ajouté à la suite du précédent sans insérer de séparateur.<br />
Malgré tout, certaines valeurs affichent un résultat inattendu :<br />
<code class="codecolorer text default"><span class="text">document.write(false, {toto: 'tata', foo: 'bar'});</span></code><br />
affichera :</p>
<blockquote><p>false[object Object]</p></blockquote>
<p>c&rsquo;est-à-dire qu&rsquo;un booléen ne sera pas transformé en 0 ou 1 mais en <em>false</em> ou <em>true</em> et un objet affichera (en fonction du navigateur) <em>[object Object]</em>.</p>
<p>Jusque là, rien de vraiment compliqué à comprendre, d&rsquo;autant que l&rsquo;on passe habituellement un seul paramètre correspondant à une chaîne à afficher.</p>
<p>Cependant, le comportement de cette méthode dépend de l&rsquo;état du document au moment de son appel.<br />
En effet, un document HTML peut avoir deux états distincts : ouvert ou fermé.<br />
Lorsque le navigateur reçoit un contenu HTML à afficher, il commence par ouvrir un document (le flux) puis interprète le code HTML en affichant son contenu et en construisant le DOM et une fois l&rsquo;intégralité du code interprété, il ferme le document.<br />
Pendant que le document est ouvert, si le navigateur rencontre une instruction JavaScript <em>write()</em>, alors ses arguments sont insérés à l&rsquo;emplacement de cette instruction dans le code.<br />
C&rsquo;est le comportement attendu de cette méthode.<br />
Mais il faut savoir que <em>document.write()</em> a besoin que le document soit ouvert pour pouvoir fonctionner correctement. Que se passe-t-il alors si le document est fermé ?<br />
Dans ce cas, JavaScript va appeler en interne l&rsquo;instruction <em>document.open()</em> puis exécuter le <em>write()</em>.<br />
Or <em>document.open()</em> correspond à l&rsquo;ouverture du flux d&rsquo;affichage, ce qui signifie que l&rsquo;appel à cette méthode va recréer un nouveau flux, en commençant par supprimer l&rsquo;existant.<br />
Pour vous en convaincre, ouvrez une console JavaScript (par exemple Firebug pour Firefox) et dans la ligne de commande, tapez l&rsquo;instruction<br />
<code class="codecolorer text default"><span class="text">document.open();</span></code><br />
et vous constaterez que la page va devenir blanche. Au passage, vous noterez aussi que l&rsquo;indicateur de chargement se met en place (à la place du favicon), ce qui est le cas lorsque le flux est ouvert.<br />
De la même manière, si vous entrez<br />
<code class="codecolorer text default"><span class="text">document.write('Hello world !');</span></code><br />
dans la console, vous constaterez que l&rsquo;ensemble du contenu a été remplacé par le message &laquo;&nbsp;Hello world !&nbsp;&raquo;. Vous pourrez aussi vérifier que l&rsquo;indicateur de chargement est toujours actif : le document n&rsquo;a pas été refermé.<br />
Si ensuite vous entrez l&rsquo;instruction<br />
<code class="codecolorer text default"><span class="text">document.close();</span></code><br />
dans la console, l&rsquo;indicateur de chargement disparaitra au profit du favicon par défaut.</p>
<p>La première impression que l&rsquo;on pourrait avoir en comprenant ce fonctionnement serait de se dire qu&rsquo;il faut effectivement faire attention au contexte avant d&rsquo;utiliser cette méthode.<br />
En fait, il faut surtout considérer <code class="codecolorer text default"><span class="text">write()</span></code> comme une méthode à bannir.<br />
Déjà, parce qu&rsquo;une méthode dont on ne peut garantir le comportement n&rsquo;est pas à recommander.<br />
Ensuite, parce que les bonnes pratiques en développement Web préconisent de séparer les couches : HTML pour l&rsquo;affichage, CSS pour la mise en forme et JavaScript pour le comportement : utiliser la méthode <code class="codecolorer text default"><span class="text">write()</span></code> implique d&rsquo;introduire au niveau de l&rsquo;affichage du JavaScript qui n&rsquo;a rien à y faire, surtout que pour manipuler le document, de nombreuses méthodes du DOM sont disponibles et beaucoup plus fiables.<br />
On pourrait aussi évoquer le fait que l&rsquo;utilisation de <code class="codecolorer text default"><span class="text">write()</span></code> interdit l&rsquo;accès aux informations à ceux qui, pour une raison quelconque, ont JavaScript désactivé. Mais surtout, son utilisation (et son existence) force les navigateurs à une pratique particulièrement désagréable et dommageable qui est le chargement des scripts de façon synchrone.<br />
En effet, l&rsquo;affichage de la page doit être garantit par le navigateur, or si un script possède une instruction <code class="codecolorer text default"><span class="text">write()</span></code>, alors il est important de pouvoir prévoir de façon certaine à quel endroit du document ses paramètres seront affichés, c&rsquo;est pour cela que les navigateurs bloquent l&rsquo;interprétation de la page pendant le chargement et l&rsquo;évaluation des scripts (à la différence des autres éléments de la page, comme les images ou les iframes) ce qui retarde d&rsquo;autant l&rsquo;affichage du reste du contenu.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Le &#171;&#160;core&#160;&#187; JavaScript s&#8217;enrichit de nouvelles méthodes.</title>
		<link>https://blog.developpez.com/web/p10401/web/le_core_javascript_s_enrichit_de_nouvell</link>
		<comments>https://blog.developpez.com/web/p10401/web/le_core_javascript_s_enrichit_de_nouvell#comments</comments>
		<pubDate>Fri, 14 Oct 2011 21:15:11 +0000</pubDate>
		<dc:creator><![CDATA[Bovino]]></dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[C&#8217;est une information qui est, il me semble, passée relativement inaperçue mais qui est selon moi assez intéressante à souligner. Le noyau JavaScript, qui était resté longtemps figé, s&#8217;est enrichi avec les dernières versions des navigateurs, de nouvelles méthodes bien utiles. Pour rappel, le noyau JavaScript (aussi appelé core JavaScript), par opposition au DOM JavaScript [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>C&rsquo;est une information qui est, il me semble, passée relativement inaperçue mais qui est selon moi assez intéressante à souligner.<br />
Le noyau JavaScript, qui était resté longtemps figé, s&rsquo;est enrichi avec les dernières versions des navigateurs, de nouvelles méthodes bien utiles.</p>
<p>Pour rappel, le noyau JavaScript (aussi appelé <em>core</em> JavaScript), par opposition au DOM JavaScript (ou JavaScript côté client) regroupe les objets natifs de JavaScript et surtout, la partie censée être commune à toutes ses variations.<br />
Il regroupe en particulier les objets natifs Array et String qui ont vu leur prototype amélioré.<br />
Il est à noter que ces ajouts sont aussi disponibles (sauf mention contraire) dans Internet Explorer depuis la version 9.</p>
<ul>
<li>L&rsquo;objet Array</li>
</ul>
<p><strong>La méthode <em>every()</em></strong><br />
Cette méthode permet d&rsquo;appliquer à tous les membres du tableau une fonction de rappel afin de savoir si tous les éléments du tableau remplissent une condition.<br />
<em>Syntaxe</em><br />
<code class="codecolorer text default"><span class="text">Array.every(callback, thisObjet);</span></code><br />
<em>Exemple</em></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">function isImpair(nb){ <br />
&nbsp; &nbsp; return nb &amp; 1; <br />
} <br />
alert([1,5,17,89].every(isImpair)); <br />
alert([1,5,17,89, 100].every(isImpair));</div></div>
<p><strong>La méthode <em>filter()</em></strong></p>
<p>Comme son nom l&rsquo;indique, cette méthode permet de filtrer les éléments d&rsquo;un tableau selon le résultat renvoyé par une fonction de rappel.<br />
<em>Syntaxe</em><br />
<code class="codecolorer text default"><span class="text">Array.filter(callback, thisObjet);</span></code><br />
<em>Exemple</em></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">function isInferieurADix(nb){ <br />
&nbsp; &nbsp; return nb &lt; 10; <br />
} <br />
alert([2,5,6,8,10,11].filter(isInferieurADix));</div></div>
<p><strong>La méthode <em>forEach()</em></strong><br />
Cette méthode permet d&rsquo;appliquer un traitement à chaque élément du tableau.<br />
<em>Syntaxe</em><br />
<code class="codecolorer text default"><span class="text">Array.forEach(callback, thisObjet);</span></code><br />
<em>Exemple</em></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">var tab = ['a','b','c','d','e'], <br />
&nbsp; &nbsp; resultat = '', <br />
&nbsp; &nbsp; i = 0; <br />
function arrayToString(){ <br />
&nbsp; &nbsp; resultat += 'Rang '+i+'\t\tvaleur : '+this[i]+'\n'; <br />
&nbsp; &nbsp; i++; <br />
} <br />
tab.forEach(arrayToString, tab); <br />
alert(resultat);</div></div>
<p><strong>La méthode <em>map()</em></strong><br />
La méthode <em>map()</em> va appliquer à chaque élément du tableau le traitement de la fonction de rappel.<strong>La méthode <em>map()</em></strong><br />
<em>Syntaxe</em><br />
<code class="codecolorer text default"><span class="text">Array.map(callback, thisObjet);</span></code><br />
<em>Exemple</em></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">var tab = ['a','b','c','d','e']; <br />
function double(val){ <br />
&nbsp; &nbsp; return val + val; <br />
} <br />
alert(tab.map(double));</div></div>
<p><strong>La méthode <em>some()</em></strong><br />
Similaire à la méthode <em>every()</em>, cette méthode va vérifier si au moins un des éléments du tableau est valide selon le résultat renvoyé par la fonction de rappel.<br />
<em>Syntaxe</em><br />
<code class="codecolorer text default"><span class="text">Array.some(callback, thisObjet);</span></code><br />
<em>Exemple</em></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">function isInferieurADix(nb){ <br />
&nbsp; &nbsp; return nb &lt; 10; <br />
} <br />
alert([10,20,30,40,50].some(isInferieurADix)); <br />
alert([5,10,20,30,40,50].some(isInferieurADix));</div></div>
<ul>
<li>L&rsquo;objet String</li>
</ul>
<p>Ces méthodes renvoient la nouvelle chaîne mais ne modifient pas celle d&rsquo;origine.</p>
<p><strong>La méthode <em>trim()</em></strong><br />
Supprime tous les caractères d&rsquo;espacement en début et fin de chaîne.<br />
<em>Syntaxe</em><br />
<code class="codecolorer text default"><span class="text">String.trim();</span></code><br />
<em>Exemple</em></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">var str = '\tTest '; <br />
var strTrimmed = str.trim(); <br />
alert('!'+str+'!\n!'+strTrimmed+'!');</div></div>
<p><strong>La méthode <em>trimRight()</em></strong><br />
Supprime les espacements en fin de chaîne.<br />
<em>Syntaxe</em><br />
<code class="codecolorer text default"><span class="text">String.trimRight();</span></code><br />
<em>Exemple</em></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">var str = '\tTest '; <br />
var strTrimmed = str.trimRight(); <br />
alert('!'+str+'!\n!'+strTrimmed+'!');</div></div>
<p><strong>La méthode <em>trimLeft()</em></strong><br />
Supprime les espacements en début de chaîne.<br />
<strong>Attention :</strong> étonnamment, cette méthode n&rsquo;est pas (encore) disponible pour Internet Explorer et Opera&#8230;<br />
<em>Syntaxe</em><br />
<code class="codecolorer text default"><span class="text">String.trimLeft();</span></code><br />
<em>Exemple</em></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">var str = '\tTest '; <br />
var strTrimmed = str.trimLeft(); <br />
alert('!'+str+'!\n!'+strTrimmed+'!');</div></div>
<p>À noter aussi, pour l&rsquo;objet <strong>Date</strong>, l&rsquo;apparition de la méthode <em>toISOString()</em>.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP Tour Lille 2011</title>
		<link>https://blog.developpez.com/web/p10535/php/php_tour_lille_2011</link>
		<comments>https://blog.developpez.com/web/p10535/php/php_tour_lille_2011#comments</comments>
		<pubDate>Thu, 24 Nov 2011 17:59:36 +0000</pubDate>
		<dc:creator><![CDATA[Bovino]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Voilà enfin arrivé ce jour tant attendu (en tout cas par moi). Je suis donc prêt, bic et carnet en main, à prendre pleins de bonnes notes sur les différents aspects de PHP. 8h30, je suis sur le parking et avance vers le site de Euratecnologies de Lille. Déjà, rien que pour la réaffectation de [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Voilà enfin arrivé ce jour tant attendu (en tout cas par moi). Je suis donc prêt, bic et carnet en main, à prendre pleins de bonnes notes sur les différents aspects de PHP.</p>
<p><strong>8h30</strong>, je suis sur le parking et avance vers le site de Euratecnologies de Lille. Déjà, rien que pour la réaffectation de ce bâtiment, le détour en valait la peine.</p>
<p>Après avoir récupéré mon badge et mon petit cadeau, un éléphant rose (ça va se chamailler à la maison), je me dirige vers l’auditoire pour la <em>keynote</em> présentée par Jean-Marc Fontaine de Alter Way.<br />
La bienvenue nous est souhaitée et la présentation des deux jours nous est narrée, tout en nous présentant l’AFUP et en nous motivant pour ouvrir des antennes dans nos régions (peut-être une bonne idée à creuser là).</p>
<p>Le sujet de la première conférence à laquelle j’ai assisté est la présentation de PHP 5.4 par Julien Pauli, nous expliquant les grandes nouveautés, qui ne se trouvent pas forcément dans le langage, mais bien dans sa construction, avec la mise en place de RFC, permettant à chaque utilisateur d’émettre des changements dans le langage.<br />
Un cycle de vie déterminé de 3 ans par mise à jour majeure et de 1 an pour une mise à jour mineure.<br />
De plus une bonne nouvelle est que la descendance ne sera plus cassée dans les versions mineures.<br />
Bien sûr, les nouveautés liées au langage nous sont présentées, mais cela n’est plus un secret et l’on trouve tout sur developpez.com.<br />
Par contre, Julien nous annonce un gain de performance de l’ordre de 55% par rapport à PHP5.3, avec benchmark à la clé.<br />
Julien nous a promis ses <em>slides</em> sur le site de l’AFUP très prochainement.</p>
<p>Ensuite, j’ai assisté à l’industrialisation du site lamaisondevalerie.fr , faisant partie du groupe <em>Conforama</em>, présentée par Sophie Beaupuis.<br />
Ici expliquer en quelque mots serait difficile tant les infos étaient nombreuses, on a pu voir tout le panel d’outils utilisés pour le développement de son application (très orienté Zend avec la suite de produit complets).<br />
Ce qui était agréable dans cette présentation est que madame Beaupuis s’est mouillée en nous expliquant les freins liés à son projet et a eu l’honnêteté de dire ‘désolée je ne connais pas’.</p>
<p>J’ai pris 5 minutes pour vous faire ces quelques lignes et je remercie Jean Marc Fontaine de m’avoir trouvé un petit Wifi.<br />
Ce soir je vous poste la suite de cette première journée.<br />
Un seul regret actuellement, est de ne pas avoir pris de CV avec moi, parce que les offres d’emploi ici sont palpables… Merci le réseautage !</p>
<p><em>Par <a href="http://www.developpez.net/forums/u66971/maitrepylos/">MaitrePylos</a></em></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Un classique AJAX : utiliser les données au bon moment !</title>
		<link>https://blog.developpez.com/web/p10493/php/un_classique_ajax_utiliser_les_donnees_a</link>
		<comments>https://blog.developpez.com/web/p10493/php/un_classique_ajax_utiliser_les_donnees_a#comments</comments>
		<pubDate>Fri, 11 Nov 2011 13:46:23 +0000</pubDate>
		<dc:creator><![CDATA[Bovino]]></dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[S&#8217;il est une erreur classique chez les débutants en AJAX, que l&#8217;on retrouve régulièrement sur le forum AJAX, c&#8217;est de vouloir utiliser les données du serveur avant de les avoir reçues. Faisons une petite analogie. Imaginons que vous ayez une poule. Tous les matins, vous souhaitez savoir combien d’œufs ont été pondus, vous envoyez donc [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>S&rsquo;il est une erreur classique chez les débutants en AJAX, que l&rsquo;on retrouve régulièrement <a href="http://www.developpez.net/forums/f458/webmasters-developpement-web/ajax/">sur le forum AJAX</a>, c&rsquo;est de vouloir utiliser les données du serveur <strong>avant</strong> de les avoir reçues.</p>
<p>Faisons une petite analogie.<br />
Imaginons que vous ayez une poule. Tous les matins, vous souhaitez savoir combien d’œufs ont été pondus, vous envoyez donc quelqu&rsquo;un les compter.<br />
J&rsquo;imagine, qu&rsquo;au moment même où cette personne part compter les œufs, il ne vous viendrait pas à l&rsquo;esprit de l&rsquo;appeler pour lui demander le compte : la moindre des choses est d&rsquo;attendre qu&rsquo;elle soit revenue car avant, elle ne connait pas l&rsquo;information !</p>
<p>Avec AJAX, c&rsquo;est exactement pareil. Le premier A de l&rsquo;acronyme signifie <em>asynchronous</em> (asynchrone), c&rsquo;est-à-dire que JavaScript ne va pas attendre la réponse du serveur avant de continuer à exécuter le code, sauf bien entendu si vous avez spécifié le mode synchrone.<br />
Ainsi, le seul moment où l&rsquo;on est sûr d&rsquo;avoir reçu la réponse est lorsque la propriété <em>readyState</em> de l&rsquo;objet XMLHttpRequest vaut 4 et que la propriété <em>status</em> correspond à un code de réussite de la requête (classiquement 200). C&rsquo;est pourquoi <strong>tous les traitements se basant sur la réponse du serveur doivent être traités dans le callback de la requête.</strong>.</p>
<p>Avant d&rsquo;écrire son code, il est donc fondamental de se demander si les données que l&rsquo;on veut utiliser existent ou non.</p>
<p>A titre d&rsquo;exemple, un petit code :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">var xhr = new XMLHttpRequest(), monResultat; <br />
xhr.open('POST', url); <br />
xhr.onreadystatechange = function(){ <br />
&nbsp; &nbsp; if(xhr.readyState == 4 &amp;&amp; xhr.status == 200){ <br />
&nbsp; &nbsp; &nbsp; &nbsp; monResultat = xhr.responseText; <br />
&nbsp; &nbsp; &nbsp; &nbsp; alert(monResultat); <br />
&nbsp; &nbsp; } <br />
}; <br />
xhr.send('variable=valeur'); <br />
alert(maVariable);</div></div>
<p>Ici, le premier <em>alert()</em> affiché sera celui de la dernière ligne : JavaScript n&rsquo;attend pas la réponse du serveur pour continuer à exécuter le code et cette alerte affichera <em>undefined</em>, puisqu&rsquo;au moment où cette instruction est interprétée, aucune affectation n&rsquo;a encore été faite pour <em>maVariable</em> ! Puis, lorsque le serveur aura répondu, le second <em>alert()</em> sera affiché avec cette fois la valeur attendue.</p>
<p>Voir aussi :</p>
<ul>
<li><a href="http://nicolaspied.developpez.com/ajax-premiers-pas/">Vos premiers pas dans les nouvelles technologies</a></li>
<li><a href="http://dmouronval.developpez.com/tutoriels/ajax/comprendre-requete-ajax/">Comprendre les mécanismes d&rsquo;AJAX</a></li>
<li><a href="http://ajax.developpez.com/faq/javascript/?page=Ajax">La FAQ AJAX</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Les fonctions de rappel (callback) ou les utilisations cachées de eval()</title>
		<link>https://blog.developpez.com/web/p10463/web/les_fonctions_de_rappel_callback_ou_les</link>
		<comments>https://blog.developpez.com/web/p10463/web/les_fonctions_de_rappel_callback_ou_les#comments</comments>
		<pubDate>Thu, 03 Nov 2011 19:25:32 +0000</pubDate>
		<dc:creator><![CDATA[Bovino]]></dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Il existe de nombreux cas en JavaScript qui nécessitent l&#8217;utilisation de fonctions de rappel (callback en anglais). Une fonction de rappel est une fonction passée en paramètre d&#8217;une autre fonction. Pour JavaScript, c&#8217;est le cas par exemple de setTimeout(), setInterval() ou encore des fonctions appelées par un gestionnaire d&#8217;événement. Cette notion de fonction de rappel [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Il existe de nombreux cas en JavaScript qui nécessitent l&rsquo;utilisation de fonctions de rappel (<em>callback</em> en anglais).<br />
Une fonction de rappel est une fonction passée en paramètre d&rsquo;une autre fonction. Pour JavaScript, c&rsquo;est le cas par exemple de <em>setTimeout()</em>, <em>setInterval()</em> ou encore des fonctions appelées par un gestionnaire d&rsquo;événement.</p>
<p>Cette notion de fonction de rappel est d&rsquo;autant plus difficile à appréhender pour les débutants qu&rsquo;il existe différentes façons distinctes de la définir, dont certaines erronées.</p>
<p>Les trois plus fréquentes sont les suivantes :</p>
<ol>
<li><code class="codecolorer text default"><span class="text">document.onclick = maFonction();</span></code></li>
<li><code class="codecolorer text default"><span class="text">document.onclick = &quot;maFonction()&quot;;</span></code></li>
<li><code class="codecolorer text default"><span class="text">document.onclick = maFonction;</span></code></li>
</ol>
<ol>
<li><code class="codecolorer text default"><span class="text">setTimeout(maFonction(), délai);</span></code></li>
<li><code class="codecolorer text default"><span class="text">setTimeout(&quot;maFonction()&quot;, délai);</span></code></li>
<li><code class="codecolorer text default"><span class="text">setTimeout(maFonction, délai);</span></code></li>
</ol>
<p>Les exemples (1) sont tout simplement faux et ne produiront pas le résultat attendu. Ils sont un mélange entre les deux formes suivantes et dues à la confusion entre une fonction et le résultat de l&rsquo;exécution de celle-ci.<br />
Lorsque l&rsquo;interpréteur JavaScript rencontre la notation <em>maFonction()</em> (donc avec les parenthèses), il comprend qu&rsquo;il faut exécuter la fonction et le fait donc sur le champ. Or ce qu&rsquo;attendent les méthodes nécessitant une fonction de rappel, c&rsquo;est une référence à la fonction. Avec la notation des exemples (1), c&rsquo;est le résultat de l&rsquo;exécution qui sera affecté au clic ou au timer, sans attendre le moment souhaité par le développeur.<br />
Les exemples (2) sont syntaxiquement corrects, mais fortement marqués d&rsquo;obsolescence. En fait, dans ces cas ci, il n&rsquo;y a pas de fonction de rappel de définie mais une portion de code qui sera évaluée au moment de l&rsquo;appel. En interne, JavaScript va utiliser la méthode <em>eval()</em> pour interpréter le code, comme le montre l&rsquo;exemple suivant :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">function eval(){ <br />
&nbsp; &nbsp; alert('eval() is evil !'); <br />
} <br />
function toto(){ <br />
&nbsp; &nbsp; alert('toto'); <br />
} <br />
document.onclick = &quot;toto()&quot;;</div></div>
<p>Dans cet exemple, c&rsquo;est bien le message <em>eval() is evil !</em> qui sera affiché. Cette façon de procéder, liée à la préhistoire de JavaScript, est fortement déconseillée !</p>
<p>Dans les exemples (3), c&rsquo;est bien la référence à la fonction qui est utilisée De ce fait, lorsque le moment sera venu, cette fonction pourra être exécutée sans passer par l&rsquo;utilisation de <em>eval()</em>, comme le montre l&rsquo;exemple suivant :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">function eval(){ <br />
&nbsp; &nbsp; alert('eval() is evil !'); <br />
} <br />
function toto(){ <br />
&nbsp; &nbsp; alert('toto'); <br />
} <br />
document.onclick = toto;</div></div>
<p>C&rsquo;est bien le message <em>toto</em> qui est affiché lors du clic sur la page.</p>
<p><strong>Note :</strong> si vous utilisez une console (par exemple celle de Firebug) pour tester les codes ci-dessus et que vous faites &laquo;&nbsp;Exécuter&nbsp;&raquo; deux fois de suite, vous obtiendrez le message <em>eval() is evil</em>, cela est dû au fait que l&rsquo;injection du code dans le document utilise elle aussi des méthodes utilisant en interne <em>eval()</em> qui vient d&rsquo;être redéfinie.</p>
<p><strong>Mais alors, comment passer des paramètres à la fonction de rappel ?</strong><br />
Effectivement, le seul moyen de passer des paramètres à la fonction de rappel était celle des exemples (2), qui sont déconseillés.<br />
Pour passer des paramètres, il va falloir utiliser une quatrième technique qui consiste à englober l&rsquo;appel de la fonction de rappel dans une fonction anonyme. Cette fonction anonyme étant définie au moment de l&rsquo;affectation, elle correspond donc à une référence à une fonction et non à une exécution de celle-ci :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">function eval(){ <br />
&nbsp; &nbsp; alert('eval() is evil !'); <br />
} <br />
function toto(texte){ <br />
&nbsp; &nbsp; alert(texte); <br />
} <br />
document.onclick = function(){ <br />
&nbsp; &nbsp; toto('Paramètre !'); <br />
};</div></div>
<p>Ce code affiche bien le paramètre passé à la fonction <em>toto</em>, elle-même englobée dans une fonction anonyme.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
