<?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; Javascript</title>
	<atom:link href="https://blog.developpez.com/web/pcategory/web/javascript/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>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>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>
		<item>
		<title>Sortie de Prototype 1.6.0 et de script.aculo.us 1.8.0</title>
		<link>https://blog.developpez.com/web/p4501/web/sortie_de_prototype_1_6_0_et_de_script_a_0</link>
		<comments>https://blog.developpez.com/web/p4501/web/sortie_de_prototype_1_6_0_et_de_script_a_0#comments</comments>
		<pubDate>Thu, 08 Nov 2007 14:17:04 +0000</pubDate>
		<dc:creator><![CDATA[titoumimi]]></dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Prototype 1.6.0 et script.aculo.us 1.8.0 sont tout deux sortis hier. Vous pouvez les télécharger respectivement aux adresses suivantes : &#8211; Prototype 1.6.0 &#8211; script.aculo.us 1.8.0 Vous pouvez trouver l&#8217;annonce originale sur le blog de Prototype.]]></description>
				<content:encoded><![CDATA[<p>Prototype 1.6.0 et script.aculo.us 1.8.0 sont tout deux sortis hier.</p>
<p>Vous pouvez les télécharger respectivement aux adresses suivantes :</p>
<p>&#8211; <a href="http://prototypejs.org/assets/2007/11/6/prototype.js">Prototype 1.6.0</a><br />
&#8211; <a href="http://script.aculo.us/dist/scriptaculous-js-1.8.0.zip">script.aculo.us 1.8.0</a></p>
<p>Vous pouvez trouver l&rsquo;annonce originale sur le <a href="http://prototypejs.org/2007/11/7/prototype-1-6-0-script-aculo-us-1-8-0-and-the-bungee-book-now-available">blog de Prototype</a>.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mise en ligne de la nouvelle page Cours PHP</title>
		<link>https://blog.developpez.com/web/p3973/php/mise_en_ligne_de_la_nouvelle_page_cours_</link>
		<comments>https://blog.developpez.com/web/p3973/php/mise_en_ligne_de_la_nouvelle_page_cours_#comments</comments>
		<pubDate>Wed, 18 Jul 2007 10:25:48 +0000</pubDate>
		<dc:creator><![CDATA[Yogui]]></dc:creator>
				<category><![CDATA[(X)HTML/CSS]]></category>
		<category><![CDATA[Conférences]]></category>
		<category><![CDATA[EDI]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Référencement]]></category>
		<category><![CDATA[Sécurité]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[J&#8217;ai finalement pris le temps de terminer la nouvelle mise en page des cours et tutoriels PHP. Les cours sont maintenant mieux répartis en catégories, donc plus faciles à retrouver. J&#8217;en ai profité pour mettre un peu à l&#8217;écart les cours obsolètes, mais vous pouvez toujours les consulter si vous le voulez. Vous pouvez poster [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>J&rsquo;ai finalement pris le temps de terminer la nouvelle mise en page des cours et tutoriels PHP. Les cours sont maintenant mieux répartis en catégories, donc plus faciles à retrouver. J&rsquo;en ai profité pour mettre un peu à l&rsquo;écart les cours obsolètes, mais vous pouvez toujours les consulter si vous le voulez.</p>
<p>Vous pouvez poster ici vos commentaires et consulter <a href="http://club.developpez.com/redaction/">cette page</a> si vous souhaitez rejoindre la Rédaction pour ajouter vos articles à la liste.</p>
<p><a href="http://php.developpez.com/cours/">http://php.developpez.com/cours/</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
