<?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>Archives des JavaScript - Pierre Giraud</title>
	<atom:link href="https://www.pierre-giraud.com/category/javascript/feed/" rel="self" type="application/rss+xml" />
	<link></link>
	<description>Cours et tutoriels HTML, CSS, JavaScript, PHP - Apprendre à coder</description>
	<lastBuildDate>Tue, 18 May 2021 04:54:00 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://www.pierre-giraud.com/wp-content/uploads/2020/04/cropped-logo512-pierre-giraud3-1-32x32.png</url>
	<title>Archives des JavaScript - Pierre Giraud</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Tri JavaScript dynamique d&#8217;un tableau HTML ou d&#8217;une liste</title>
		<link>https://www.pierre-giraud.com/trier-tableau-javascript/</link>
					<comments>https://www.pierre-giraud.com/trier-tableau-javascript/#respond</comments>
		
		<dc:creator><![CDATA[Pierre GIRAUD]]></dc:creator>
		<pubDate>Wed, 27 Nov 2019 09:00:23 +0000</pubDate>
				<category><![CDATA[JavaScript]]></category>
		<guid isPermaLink="false">https://www.pierre-giraud.com/?p=12631</guid>

					<description><![CDATA[<p>Dans ce nouveau tutoriel, je vous propose de créer un script JavaScript qui va nous permettre de trier une liste d’éléments ou les cellules d’un tableau HTML. Nous allons pouvoir trier par ordre alphabétique et par valeur numérique, dans l’ordre ascendant (croissant) ou descendant (décroissant). &#160; Créer un tri dynamique en JavaScript &#8211; Partie HTML ... <a title="Tri JavaScript dynamique d&#8217;un tableau HTML ou d&#8217;une liste" class="read-more" href="https://www.pierre-giraud.com/trier-tableau-javascript/" aria-label="En savoir plus sur Tri JavaScript dynamique d&#8217;un tableau HTML ou d&#8217;une liste">Lire plus</a></p>
<p>L’article <a href="https://www.pierre-giraud.com/trier-tableau-javascript/">Tri JavaScript dynamique d&rsquo;un tableau HTML ou d&rsquo;une liste</a> est apparu en premier sur <a href="https://www.pierre-giraud.com">Pierre Giraud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="grille2pr">
<article class="ctn2pr">
Dans ce nouveau tutoriel, je vous propose de créer un script JavaScript qui va nous permettre de trier une liste d’éléments ou les cellules d’un tableau HTML.</p>
<p>Nous allons pouvoir trier par ordre alphabétique et par valeur numérique, dans l’ordre ascendant (croissant) ou descendant (décroissant).</p>
<p>&nbsp;</p>
<h2>Créer un tri dynamique en JavaScript &#8211; Partie HTML et ressources utilisées</h2>
<p>Commençons par créer un tableau structuré en HTML :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="html">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
    &lt;meta http-equiv="X-UA-Compatible" content="ie=edge"&gt;
    &lt;title&gt;Tri JavaScript&lt;/title&gt;
    &lt;script src="tri.js" async&gt;&lt;/script&gt;
    &lt;style&gt;
        table{border-collapse: collapse}
        th,td{border: 1px solid black;padding: 10px 20px}
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;table&gt;
        &lt;thead&gt;
            &lt;tr&gt;
                &lt;th&gt;Prénom&lt;/th&gt;
                &lt;th&gt;Age&lt;/th&gt;
                &lt;th&gt;Abonné&lt;/th&gt;
            &lt;/tr&gt;
        &lt;/thead&gt;
        &lt;tbody&gt;
            &lt;tr&gt;
                &lt;td&gt;Pierre&lt;/td&gt;
                &lt;td&gt;29&lt;/td&gt;
                &lt;td&gt;oui&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;Mathilde&lt;/td&gt;
                &lt;td&gt;027&lt;/td&gt;
                &lt;td&gt;false&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;3Ric&lt;/td&gt;
                &lt;td&gt;&lt;/td&gt;
                &lt;td&gt;??&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;Florian&lt;/td&gt;
                &lt;td&gt;trente&lt;/td&gt;
                &lt;td&gt;01&lt;/td&gt;
            &lt;/tr&gt;
        &lt;/tbody&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Notre tableau contient ici une ligne d’en-tête en 5 lignes de données. Nous allons vouloir pouvoir trier les cellules de chaque colonne en cliquant simplement sur la cellule d’en-tête correspondante. Bien évidemment, on va également vouloir que lors du tri le reste des lignes suive les cellules de la colonne triée.</p>
<p>En JavaScript, la meilleure façon de faire actuellement de être de :</p>
<ol>
<li>Récupérer les valeurs du tableau dynamiquement ;</li>
<li>Comparer les cellules de la colonne triée deux à deux et les ordonner comme cela les unes après les autres ;</li>
<li>Réinjecter les résultats dans la page en créant un nouveau tableau qui viendra remplacé le précédent.</li>
</ol>
<p>Pour cela, nous allons utiliser les méthodes suivantes :</p>
<ul>
<li>Les méthodes <code>querySelector()</code> et <code>querySelectorAll()</code> qui nous permettent de récupérer des éléments spécifiques dans le DOM ;</li>
<li>La méthode <code>AddEventListener()</code> qui permet d’accrocher un gestionnaire d’événements à un élément ;</li>
<li>La fonction <code>isNaN()</code> qui indique si une valeur est un nombre (<code>true</code>) ou pas (<code>false</code>) ;</li>
<li>La méthode <code>toString()</code> qui renvoie une chaine de caractères à partir d’un objet ;</li>
<li>La méthode <code>localeCompare()</code> qui renvoie un nombre indiquant si la chaîne de caractères courante se situe avant (nb négatif), après (nb positif) ou est la même que la chaîne passée en paramètre (0), selon l&rsquo;ordre lexicographique.</li>
<li>La méthode <code>forEach()</code> qui permet d&rsquo;exécuter une fonction donnée sur chaque élément du tableau ;</li>
<li>La méthode <code>Array.from()</code> qui permet de créer une nouvelle instance d&rsquo;Array (une copie superficielle) à partir d&rsquo;un objet itérable ou semblable à un tableau.</li>
<li>La méthode <code>sort()</code> qui trie les éléments d&rsquo;un tableau, dans ce même tableau, et renvoie le tableau ;</li>
<li>La méthode <code>indexOf()</code> qui renvoie le premier indice pour lequel on trouve un élément donné dans un tableau ou -1.</li>
</ul>
<p>On va également avoir besoin des propriétés suivantes :</p>
<ul>
<li>La propriété <code>children</code> (lecture seule) qui renvoie une <code>HTMLCollection</code> contenant tous les enfants <code>Element</code> du noeud sur lequel elle a été appelée ;</li>
<li>La propriété <code>textContent</code> qui représente le contenu textuel d&rsquo;un nœud et de ses descendants.</li>
</ul>
<p>&nbsp;</p>
<h2>Créer un tri dynamique en JavaScript &#8211; Script JavaScript</h2>
<p>Comme l’exercice est relativement complexe, on va procéder par itération en créant d’abord un grand schéma de ce qu’on souhaite obtenir et en complétant au fur et à mesure.</p>
<h3>Création d’une première ébauche de tri</h3>
<p>On sait qu’il va falloir qu’on classes les différentes lignes de notre tableau en fonction de la valeur des cellules d’une colonne donnée. On va donc déjà commencer par accéder à nos éléments <code>tbody</code>, <code>th</code> et <code>tr</code>. Pour cela, on peut écrire :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">const tbody = document.querySelector('tbody');
const thx = document.querySelectorAll('th');
const trxb = tbody.querySelectorAll('tr');</pre>
<p>La méthode <code>querySelectorAll()</code> renvoie une <code>NodeList</code> d’éléments correspondant au sélecteur passés contenus dans le document ou qui sont des descendants de l&rsquo;élément sur lequel la méthode a été appelée. <code>tbody.querySelectorAll('tr')</code> renvoie donc une liste des noeuds éléments <code>tr</code> contenus dans <code>tbody</code> par exemple.</p>
<p>Notez déjà qu’il est possible d’itérer sur (de parcourir) une <code>NodeList</code> avec <code>forEach()</code> et qu’on peut également convertir une <code>NodeList</code> en tableau avec la méthode <code>Array.from()</code>.</p>
<p>En plus de cela, les éléments de notre <code>NodeList</code> contiennent des propriétés <code>cells</code> et <code>children</code> qui peuvent nous permettre d’accéder à une <code>HTMLCollection</code> des éléments qu’ils contiennent.</p>
<p>Ensuite, on veux que le tableau soit trié dans l’ordre croissant ou décroissant des valeurs en fonction d’une colonne dès qu’un utilisateur clique sur la cellule d’en-tête de cette colonne. On va donc utiliser un évènement de type <code>click</code> et utiliser une fonction de retour qui va devoir faire le travail.</p>
<p>Commençons déjà par accrocher un gestionnaire d’évènement <code>click</code> à chacun de nos <code>th</code>. On peut écrire quelque chose comme ça :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">thx.forEach(th =&gt; th.addEventListener('click', () =&gt;{
   /*Code à créer*/
}));</pre>
<p>Notez bien ici que les <code>th</code> du code ci-dessus ne sont que des variables : je pourrais leur donner n’importe quel nom. L’idée est que <code>forEach()</code> va exécuter un code pour chaque élément de l’<code>Array</code> / la <code>NodeList</code> sur lequel on l’appelle. <code>thx</code> est composé des <code>th</code> de notre tableau; <code>forEach()</code> va donc ici accrocher des gestionnaires d’évènements à chaque élément <code>th</code>.</p>
<p>Le code au dessus utilise des fonctions fléchées qui sont une notation récente du JavaScript. L’équivalent avec des fonctions anonymes serait :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">thx.forEach(function(th) { 
    th.addEventListener('click', function() {
       /*Code à créer*/
    });
});</pre>
<p>Lorsqu’un utilisateur clique sur une cellule d’en-tête, il va falloir qu’on classe / ordonne les différentes lignes du tableau et qu’on remplace le tableau de base par le nouveau tableau ordonné.</p>
<p>Pour classer les lignes du tableau, on va utiliser la méthode <code>sort()</code>. Par défaut, cette méthode va trier les valeurs en les convertissant en chaines de caractères et en comparant ces chaines selon l&rsquo;ordre des points de code Unicode. Cette méthode ne nous convient pas puisqu’elle n’est efficace que pour trier des chaines qui ont des formes semblables (tout en minuscule ou tout en majuscule).</p>
<p>Heureusement, <code>sort()</code> peut prendre en argument facultatif une fonction de comparaison qui va décrire la façon dont les éléments vont être comparés, ce qui va nous être très utile ici. Cette fonction de comparaison va toujours devoir renvoyer un nombre en valeur de retour qui va décider de l’ordre de tri.</p>
<p>Par exemple, si <code>v1</code> et <code>v2</code> sont deux valeurs à comparer, alors :</p>
<ul>
<li>Si <code>fonctionDeComparaison(v1, v2)</code> renvoie une valeur strictement inférieure à 0, <code>v1</code> sera classé avant <code>v2</code> ;</li>
<li>Si <code>fonctionDeComparaison(v1, v2)</code> renvoie une valeur strictement supérieure à 0, <code>v2</code> sera classé avant <code>v1</code> ;</li>
<li>Si <code>fonctionDeComparaison(v1, v2)</code> renvoie 0, on laisse <code>v1</code> et <code>v2</code> inchangés l&rsquo;un par rapport à l&rsquo;autre, mais triés par rapport à tous les autres éléments.</li>
</ul>
<p>Pour réinjecter le résultat, on va utiliser <code>forEach()</code> et <code>appendChild()</code>.</p>
<p>Notre gestionnaire d’évènements va donc ressembler à cela :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">thx.forEach(th =&gt; th.addEventListener('click', () =&gt;{
    let classe = Array.from(trxb).sort(compare(a,b));
    classe.forEach(tr =&gt; tbody.appendChild(tr));
}));</pre>
<p>La méthode <code>sort()</code> a besoin d’un <code>Array</code> (ou d’un array-like) pour fonctionner. On utilise donc <code>Array.from(trbx)</code> pour créer un <code>Array</code> à partir de notre <code>NodeList</code>.</p>
<p>Ensuite, pour chaque élément du tableau classé, on utilise <code>appendChild</code> qui va insérer les <code>tr</code> les unes à la suite des autres.</p>
<p>Voilà tout pour le squelette. La vraie difficulté va maintenant être de savoir ce qu’on va mettre dans notre fonction <code>compare()</code>.</p>
<h3>Création de la fonction de tri avec critères personnalisés</h3>
<p>Pour le moment, on passe un <code>Array</code> complexe composé d’objets à <code>sort()</code>. En effet, <code>Array.from(trxb)</code> crée un <code>Array</code> composé des différents <code>tr</code> de notre <code>tbody</code> et ces <code>tr</code> sont des objets (noeuds) eux mêmes composés de (noeuds) <code>td</code> eux mêmes composés de (noeuds) texte.</p>
<p>La méthode <code>sort()</code> transmet ainsi ici automatiquement les différents éléments de <code>Array.from(trxb)</code> (c’est-à-dire les différents <code>tr</code>) à la fonction <code>compare()</code> passée en argument.</p>
<p>Or, comparer des lignes de tableau deux à deux n’a pas de sens : on veut comparer les valeurs textuelles des <code>td</code> d’une colonne donnée entre les différentes lignes du tableau pour ensuite pouvoir ordonner les lignes entières dans un sens ou dans un autre.</p>
<p>On va donc ici vouloir passer explicitement l’indice du <code>th</code> lié à la colonne actuellement cliqué afin de définir la colonne de référence utilisée pour le tri ainsi qu’un booléen qui va nous permettre d’inverser le tri (croissant / décroissant) à chaque fois qu’un élément d’en-tête sera cliqué (note : par simplicité, les éléments d’en-tête agissent comme un groupe ici et non pas indépendamment).</p>
<p>On va faire tout cela de la façon suivante :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">thx.forEach(th =&gt; th.addEventListener('click', () =&gt;{
    let classe = Array.from(trxb).sort(compare(Array.from(thx).indexOf(th), this.asc = !this.asc));
    classe.forEach(tr =&gt; tbody.appendChild(tr));
}));</pre>
<p>La partie <code>Array.from(thx).indexOf(th)</code> nous permet de récupérer l’indice du <code>th</code> couramment cliqué. On va se servir ensuite de cet indice pour savoir quelles valeurs comparer dans chaque <code>tr</code>.</p>
<p>La partie <code>this.asc = !this.asc</code> permet de définir un booléen dont la valeur logique va être inversée à chaque clic sur un élément d’en-tête. Avant le premier clic, <code>this.asc</code> n’est pas défini (et vaut donc <code>false</code>). Lors du premier clic, sa valeur s’inverse et il vaut donc <code>true</code> et etc. Cela va nous permettre ensuite de choisir l’ordre de tri.</p>
<p>Passons maintenant à notre fonction de comparaison en soi. Notre fonction <code>compare()</code> va devoir retourner une fonction qui va recevoir en arguments valeurs passées par <code>sort()</code> (c’est-à-dire nos lignes de tableau) et retourner un nombre positif, négatif ou égal à 0 afin d’indiquer à <code>sort()</code> comment les lignes doivent être triées. L’architecture de notre fonction va donc ressembler à :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">const compare = (ids, asc) =&gt; (row1, row2) =&gt; /*Un nombre*/</pre>
<p>L’équivalent avec des notations plus traditionnelles est :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">const compare = function(ids, asc){
    return function(row1, row2){
       return /*Un nombre*/;
    }
}</pre>
<p>L’idée principale de notre fonction de comparaison est la suivante : on va vouloir obtenir le contenu textuel des cellules de la colonne utilisée pour le tri pour les deux lignes passées par <code>sort()</code> et on va vouloir comparer ces deux valeurs textuelles puis renvoyer un nombre à l’issue de cette comparaison pour indiquer à <code>sort()</code> l’ordre de tri.</p>
<p>Notre fonction de comparaison va déjà devoir comparer les valeurs textuelles des <code>td</code> d’une colonne pour deux lignes différentes pour ensuite pouvoir ordonner les lignes. Il va donc falloir accéder à ces valeurs textuelles. On va pour cela créer une autre fonction qui va prendre une ligne et un numéro de colonne en entrée et qui va extraire le contenu textuel de la cellule de tableau relative à l’id passé dans cette ligne.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">const compare = (ids, asc) =&gt; (row1, row2) =&gt; {
    const tdValue = (row, ids) =&gt; row.children[ids].textContent;
   /*Un nombre*/</pre>
