formateur informatique

Filtrer un tableau de recherche en Javascript

Accueil  >  Technique  >  Javascript  >  Javascript Astuces  >  Filtrer un tableau de recherche en Javascript
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :


Inscription Newsletter    Abonner à Youtube    Vidéos astuces Instagram
Sujets que vous pourriez aussi aimer :


Filtrer les lignes d'un tableau HTML

Avec cette nouvelle astuce de code Javascript, nous allons apprendre à masquer les lignes d'un tableau pour lesquelles les termes hébergés ne contiennent pas la suite de lettres tapées par l'utilisateur dans la zone de recherche.

Filtrer les lignes du tableau Html en Javascript

Sur l'exemple illustré par la capture, nous travaillons sur un tableau listant des personnes avec les prénoms et noms accompagnés de la civilité. Il est constitué de dix-sept lignes, soit de dix-sept personnes. Lorsque l'utilisateur tape les premiers caractères dans la zone de recherche située au-dessus du tableau, comme la lettre a suivie de la lettre n, seules quatre lignes subsistent. En effet, seuls quatre prénoms et noms proposent cette séquence. Et lorsqu'il ajoute une troisième lettre, par exemple de nouveau la lettre n, le filtre exercé par Javascript restreint les résultats à deux lignes concordantes.

Base de travail
Pour la mise en place de cet étonnant code Javascript, nous proposons d'appuyer l'étude sur une page Web offrant déjà ce tableau et ainsi qu'une mise en page par des styles Css. Comme vous le constatez, la décompression livre le fichier de la page Web, index.htm, accompagné de sa feuille de styles dans le sous dossier Css.
  • Double cliquer sur le fichier index.htm pour l'ouvrir dans le navigateur par défaut,
Nous trouvons bien le tableau des personnes énumérées. Mais à ce stade bien entendu, si vous tapez des lettres dans la zone de recherche, aucun filtre ne s'exerce encore.
  • A la racine du dossier de décompression, cliquer droit sur le fichier index.htm,
  • Dans le menu contextuel, choisir de l'ouvrir avec un éditeur comme le Notepad++,
La construction Html à analyser est embarquée dans le calque (balise Div) associé au style conteneur. La zone de recherche est une zone de texte associée au style zoneSaisie. Elle porte l'identifiant maRecherche. Cet identifiant est important pour pouvoir la piloter par le code Javascript. Durant la saisie, à chaque fois qu'une touche frappée est relâchée (onkeyup), elle appelle la fonction filtrer. Cette fonction existe déjà dans la section de script, en bas du code Html. Mais naturellement, elle est vide pour l'instant. Son attribut placeholder est très intéressant. Le texte guide qu'il affiche dans la zone de saisie s'évapore dès qu'une première lettre est tapée.

...
<div class="conteneur">
<h2>Filtrer une table</h2>
<p>Recherche sur le nom dans la zone de saisie.</p>

<input class="zoneSaisie" type="text" placeholder="Recherche sur les noms et prénoms..." id="maRecherche" onkeyup="filtrer()">

<table class="tableau" id="tableau">
<tr>
<th style="width:60%;">Prénom Nom</th>
<th style="width:40%;">Pays</th>
</tr>
<tr>
<td>Adame Marc</td>
<td>Monsieur</td>
</tr>
<tr>
<td>Aijaune Giles</td>
<td>Monsieur</td>
...


C'est ensuite que survient le tableau avec l'élément Html table. Il porte l'identifiant tableau. Une fois encore ce dernier va nous être utile pour récupérer toutes les lignes qu'il contient afin de les parcourir et chercher les cellules qui proposent effectivement la suite de lettres tapées par l'utilisateur. Chaque ligne (tr) est constituée de deux colonnes (td). La recherche doit s'exercer sur les noms, donc sur la première colonne de chaque ligne.

Déclarer les variables
Pour débuter, nous avons besoin de quelques variables, notamment pour piloter le tableau et ses lignes.
  • Dans les bornes de la fonction, en bas du code Html, ajouter les déclarations suivantes :
<script>
function filtrer()
{
var filtre, tableau, ligne, cellule, i, texte;
}
</script>


La variable filtre doit être utilisée pour récupérer le texte cherché, tapé dans la zone de saisie. La variable tableau parle d'elle-même. Elle doit pointer sur le tableau par son identifiant. C'est ainsi que la variable ligne pourra exploiter l'une de ses méthodes pour stocker la collection de lignes qu'il contient. Grâce à elle, nous allons pouvoir les parcourir toutes et ainsi récupérer tour à tour le contenu des cellules à comparer avec l'expression tapée. C'est la raison de la déclaration de la variable cellule. La variable i est une variable de boucle. Enfin, la variable texte doit servir à récupérer chaque contenu de cellule à confronter avec le terme de recherche.

Récupérer le texte cherché
Maintenant, nous devons commencer par stocker le texte de recherche dans la variable filtre. Comme vous le savez, c'est la méthode getElementById de l'objet Javascript document qui permet de pointer sur un élément Html reconnu par son identifiant.
  • Après les déclarations, ajouter la ligne Javascript suivante :
...
filtre = document.getElementById("maRecherche") .value.toUpperCase();
...


La propriété value de l'élément Html ainsi récupéré permet d'accéder à son contenu. Grâce à la méthode toUpperCase, nous le transformons en majuscules pour éviter les différences de casse dans les comparaisons. Nous le comprendrons en temps voulu. Désormais, le texte de recherche converti en majuscules est donc stocké dans la variable filtre.

Récupérer les lignes du tableau Html
Désormais, pour récupérer toutes les lignes du tableau, nous devons commencer par pointer sur ce dernier, naturellement toujours grâce à la méthode getElementById. C'est ensuite une autre méthode héritée par l'objet ainsi créé qui permettra de récupérer la collection des lignes qu'il contient.
  • A la suite du code de la fonction, ajouter les deux instructions Javascript suivantes :
...
tableau = document.getElementById("tableau");
ligne = tableau.getElementsByTagName("tr");
...


Nous stockons tout d'abord le tableau dans la variable objet tableau. Dès lors, il offre une méthode très précieuse qui se nomme getElementsByTagName. Comme son nom anglais l'indique, elle permet de récupérer tous les éléments qu'il contient par reconnaissance du nom de la balise. En lui transmettant la valeur tr en paramètre, Nous récupérons la collection des lignes de ce tableau désormais stockées dans le tableau de variables ligne. C'est grâce à ce tableau de variables que nous allons maintenant pouvoir parcourir toutes les lignes une à une à la recherche des concordances.

Parcourir les lignes du tableau Html
Et c'est avec une classique boucle for que nous allons pouvoir partir de la première ligne qu'il recèle jusqu'à la dernière.
  • A la suite du code de la fonction, créer la boucle for comme suit :
...
for (i = 0; i < ligne.length; i++)
{
cellule = ligne[i].getElementsByTagName("td")[0];
}
...


C'est la propriété length d'un tableau de variables qui renvoie le nombre d'éléments qu'il contient. Comme nous partons de l'indice zéro, nous nous arrêtons une unité avant (< ligne.length) sans oublier d'incrémenter la variable de boucle (i++). Puis, à chaque passage dans la boucle, nous récupérons le contenu de la première cellule pour la ligne en cours d'analyse. C'est une fois encore la méthode getElementsByTagName qui permet de récupérer la collection des balises td que chaque ligne contient. Nous le savons, elles ne sont constituées que de deux colonnes. Nous prélevons donc le contenu de la première à l'indice zéro (getElementsByTagName("td")[0]). Et ce contenu est donc stocké dans la variable cellule.

Il va donc changer à chaque passage. Avant cela, nous devons le comparer aux termes cherchés pour savoir si la ligne doit être masquée ou non. Mais tout d'abord, une sécurité est nécessaire.
  • A la suite du code de la boucle, ajouter l'instruction conditionnelle suivante :
...
if(cellule)
{

}
...

En effet, nous parcourons les lignes d'un tableau. Nous croisons donc des éléments td mais aussi des éléments tr. Pour que la comparaison à venir ne soit pas compromise et ne fasse pas avorter le code, nous nous assurons que nous sommes bien dans un élément de cellule.