<p>L’équivalent en fonctions non fléchées est :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">const compare = function(ids, asc){
    return function(row1, row2){
       const tdValue = function(row, ids){
           return row.children[ids].textContent;
       }
       return /*Un nombre*/
    }
}</pre>
<p>Maintenant qu’on possède une fonction nous permettant de récupérer le contenu textuel des <code>td</code>, il ne nous reste plus qu’à créer une comparaison qui va comparer ces deux valeurs textuelles. On peut faire cela en utilisant des ternaires :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">const compare = (ids, asc) =&gt; (row1, row2) =&gt; {
    const tdValue = (row, ids) =&gt; row.children[ids].textContent;
    const tri = (v1, v2) =&gt; v1 !== '' &amp;&amp; v2 !== '' &amp;&amp; !isNaN(v1) &amp;&amp; !isNaN(v2) ? v1 - v2 : v1.localeCompare(v2);
    /*Un nombre*/
};</pre>
<p>L’équivalent de cette notation condensée avec des boucles classiques et des fonctions non fléchées est :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">const compare = function(ids, asc){
    return function(row1, row2){
       const tdValue = function(row, ids){
           return row.children[ids].textContent;
       }
       const tri = function(v1, v2){
           if (v1 !== '' &amp;&amp; v2 !== '' &amp;&amp; !isNaN(v1) &amp;&amp; !isNaN(v2)){
              return v1 - v2;
           }
           else {
              return v1.toString().localeCompare(v2);
           }
           return v1 !== '' &amp;&amp; v2 !== '' &amp;&amp; !isNaN(v1) &amp;&amp; !isNaN(v2) ? v1 - v2 : v1.localeCompare(v2);
       };
       return /*Un nombre*/
   }
}</pre>
<p>Ici, <code>v1</code> et <code>v2</code> représentent le contenu textuel des cellules des deux lignes pour une colonne donnée. On veut d’abord traiter deux cas : le cas où les cellules contiennent des nombres et le cas où elles contiennent autre chose que des nombres.</p>
<p>Dans le cas où nos deux valeurs sont bien des nombres, on se contente de retourner la différence entre les deux valeurs.</p>
<p>Il faut savoir ici que lorsqu’on passe un argument qui n’est pas du type <code>Number</code> à <code>isNan()</code>, cet argument est d’abord converti de force en une valeur de type <code>Number</code> et c’est la valeur résultante qui est utilisée pour déterminer si l’argument est NaN ou pas.</p>
<p><code>isNan()</code> va notamment renvoyer <code>true</code> pour les valeurs booléennes <code>true</code> et <code>false</code> et pour la chaine de caractères vide. On va donc isoler le cas “chaine de caractères vide”. Comme les valeurs récupérées dans le tableau seront transformées en chaine, on n’a pas besoin d’isoler les cas <code>true</code> et <code>false</code>.</p>
<p>Pour tous les cas qui ne rentrent pas dans notre <code>if</code>, on va comparer les deux valeurs avec la méthode <code>localeCompare()</code>. Si la valeur <code>v2</code> est considérée comme se situant après dans l’ordre lexicographique par rapport à <code>v1</code> par <code>localeCompare()</code>, cette méthode renverra un nombre négatif. Dans le cas contraire, un nombre positif sera renvoyé.</p>
<p>En résumé, dans notre <code>if</code> comme dans notre <code>else</code>, si <code>v2</code> est “plus grand” que <code>v1</code> , une valeur négative est retournée. Dans le cas contraire, une valeur positive est retournée. Si les deux valeurs sont égales, 0 est retourné.</p>
<p>Il ne nous reste plus alors qu’à passer des valeurs textuelles effectives à notre fonction <code>tri()</code> en tenant compte de l’ordre de tri choisi (croissant ou décroissant). On peut écrire :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">const compare = (ids, asc) =&gt; (row1, row2) =&gt; {
    const tdValue = (row, ids) =&gt; row.children[ids].textContent;
    const tri = (v1, v2) =&gt; v1 !== '' &amp;&amp; v2 !== '' &amp;&amp; !isNaN(v1) &amp;&amp; !isNaN(v2) ? v1 - v2 : v1.toString().localeCompare(v2);
    return tri(tdValue(asc ? row1 : row2, ids), tdValue(asc ? row2 : row1, ids));
};</pre>
<p>Ou l’équivalent en “version longue” :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">const compare = function(ids, asc){
    return function(row1, row2){
        const tdValue = function(row, ids){
            return row.children[ids].textContent;
        }
        const tri = function(v1, v2){
            if (v1 !== '' &amp;&amp; v2 !== '' &amp;&amp; !isNaN(v1) &amp;&amp; !isNaN(v2)){
               return v1 - v2;
            }
            else {
               return v1.toString().localeCompare(v2);
            }
            return v1 !== '' &amp;&amp; v2 !== '' &amp;&amp; !isNaN(v1) &amp;&amp; !isNaN(v2) ? v1 - v2 : v1.toString().localeCompare(v2);
        };
        return tri(tdValue(asc ? row1 : row2, ids), tdValue(asc ? row2 : row1, ids));
    }
};</pre>
<p>Décortiquons cette dernière ligne de code ensemble. Cette ligne est relativement condensée et contient deux ternaires. La partie <code>tdValue(asc ? row1 : row2, ids), tdValue(asc ? row2 : row1, ids)</code> permet de récupérer le contenu textuel d’une cellule de la première ligne puis le contenu textuel d’une cellule de la deuxième ligne ou inversement selon que <code>asc</code> soit évalué à <code>true</code> ou pas.</p>
<p>Grosso modo, on va exécuter <code>tdValue(row1, ids)</code> et <code>tdValue(row2, ids)</code> si <code>asc</code> vaut <code>true</code> ou <code>tdValue(row2, ids)</code> et <code>tdValue(row1, ids)</code> si <code>asc</code> vaut <code>false</code>.</p>
<p>Les deux résultats renvoyés par <code>tdValue()</code> (les valeurs textuelles des deux cellules donc) sont ensuite immédiatement passées comme arguments à <code>tri()</code> qui va les comparer et renvoyer un nombre. En fonction de si le nombre est positif, négatif ou égal à 0 la méthode <code>sort()</code> va finalement ordonner les lignes dans un sens ou dans un autre.</p>
<p>Ici, notre ternaire nous permet finalement de choisir quelle valeur textuelle va être utilisée en <code>v1</code> et quelle autre va être utilisée en <code>v2</code>, ce qui va influer sur le résultat final.</p>
<p>Si <code>asc</code> vaut <code>true</code>, la valeur textuelle de la première colonne sera utilisée comme <code>v1</code> et la valeur textuelle de la deuxième colonne sera utilisée comme <code>v2</code>.</p>
<p>Or, on a dit plus haut que si <code>v2</code> est “plus grand” que <code>v1</code> , une valeur négative est retournée par <code>tri()</code>. Notre fonction <code>compare()</code> renvoie donc dans ce cas une fonction <code>function(row1, row2)</code> qui renvoie elle même une valeur négative.</p>
<p>La ligne <code>Array.from(trxb).sort(compare(Array.from(thx).indexOf(th), this.asc = !this.asc)</code> va donc devenir <code>Array.from(trxb).sort(function(row1, row2){return /*Une valeur négative*/}</code> et dans ce scénario <code>sort()</code> va classer <code>row1</code> avant <code>row2</code>.</p>
<p>On a donc finalement réalisé un tri fonctionnel en JavaScript, qui permet de comparer et de classer différents types de valeurs !</p>
<p>Voici le code complet en version longue :</p>
<p class="codepen" data-height="752" data-theme-id="default" data-default-tab="js,result" data-user="pierregiraud" data-slug-hash="jOOjdoM" style="height: 752px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Tuto - Trier un tableau HTML en JavaScript [développé]">
<span>See the Pen <a href="https://codepen.io/pierregiraud/pen/jOOjdoM"><br />
Tuto &#8211; Trier un tableau HTML en JavaScript [développé]</a> by Pierre (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>Et le voici en version factorisé :</p>
<p class="codepen" data-height="503" data-theme-id="default" data-default-tab="js,result" data-user="pierregiraud" data-slug-hash="rNNEPqw" style="height: 503px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Tuto - Trier un tableau HTML en JavaScript [condensé]">
<span>See the Pen <a href="https://codepen.io/pierregiraud/pen/rNNEPqw"><br />
Tuto &#8211; Trier un tableau HTML en JavaScript [condensé]</a> by Pierre (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script><br />
</article>
<aside>
<div class="asidep">
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><br />
<!-- PG v. 2019 --><br />
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8384266137058067"
     data-ad-slot="8226819743"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>
</div>
</aside>
</div>
<p>L’article <a href="https://www.pierre-giraud.com/trier-tableau-javascript/">Tri JavaScript dynamique d&rsquo;un tableau HTML ou d&rsquo;une liste</a> est apparu en premier sur <a href="https://www.pierre-giraud.com">Pierre Giraud</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.pierre-giraud.com/trier-tableau-javascript/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Afficher / cacher ou masquer un div ou du texte en JavaScript</title>
		<link>https://www.pierre-giraud.com/afficher-cacher-div-javascript/</link>
					<comments>https://www.pierre-giraud.com/afficher-cacher-div-javascript/#respond</comments>
		
		<dc:creator><![CDATA[Pierre GIRAUD]]></dc:creator>
		<pubDate>Wed, 06 Nov 2019 09:00:53 +0000</pubDate>
				<category><![CDATA[JavaScript]]></category>
		<guid isPermaLink="false">https://www.pierre-giraud.com/?p=12459</guid>

					<description><![CDATA[<p>Dans ce nouveau tutoriel, je vous propose de voir comment afficher ou cacher un div ou n’importe quel autre texte ou élément HTML en utilisant du JavaScript et sans utiliser la librairie jQuery. L’idée ne va être simplement de masquer un élément mais de laisser l’opportunité aux visiteurs de cacher ou d’afficher les div en ... <a title="Afficher / cacher ou masquer un div ou du texte en JavaScript" class="read-more" href="https://www.pierre-giraud.com/afficher-cacher-div-javascript/" aria-label="En savoir plus sur Afficher / cacher ou masquer un div ou du texte en JavaScript">Lire plus</a></p>
<p>L’article <a href="https://www.pierre-giraud.com/afficher-cacher-div-javascript/">Afficher / cacher ou masquer un div ou du texte en JavaScript</a> est apparu en premier sur <a href="https://www.pierre-giraud.com">Pierre Giraud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="grille2pr">
<article class="ctn2pr">
Dans ce nouveau tutoriel, je vous propose de voir comment afficher ou cacher un <code>div</code> ou n’importe quel autre texte ou élément HTML en utilisant du JavaScript et sans utiliser la librairie jQuery.</p>
<p>L’idée ne va être simplement de masquer un élément mais de laisser l’opportunité aux visiteurs de cacher ou d’afficher les <code>div</code> en cliquant sur certains éléments ou en passant leur souris à certains endroits.  </p>
<p>Pour faire cela, nous allons jouer sur l’état de la propriété CSS <code>display</code> de l’élément HTML qu’on souhaite afficher ou masquer. </p>
<p>&nbsp;</p>
<h2>Afficher ou cacher un div, un texte, ou n’importe quel élément HTML en CSS</h2>
<p>Il existe principalement deux méthodes pour cacher un élément HTML visible en CSS : on peut soit régler la valeur de la propriété <code>visibility</code> de l’élément sur <code>visibility: hidden</code>, soit régler son type d’affichage sur <code>display: none</code>. </p>
<p>Il existe cependant une différence de taille entre ces deux méthodes : appliquer un <code>visibility: hidden</code> sur un élément comme un <code>div</code> par exemple va simplement cacher cet élément mais ne va pas le retirer du flux de la page ce qui signifie que l’espace qu’il occupait lorsqu’il était visible va être conservé tandis qu’appliquer un <code>display: none</code> va non seulement masquer l’élément en question mais va en plus permettre aux autres éléments d’occuper l’espace de l’élément caché. </p>
<p>N’hésitez pas à aller lire mon article sur les <a href="https://www.pierre-giraud.com/difference-visibility-hidden-display-none/">différences entre visibility: hidden et display: none</a> pour bien les comprendre.</p>
<p>&nbsp;</p>
<h2>Afficher ou cacher un div lors d’un clic</h2>
<p>On veut que nos utilisateurs puissent cacher notre <code>div</code> lorsqu’il est affiché ou au contraire l’afficher lorsqu’il est caché en cliquant simplement sur un bouton. </p>
<p>Pour faire cela, on va utiliser l’évènement JavaScript <code>click</code>. Lors du clic sur le bouton, on va récupérer la valeur de la propriété <code>display</code> du <code>div</code> et la modifier : si la valeur est <code>display: none</code>, on la change en <code>display: block</code> et inversement. </p>
<p>Pour répondre à l’évènement <code>click</code> en JavaScript, on peut soit utiliser la méthode <code>addEventListener()</code> qui permet d’enregistrer une fonction qui sera appelée lors du déclenchement d’un évènement choisi, soit simplement utiliser la propriété <code>onclick</code> qui représente le gestionnaire d’évènement pour l’évènement <code>click</code> de l’élément courant. </p>
<p>Illustrons cela immédiatement avec un exemple concret. Pour cela, on va déjà créer une page HTML avec deux boutons et deux éléments <code>div</code> : </p>
<p class="codepen" data-height="549" data-theme-id="0" data-default-tab="html" data-user="pierregiraud" data-slug-hash="wvvmjEv" style="height: 549px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Tuto - Afficher / cacher div HTML en JavaScript #1">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/wvvmjEv"><br />
  Tuto &#8211; Afficher / cacher div HTML en JavaScript #1</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>On peut également appliquer ne couleur de fond à nos deux <code>div</code> en CSS : </p>
<p class="codepen" data-height="160" data-theme-id="0" data-default-tab="css" data-user="pierregiraud" data-slug-hash="wvvmjEv" style="height: 160px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Tuto - Afficher / cacher div HTML en JavaScript #1">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/wvvmjEv"><br />
  Tuto &#8211; Afficher / cacher div HTML en JavaScript #1</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>Il ne nous reste plus alors qu’à créer notre JavaScript : </p>
<p class="codepen" data-height="462" data-theme-id="0" data-default-tab="js" data-user="pierregiraud" data-slug-hash="wvvmjEv" style="height: 462px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Tuto - Afficher / cacher div HTML en JavaScript #1">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/wvvmjEv"><br />
  Tuto &#8211; Afficher / cacher div HTML en JavaScript #1</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>Je présente ici les deux méthodes citées précédemment (afficher et cacher un <code>div</code> en utilisant <code>addEventListener()</code> et <code>onclick</code>). </p>
<p>On commence ici de manière classique par accéder à nos différents éléments HTML en JavaScript en utilisant <code>document.getElementById()</code> et on stocke les différentes références dans des variables. </p>
<p>On attache ensuite un gestionnaire d’évènement <code>click</code> à notre bouton <code>togg1</code> avec <code>addEventListener()</code>.  On va passer deux arguments à cette méthode : le nom d’un évènement qu’on souhaite prendre en charge ainsi que le code à exécuter (qui prendra souvent la forme d’une fonction) en cas de déclenchement de cet évènement.</p>
<p>J’utilise ici une fonction fléchée qui est une notation récente en JavaScript. La partie <code>()=>{}</code> est équivalente à <code>function(){}</code>. La fonction fléchée est la fonction qui va s’exécuter lors du clic sur <code>#togg1</code>. </p>
<p>Le code de cette fonction commence par récupérer la valeur calculée (valeur courante) de la propriété <code>display</code> du <code>div id="d1"</code> avec <code>getComputedStyle(d1).display</code> et la compare à la valeur <code>none</code> en différence. </p>
<p>Si la valeur récupérée est bien différente de <code>none</code> (c’est-à-dire si le <code>div</code> est visible), on rentre dans le <code>if</code> qui modifie cette valeur afin qu’elle soit égale à <code>none</code> (ce qui cache le <code>div</code>).</p>
<p>Si la valeur récupérée est égale à <code>none</code>, c’est que le <code>div</code> est déjà caché. On rentre alors dans le <code>else</code> et on modifie cette valeur en <code>display: block</code> pour afficher le <code>div</code>.</p>
<p>La deuxième partie de mon code JavaScript produit également le même résultat (avec le bouton <code>#togg2</code> et le <code>div</code> <code>#d2</code> mais utilise cette fois-ci un attribut <code>onclick</code> et une fonction nommée classique plutôt que <code>addEventListener()</code> et une fonction fléchée. </p>
<p>Voici le résultat obtenu finalement : </p>
<p class="codepen" data-height="396" data-theme-id="0" data-default-tab="result" data-user="pierregiraud" data-slug-hash="wvvmjEv" style="height: 396px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Tuto - Afficher / cacher div HTML en JavaScript #1">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/wvvmjEv"><br />
  Tuto &#8211; Afficher / cacher div HTML en JavaScript #1</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>&nbsp;</p>
<h2>Afficher ou cacher un div lors du survol</h2>
<p>On va de la même façon pouvoir afficher / cacher des <code>div</code> ou n’importe quel élément en utilisant différents autres évènements JavaScript comme lors du survol de la souris sur un élément par exemple. </p>
<p>Pour faire cela, on peut par exemple utiliser les évènements <code>mouseover</code> et <code>mouseout</code> ou <code>mouseenter</code> et <code>mouseleave</code> en fonction de la situation et du résultat qu’on souhaite obtenir. </p>
<p>On peut illustrer cela en modifiant légèrement notre exemple précédent de la manière suivante : </p>
<p>Code HTML : </p>
<p class="codepen" data-height="512" data-theme-id="0" data-default-tab="html" data-user="pierregiraud" data-slug-hash="dyymqej" style="height: 512px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Tuto - Afficher / cacher div HTML en JavaScript #2">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/dyymqej"><br />
  Tuto &#8211; Afficher / cacher div HTML en JavaScript #2</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>Code CSS : </p>
<p class="codepen" data-height="172" data-theme-id="0" data-default-tab="css" data-user="pierregiraud" data-slug-hash="dyymqej" style="height: 172px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Tuto - Afficher / cacher div HTML en JavaScript #2">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/dyymqej"><br />
  Tuto &#8211; Afficher / cacher div HTML en JavaScript #2</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>Code JavaScript : </p>
<p class="codepen" data-height="391" data-theme-id="0" data-default-tab="js" data-user="pierregiraud" data-slug-hash="dyymqej" style="height: 391px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Tuto - Afficher / cacher div HTML en JavaScript #2">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/dyymqej"><br />
  Tuto &#8211; Afficher / cacher div HTML en JavaScript #2</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>Résultat : </p>
<p class="codepen" data-height="314" data-theme-id="0" data-default-tab="result" data-user="pierregiraud" data-slug-hash="dyymqej" style="height: 314px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Tuto - Afficher / cacher div HTML en JavaScript #2">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/dyymqej"><br />
  Tuto &#8211; Afficher / cacher div HTML en JavaScript #2</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>Cette fois-ci, on veut cacher et ou afficher des éléments selon que l’on passe la souris sur certains autres éléments ou qu’on retire la souris de ces éléments. </p>
<p>Dans notre cas, ce sont les paragraphe <code>#p1</code> et la liste <code>#l1</code> contenus dans nos <code>div</code> qui vont être masqués / affichés. </p>
<p>On cache ces éléments par défaut en leur appliquant un <code>display : none</code>. On va ensuite vouloir qu’ils s’affichent lorsque l’utilisateur place sa souris dans le <code>div</code> parent relatif à chaque élément, puis qu’ils soient cachés à nouveau lorsque l’utilisateur retire sa souris du <code>div</code>. </p>
<p>Pour cela, on va se servir ici des évènements <code>mouseover</code> (la souris rentre) et <code>mouseout</code> (la souris sortt) et on va à nouveau pouvoir utiliser soit la méthode <code>addEventListener()</code>, soit un attribut d’évènements pour répondre à ces évènements.<br />
</article>
<aside>
<div class="asidep">
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><br />
<!-- PG v. 2019 --><br />
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8384266137058067"
     data-ad-slot="8226819743"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>
</div>
</aside>
</div>
<p>L’article <a href="https://www.pierre-giraud.com/afficher-cacher-div-javascript/">Afficher / cacher ou masquer un div ou du texte en JavaScript</a> est apparu en premier sur <a href="https://www.pierre-giraud.com">Pierre Giraud</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.pierre-giraud.com/afficher-cacher-div-javascript/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Installation et découverte de npm, le gestionnaire de paquets de Node.js</title>
		<link>https://www.pierre-giraud.com/npm-installation-decouverte/</link>
					<comments>https://www.pierre-giraud.com/npm-installation-decouverte/#comments</comments>
		
		<dc:creator><![CDATA[Pierre GIRAUD]]></dc:creator>
		<pubDate>Wed, 04 Sep 2019 10:00:47 +0000</pubDate>
				<category><![CDATA[JavaScript]]></category>
		<guid isPermaLink="false">https://www.pierre-giraud.com/?p=11989</guid>

					<description><![CDATA[<p>Qu’est-ce que npm (Node Package Manager) ? npm (Node Package Manager) est le gestionnaire de paquets officiel de Node.js. Il permet de télécharger et d’installer des paquets (encore appelés modules) pour pouvoir les utiliser pour un projet ou au contraire de partager des paquets pour que d’autres utilisateurs puissent les utiliser. Un “package” ou “paquet” ... <a title="Installation et découverte de npm, le gestionnaire de paquets de Node.js" class="read-more" href="https://www.pierre-giraud.com/npm-installation-decouverte/" aria-label="En savoir plus sur Installation et découverte de npm, le gestionnaire de paquets de Node.js">Lire plus</a></p>
<p>L’article <a href="https://www.pierre-giraud.com/npm-installation-decouverte/">Installation et découverte de npm, le gestionnaire de paquets de Node.js</a> est apparu en premier sur <a href="https://www.pierre-giraud.com">Pierre Giraud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="grille2pr">
<article class="ctn2pr">
<h2>Qu’est-ce que npm (Node Package Manager) ?</h2>
<p>npm (Node Package Manager) est le gestionnaire de paquets officiel de Node.js. Il permet de télécharger et d’installer des paquets (encore appelés modules) pour pouvoir les utiliser pour un projet ou au contraire de partager des paquets pour que d’autres utilisateurs puissent les utiliser. </p>
<p>Un “package” ou “paquet” ou encore “module” est un bloc de code cohérent composé de différentes fonctions qui permet d’effectuer une tâche. Utiliser des paquets permet de ne pas avoir à réinventer la roue et de ne pas tout coder nous même : si d’autres développeurs ont déjà développé une fonctionnalité qui nous intéresse, pourquoi ne pas la réutiliser ?</p>
<p>A la base, npm devait uniquement servir de package manager pour Node. Cependant, ce gestionnaire de paquet étant Open Source et ayant été très rapidement adopté par une large communauté de développeurs, il a évolué pour devenir un package manager beaucoup plus global pour l’ensemble du JavaScript et de son environnement et dépassant ainsi le cadre de Node.</p>
<p>Npm est aujourd’hui le plus grand registre de paquets au monde avec plus d’un million de paquets disponibles.  </p>
<p>En tant que développeurs, nous allons donc très souvent utiliser npm pour installer des paquets qui nous intéressent comme React, Express, Moment, Request, Lodash, Async, Chalk, Sass ou encore Debug. </p>
<p>&nbsp;</p>
<h2>Comment télécharger et installer npm ?</h2>
<p>La façon la plus simple d’installer npm est d’installer Node.js puisque npm est livré avec. Pour cela, rendez-vous sur le site <a href="https://nodejs.org/fr/" target="_blank" rel="noopener noreferrer">nodejs.org</a> et téléchargez la dernière version stable (LTS) de Node. </p>
<p><img fetchpriority="high" decoding="async" src="https://www.pierre-giraud.com/wp-content/uploads/2019/09/npm-installation.png" alt="Installation de npm" width="1234" height="440" class="alignnone size-full wp-image-11990" srcset="https://www.pierre-giraud.com/wp-content/uploads/2019/09/npm-installation.png 1234w, https://www.pierre-giraud.com/wp-content/uploads/2019/09/npm-installation-300x107.png 300w, https://www.pierre-giraud.com/wp-content/uploads/2019/09/npm-installation-400x143.png 400w, https://www.pierre-giraud.com/wp-content/uploads/2019/09/npm-installation-768x274.png 768w, https://www.pierre-giraud.com/wp-content/uploads/2019/09/npm-installation-1024x365.png 1024w" sizes="(max-width: 1234px) 100vw, 1234px" /></p>
<p><img decoding="async" src="https://www.pierre-giraud.com/wp-content/uploads/2019/09/npm-installation-terminee.png" alt="Installation de npm et variable $path" width="1234" height="440" class="alignnone size-full wp-image-11991" srcset="https://www.pierre-giraud.com/wp-content/uploads/2019/09/npm-installation-terminee.png 1234w, https://www.pierre-giraud.com/wp-content/uploads/2019/09/npm-installation-terminee-300x107.png 300w, https://www.pierre-giraud.com/wp-content/uploads/2019/09/npm-installation-terminee-400x143.png 400w, https://www.pierre-giraud.com/wp-content/uploads/2019/09/npm-installation-terminee-768x274.png 768w, https://www.pierre-giraud.com/wp-content/uploads/2019/09/npm-installation-terminee-1024x365.png 1024w" sizes="(max-width: 1234px) 100vw, 1234px" /></p>
<p>Pour vérifier que l’installation s’est bien passée, vous pouvez ouvrir votre Terminal ou Invite de commande et taper <code>node -v</code> qui devrait vous renvoyer la version de Node.js installée et <code>npm -v</code> qui devrait vous renvoyer la version de npm installée. </p>
<p><img decoding="async" src="https://www.pierre-giraud.com/wp-content/uploads/2019/09/npm-verification-version.png" alt="Vérification de la version de npm et de node.js installée" width="1400" height="216" class="alignnone size-full wp-image-11992" srcset="https://www.pierre-giraud.com/wp-content/uploads/2019/09/npm-verification-version.png 1400w, https://www.pierre-giraud.com/wp-content/uploads/2019/09/npm-verification-version-300x46.png 300w, https://www.pierre-giraud.com/wp-content/uploads/2019/09/npm-verification-version-400x62.png 400w, https://www.pierre-giraud.com/wp-content/uploads/2019/09/npm-verification-version-768x118.png 768w, https://www.pierre-giraud.com/wp-content/uploads/2019/09/npm-verification-version-1024x158.png 1024w" sizes="(max-width: 1400px) 100vw, 1400px" /></p>
<p>Pour vérifier que vous avez bien la dernière version de npm installée, vous pouvez taper la commande <code>npm install npm -g</code>. </p>
<p>&nbsp;</p>
<h2>Comment installer un nouveau paquet ?</h2>
<p>Une fois npm installé, vous pouvez installer n’importe quel package disponible dans le registre ! Il existe deux façons d&rsquo;installer un paquet avec npm : soit localement, soit globalement. </p>
<p>Pour installer un paquet localement, commencez par <code>cd</code> vers le répertoire de votre projet puis utilisez la commande <code>npm install nom_du_paquet</code> en remplaçant évidemment “nom_du_paquet” par le nom du paquet que vous souhaitez installer. </p>
<p>Si votre projet est important ou is vous travaillez à plusieurs sur un projet, vous voudrez certainement créer un fichier package.json. Ce fichier va détailler les différents paquets installés pour un projet. Il suffira ensuite de taper <code>npm install</code> pour installer toutes les dépendances (paquets) listés dans ce fichier. </p>
<p>Pour créer ce fichier package.json, nous pouvons utiliser la commande <code>npm init</code>. Un assistant s’ouvre pour nous aider à créer notre fichier. Nous allons devoir indiquer : </p>
<ul>
<li>“Name » : Le nom du projet. Laisser vide pour utiliser le nom par défaut correspondant au nom du répertoire du projet.</li>
<li>« Version » : La numéro de version du projet. 1.0.0 par défaut.</li>
<li>« Description » : Description de votre projet qui sera utilisée dans la moteur de recherche de npm si vous partagez le projet.</li>
</ul>
<p>Pour ajouter ensuite des paquets au fichier package.json, il suffit d’utiliser la commande <code>npm install nom_du_paquet --save</code>.</p>
<p>Pour installer un paquet globalement, il suffit d’utiliser la commande <code>npm install</code> avec l’option <code>-g</code>. Pour installer Sass globalement, par exemple, nous taperons <code>npm install -g sass</code>. </p>
<p>&nbsp;</p>
<h2>Comment savoir si un paquet est à jour, mettre à jour un paquet ou le supprimer ?</h2>
<p>Pour obtenir la liste des paquets installés qui ne sont pas à jour (paquets qui disposent d’une version plus récente que celle installée), nous pouvons taper la commande <code>npm outdated</code> pour les paquets locaux ou <code>npm outdated -g</code> pour les paquets globaux. </p>
<p>Cette commande renvoie la liste complète des dépendances non à jour, y compris les dépendances de dépendances (cas où vos paquets utilisent eux mêmes d’autres paquets). Si souhaitez uniquement obtenir la liste des paquets non à jour que vous avez installés, vous pouvez ajouter un paramètre <code>—depth=0</code> à la commande. </p>
<p>Pour mettre à jour les paquets non à jour, nous allons utiliser la commande <code>npm update</code> pour les paquets installés localement ou <code>npm update -g</code> pour les paquets installés globalement. </p>
<p>Enfin, pour supprimer un paquet, nous pouvons utiliser la commande <code>npm uninstall nom_du_paquet</code>. </p>
<p>Note : Le site <a href="https://www.npmjs.com" target="_blank" rel="noopener noreferrer">npmjs.com</a> (site officiel de npm) permet également de découvrir des packages, configurer des profils et gérer d&rsquo;autres aspects de votre expérience npm.<br />
</article>
<aside>
<div class="asidep">
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><br />
<!-- PG v. 2019 --><br />
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8384266137058067"
     data-ad-slot="8226819743"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>
</div>
</aside>
</div>
<p>L’article <a href="https://www.pierre-giraud.com/npm-installation-decouverte/">Installation et découverte de npm, le gestionnaire de paquets de Node.js</a> est apparu en premier sur <a href="https://www.pierre-giraud.com">Pierre Giraud</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.pierre-giraud.com/npm-installation-decouverte/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Créer un convertisseur d’unités en HTML et JavaScript</title>
		<link>https://www.pierre-giraud.com/convertisseur-unites-html-javascript/</link>
					<comments>https://www.pierre-giraud.com/convertisseur-unites-html-javascript/#comments</comments>
		
		<dc:creator><![CDATA[Pierre GIRAUD]]></dc:creator>
		<pubDate>Sat, 06 Jul 2019 10:00:35 +0000</pubDate>
				<category><![CDATA[JavaScript]]></category>
		<guid isPermaLink="false">https://www.pierre-giraud.com?p=9907</guid>

					<description><![CDATA[<p>Le JavaScript est un langage dit dynamique : il va nous permettre d’adapter nos pages en fonction de certaines actions des utilisateurs. On va notamment pouvoir utiliser du JavaScript avec des éléments de formulaire HTML input pour créer en quelques lignes de codes des convertisseurs de toutes sortes comme : Des convertisseurs de poids (g ... <a title="Créer un convertisseur d’unités en HTML et JavaScript" class="read-more" href="https://www.pierre-giraud.com/convertisseur-unites-html-javascript/" aria-label="En savoir plus sur Créer un convertisseur d’unités en HTML et JavaScript">Lire plus</a></p>
<p>L’article <a href="https://www.pierre-giraud.com/convertisseur-unites-html-javascript/">Créer un convertisseur d’unités en HTML et JavaScript</a> est apparu en premier sur <a href="https://www.pierre-giraud.com">Pierre Giraud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="grille2pr">
<article class="ctn2pr">
Le JavaScript est un langage dit dynamique : il va nous permettre d’adapter nos pages en fonction de certaines actions des utilisateurs. </p>
<p>On va notamment pouvoir utiliser du JavaScript avec des éléments de formulaire HTML <code>input</code> pour créer en quelques lignes de codes des convertisseurs de toutes sortes comme : </p>
<ul>
<li>Des convertisseurs de poids (g en kg en livres, etc.) ;</li>
<li>Des convertisseurs de distance (m en km en pouce en pied, etc.) ;</li>
<li>Des convertisseurs de vitesse ;</li>
<li>Des convertisseurs de monnaie ;</li>
<li>Des convertisseurs de température ;</li>
<li>Etc.</li>
</ul>
<p>Quelque soit le convertisseur qu’on souhaite créer en JavaScript, le principe de base sera toujours la même. Dans ce tutoriel, nous allons nous concentrer sur la création d’un convertisseur de poids. N’hésitez pas ensuite à créer d’autres convertisseurs avec d’autres types d’unités, ça vous fera un bon entrainement ! </p>
<p>&nbsp;</p>
<h2>L’élément HTML input : base du convertisseur</h2>
<p>L’élément HTML <code>input</code> (élément de type champ de formulaire) est un élément HTML qui permet aux visiteurs de rentrer et de nous envoyer des données. C’est l’élément généralement privilégié et utilisé lorsqu’on souhaite dynamiser notre site et “dialoguer” avec les utilisateurs. </p>
<p>Nous allons créer trois champs de données <code>input type="number"</code> pour notre convertisseur dans lesquels l’utilisateur pourra saisir une quantité exprimée en grammes, en kilogrammes ou en livres. </p>
<p>On va donc avoir un fichier qui ressemble à cela : </p>
<p><img loading="lazy" decoding="async" src="https://www.pierre-giraud.com/wp-content/uploads/2019/07/convertisseur-unite-input-html.png" alt="Code HTML input de notre convertisseur d&#039;unités JavaScript" width="1400" height="932" class="alignnone size-full wp-image-9910" srcset="https://www.pierre-giraud.com/wp-content/uploads/2019/07/convertisseur-unite-input-html.png 1400w, https://www.pierre-giraud.com/wp-content/uploads/2019/07/convertisseur-unite-input-html-300x200.png 300w, https://www.pierre-giraud.com/wp-content/uploads/2019/07/convertisseur-unite-input-html-400x266.png 400w, https://www.pierre-giraud.com/wp-content/uploads/2019/07/convertisseur-unite-input-html-768x511.png 768w, https://www.pierre-giraud.com/wp-content/uploads/2019/07/convertisseur-unite-input-html-1024x682.png 1024w" sizes="auto, (max-width: 1400px) 100vw, 1400px" /></p>
<p>La mise en forme CSS va être minimale : </p>
<p><img loading="lazy" decoding="async" src="https://www.pierre-giraud.com/wp-content/uploads/2019/07/convertisseur-unite-css.png" alt="Code CSS de notre convertisseur d&#039;unités JavaScript" width="1400" height="212" class="alignnone size-full wp-image-9909" srcset="https://www.pierre-giraud.com/wp-content/uploads/2019/07/convertisseur-unite-css.png 1400w, https://www.pierre-giraud.com/wp-content/uploads/2019/07/convertisseur-unite-css-300x45.png 300w, https://www.pierre-giraud.com/wp-content/uploads/2019/07/convertisseur-unite-css-400x61.png 400w, https://www.pierre-giraud.com/wp-content/uploads/2019/07/convertisseur-unite-css-768x116.png 768w, https://www.pierre-giraud.com/wp-content/uploads/2019/07/convertisseur-unite-css-1024x155.png 1024w" sizes="auto, (max-width: 1400px) 100vw, 1400px" /></p>
<p>L’idée va maintenant être de récupérer les données entrées dans un champ en Javascript et de mettre automatiquement et immédiatement à jour la valeur dans les autres champs. </p>
<p>En effet, si les éléments de formulaires HTML nous permettent de récolter des données utilisateurs, le HTML n’est pas un langage qui permet de manipuler ces données : nous utiliserons un autres langage comme le JavaScript ou le PHP pour cela. </p>
<p>&nbsp;</p>
<h2>Création du convertisseur en JavaScript</h2>
<p>Pour créer notre convertisseur en JavaScript, il suffit de bien réfléchir à ce qu’on souhaite obtenir. Ici, on veut récupérer les données entrées dans l’un des 3 champs en JavaScript (sans savoir au préalable lequel sera rempli), convertir ces données et remplir les autres champs avec les données converties. </p>
<p>Pour récupérer les données d’un champ <code>input</code> en JavaScript, on va utiliser la méthode gestionnaire d’évènements <code>addEventListener()</code> pour réagir à un événement <code>input</code>. L’événement <code>input</code> se déclenche dès que le texte d’un élément <code>input</code> change. </p>
<p>On va ensuite également passer une traditionnelle fonction de rappel anonyme en deuxième argument de <code>addEventListener()</code>. Cette fonction anonyme va elle même appeler notre fonction de conversion. </p>
<p>Lorsque le texte ou la valeur d’un élément <code>input</code> change, on va vouloir récupérer cette valeur, effectuer les conversions et remplir les autres champs. Pour cela, il va déjà falloir qu’on sache quel champ a été rempli. On va pour cela utiliser nos <code>id</code> et la propriété JavaScript <code>id</code> qu’on va passer en premier argument de notre fonction de conversion.</p>
<p>Pour récupérer la valeur d’un champ dès qu’elle est entrée, on va utiliser la propriété <code>value</code> et la syntaxe <code>this.value</code> qu’on va passer en second argument de notre fonction de conversion. </p>
<p><img loading="lazy" decoding="async" src="https://www.pierre-giraud.com/wp-content/uploads/2019/07/convertisseur-unite-addeventlistener-input-javascript.png" alt="Utilisation de addEventListener pour récupérer des donnée input pour notre convertisseur JavaScript" width="1400" height="320" class="alignnone size-full wp-image-9911" srcset="https://www.pierre-giraud.com/wp-content/uploads/2019/07/convertisseur-unite-addeventlistener-input-javascript.png 1400w, https://www.pierre-giraud.com/wp-content/uploads/2019/07/convertisseur-unite-addeventlistener-input-javascript-300x69.png 300w, https://www.pierre-giraud.com/wp-content/uploads/2019/07/convertisseur-unite-addeventlistener-input-javascript-400x91.png 400w, https://www.pierre-giraud.com/wp-content/uploads/2019/07/convertisseur-unite-addeventlistener-input-javascript-768x176.png 768w, https://www.pierre-giraud.com/wp-content/uploads/2019/07/convertisseur-unite-addeventlistener-input-javascript-1024x234.png 1024w" sizes="auto, (max-width: 1400px) 100vw, 1400px" /></p>
<p>Il ne nous reste plus qu’à créer notre fonction de conversion. Dans celle-ci, on va déjà déterminer quel champ a été rempli grâce à la valeur de <code>id</code> et, selon le champ rempli, on va effectuer différentes opérations de conversion et remplir les autres champs en direct. </p>
<p>Le code complet de notre convertisseur est donc le suivant : </p>
<p class="codepen" data-height="542" data-theme-id="0" data-default-tab="js,result" data-user="pierregiraud" data-slug-hash="jgOVMK" style="height: 542px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Convertisseur HTML et JavaScript">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/jgOVMK/"><br />
  Convertisseur HTML et JavaScript</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script><br />
</article>
<aside>
<div class="asidep">
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><br />
<!-- PG v. 2019 --><br />
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8384266137058067"
     data-ad-slot="8226819743"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>
</div>
</aside>
</div>
<p>L’article <a href="https://www.pierre-giraud.com/convertisseur-unites-html-javascript/">Créer un convertisseur d’unités en HTML et JavaScript</a> est apparu en premier sur <a href="https://www.pierre-giraud.com">Pierre Giraud</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.pierre-giraud.com/convertisseur-unites-html-javascript/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Mise en cache de page à l’aide de Disk: Enhanced 
Chargement différé (feed)
Minified using Disk

Served from: www.pierre-giraud.com @ 2026-06-14 20:25:22 by W3 Total Cache
-->