Récupérer le texte de chaque ligne
Cette variable cellule représente donc l'élément Html td désignant la première cellule en cours d'analyse dans la boucle. Et pour tout élément Html, la propriété innerText permet d'accéder à son contenu pour le récupérer.
  • Dans l'instruction conditionnelle, ajouter l'instruction Javascript suivante :
...
texte = cellule.innerText;
...


Masquer les lignes non concordantes
Maintenant que les contenus des premières cellules de chaque ligne sont prélevés tour à tour et stockés temporairement dans la variable texte, nous allons pouvoir les confronter au texte de recherche saisi dans la zone maRecherche. Souvenez-vous, son contenu est mémorisé dans la variable filtre. Et en Javascript, c'est la méthode indexOf qui permet de savoir si une expression porte un terme cherché. Elle répond par un indicateur de position. Lorsqu'elle renvoie la valeur -1, elle indique que le terme n'a pas été trouvé. C'est ce que nous devons donc tester à l'aide d'une instruction conditionnelle.
  • A la suite du code de la boucle, créer l'instruction conditionnelle suivante :
...
if (texte.toUpperCase().indexOf(filtre) > -1)
{

}
else
{

}
...


Grâce à la méthode toUpperCase, nous transformons tout d'abord le contenu de la cellule en cours d'analyse en majuscule. Ainsi, nous ne nous soucions pas des différences de casse puisque nous l'avons dit, la variable filtre stocke elle-même le texte de recherche en majuscule. Dès lors, nous lui appliquons la méthode indexOf sur le texte de recherche passé en paramètre.

Filtrer le tableau
Donc si cette méthode retourne bien une position (>-1), nous devons conserver la ligne en cours car elle est concordante. Dans le cas contraire (else), nous devons la masquer. Et pour cela, nous devons agir sur l'attribut Css display de la cellule en cours.
  • Dans les branches de l'instruction conditionnelle, ajouter les lignes respectives suivantes :
...
if (texte.toUpperCase().indexOf(filtre) > -1)
{
ligne[i].style.display = "";
}
else
{
ligne[i].style.display = "none";
}
...


Lorsque la recherche du terme échoue (else), nous masquons la ligne en réglant l'attribut display à none. Lorsqu'elle est avérée en revanche, nous effaçons ("") les précédents potentiels réglages entrepris par une précédente recherche pour garder la ligne ou la réafficher.

Il est temps de tester le résultat.
  • Enregistrer les modifications (CTRL + S),
  • Basculer sur le navigateur Web (ALT + Tab),
  • Puis, rafraîchir la page (F5),
  • Dans la zone de recherche, taper d'abord la lettre a,
Quelques enregistrements disparaissent. Le tableau filtre automatiquement tous les noms ne proposant pas cette lettre, grâce au code Javascript.
  • A la suite, taper par exemple la lettre u,
Cette fois, seuls subsistent trois enregistrements. Il s'agit des seuls offrant cette succession de deux lettres dans l'ordre.

Filtrer les lignes du tableau Html en fonction des lettres tapées grâce au code Javascript

Nous avons donc démontré une astuce fort intéressante pour proposer des résultats de recherche instantanés sur un site Web et ce, par le code client, donc sans solliciter le serveur.

Le code Javascript que nous avons accompli pour aboutir cette solution reste relativement simple :

function filtrer()
{
var filtre, tableau, ligne, cellule, i, texte;

filtre = document.getElementById("maRecherche") .value.toUpperCase();
tableau = document.getElementById("tableau");
ligne = tableau.getElementsByTagName("tr");

for (i = 0; i < ligne.length; i++)
{
cellule = ligne[i].getElementsByTagName("td")[0];
if(cellule)
{
texte = cellule.innerText;
if (texte.toUpperCase().indexOf(filtre) > -1)
{
ligne[i].style.display = "";
}
else
{
ligne[i].style.display = "none";
}
}
}
}


 
Sur Facebook
Sur Youtube
Les livres
Contact
Mentions légales



Abonnement à la chaîne Youtube
Partager la formation
Partager sur Facebook
Partager sur Twitter
Partager sur LinkedIn