Maintenant que nous avons compris comment JavaScript gère les tableaux HTML, nous pouvons aller encore un peu plus loin, et découvrir comment ajouter des lignes et des cellules dans un tableau.
Si vous vous sentez un peu perdu, je vous invite à retravailler les exemples et exercices.
insertRow([index])
Cette méthode insère une ligne dans un tableau.
Comme vous le constatez, cette méthode utilise un argument facultatif. Il indique l'emplacement dans le tableau. Par défaut il vaut -1, c'est-à-dire à la fin du tableau. Cependant, une fois de plus, vous devez l'indiquer pour être compatible avec tous les navigateurs.
Attends... comment ça -1 ?!
En fait, si vous avez bien suivi la partie précédente, vous devez vous rappeler que la première ligne du tableau est une clé 0, la seconde ligne clé 1, etc.
Ainsi, la -1 est celle précédant la 0, c'est donc la dernière (oui, je dois reconnaître qu'une certaine logique m'échappe...

). Pour autant, ne vous avisez pas d'écrire -2, ça n'existe pas !
InsertRow() est applicable sur table, tbody, tfoot, et thead.
Code : JavaScript - Exemple d'insertRow | var nouvelleLigne = document.getElementById("monBody").insertRow(-1);
|
insertRow() vous retourne la ligne créée. À ce moment là, vous remplissez la ligne avec des
insertCell... (belle transition non ?

).
insertCell([index])
Son fonctionnement est quasi-identique à celui de
insertRow(), sauf que cette fois-ci, on ajoute des cellules dans une ligne (et non pas dans un tableau, attention !). De plus, pour la remplir, vous pouvez utiliser la belle méthode
insertData(decalage, string), mais qui n'est malheureusement pas compatible avec la plupart des navigateurs. On se contentera donc d'
innerHTML.
Exemple
Imaginez que vous devez coder une plate-forme d'administration. Vous voulez réaliser un programme qui démarrera quand on clique sur un bouton. Ce programme va mettre dans un tableau les données (auteur, titre, jour, mois, année) de l'article. Dans ce tableau se trouvent aussi les données des articles précédents.
En gros, voici ce que nous allons demander à l'ordinateur via le JavaScript :
- récupère le titre et l'auteur des champs du formulaire, ainsi que la date d'aujourd'hui ;
- crée une nouvelle ligne dans le tableau ;
- crée des nouvelles colonnes dans le tableau et places-y les données correspondantes.
Code : HTML - Tableau HTML et formulaire pour l'exemple 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 | <form method="post" action="">
<input type="text" name="titre" id="titre" />
<input type="text" name="auteur" id="auteur" />
<input type="button" onclick="ajouterLigne();" value="Enregistrer"/>
</form>
<table id="tableau" border="1">
<thead>
<tr>
<th>Titre</th>
<th>Auteur</th>
<th>Jour</th>
<th>Mois</th>
<th>Année</th>
</tr>
</thead>
<tbody>
<tr>
<td>Premier article</td>
<td>Pierre-Louis</td>
<td>02</td>
<td>06</td>
<td>2007</td>
</tr>
<tr>
<td>Mise-à-jour du système</td>
<td>Admin</td>
<td>01</td>
<td>01</td>
<td>2010</td>
</tr>
<tr>
<td>Le site dans le futur !</td>
<td>MystèreX</td>
<td>20</td>
<td>12</td>
<td>2012</td>
</tr>
</tbody>
</table>
|
Voici la solution commentée. Je l'ai fortement commentée pour vous aider à comprendre.
Secret (cliquez pour afficher)Code : JavaScript - Récupérer le tableau 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 | function ajouterLigne()
{
var tableau = document.getElementById("tableau");
var ligne = tableau.insertRow(-1);//on a ajouté une ligne
var colonne1 = ligne.insertCell(0);//on a une ajouté une cellule
colonne1.innerHTML += document.getElementById("titre").value;//on y met le contenu de titre
var colonne2 = ligne.insertCell(1);//on ajoute la seconde cellule
colonne2.innerHTML += document.getElementById("auteur").value;
var date = new Date();
var colonne3 = ligne.insertCell(2);
colonne3.innerHTML += date.getDate();//on ajoute le jour du mois
var colonne4 = ligne.insertCell(3);
colonne4.innerHTML += date.getMonth()+1;//les mois commencent par 0
var colonne5 = ligne.insertCell(4);
colonne5.innerHTML += date.getFullYear();
}
|
Exercice n°3
Eh bien maintenant, on peut encore aller un peu plus loin, et oui !
Nous allons partir de la même situation. Sauf que maintenant, il faut insérer la ligne de sorte que les dates soient classées par ordre croissant. En effet, vous pouvez voir que la dernière ligne du tableau HTML a pour date 20/12/2012. Il faudrait donc que la ligne insérée arrive juste avant celle-ci.
Cependant... nous n'allons pas nous contenter de placer la ligne dans ce cas particulier (où on écrirait directement
tableau.insertRow(2)), mais bien de manière générale !
Je trouve cet exercice plus difficile que les précédents, car il va utiliser toutes les connaissances acquises.
De ce fait, je vous donne l'algorithme. À vous de voir si vous en avez besoin.
Secret (cliquez pour afficher)
- On pose une variable qui contient l'ensemble des lignes.
- Une autre variable pour le jour, une autre encore pour le mois et une dernière pour l'année.
- On pose i=1, car la première ligne du tableau est occupée par le thead.
- Si la ligne du tableau qui a pour clé i a une année plus vieille que celle actuelle, on passe à la ligne suivante et on repart en 4.
- Sinon, si le mois est déjà passé, on passe à la ligne suivante et on repart en 4.
- Sinon si le jour est déjà passé ou qu'il est le même que celui d'aujourd'hui, on passe à la ligne suivante et on repart en 4.
- Sinon (la date est dans le futur), on arrête la boucle.
Allez cherchez bien ! Vous n'y arriverez peut-être pas du premier coup (comme moi

), mais cherchez l'erreur et résolvez-la, c'est ainsi que vous progresserez.
Secret (cliquez pour afficher)Code : JavaScript - La solution de l'exercice n°3 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 | function ajouterLigne()
{
//on pose toutes les variables dont on aura besoin
var arrayLignes = document.getElementById("tableau").rows;
var date = new Date();
var jour = date.getDate();
var mois = date.getMonth()+1;
var annee = date.getFullYear();
var i=1;//car la première ligne correspond à thead
while(1==1)//on fait une boucle infinie car la boucle s'arrêtera forcément avec le break
{
if(arrayLignes[i].cells[4].innerHTML < annee)//cells[4] désigne la cellule qui contient l'année
{
i++;
continue;//on recommence un tour de boucle
}
else if(arrayLignes[i].cells[3].innerHTML < mois)//cells[3] le mois
{
i++;
continue;//on recommence un tour de boucle
}
else if(arrayLignes[i].cells[2].innerHTML <= jour)//cells[2] le jour
{
i++;
continue;//on recommence un tour de boucle
}
else
{
break;
}
}
//i représente donc maintenant l'indice la ligne à insérer
var ligne = document.getElementById("tableau").insertRow(i);
var colonne1 = ligne.insertCell(0);//on a ajouté une cellule
colonne1.innerHTML += document.getElementById("titre").value;//on y met le contenu de titre
var colonne2 = ligne.insertCell(1);//on ajoute la seconde cellule
colonne2.innerHTML += document.getElementById("auteur").value;
var colonne3 = ligne.insertCell(2);
colonne3.innerHTML += date.getDate();//on ajoute le jour du mois
var colonne4 = ligne.insertCell(3);
colonne4.innerHTML += date.getMonth()+1;//les mois commencent par 0
var colonne5 = ligne.insertCell(4);
colonne5.innerHTML += date.getFullYear();
}
|
J'ai utilisé une boucle infinie car je savais bien que le else me permettrait de l'arrêter. Cependant, si vous n'êtes pas sûr de vous, vous pouvez toujours faire while(i < arrayLignes.length)
qui va vous assurer que le script finira par s'arrêter.
Cette solution respecte bien l'algorithme. Néanmoins, vous pouvez faire un peu plus court.
Secret (cliquez pour afficher)Code : JavaScript - La solution en plus rapide 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 | function ajouterLigne()
{
var arrayLignes = document.getElementById("tableau").rows;
var date = new Date();
var jour = date.getDate();
var mois = date.getMonth()+1;
var annee = date.getFullYear();
var i=1;//car la première ligne correspond à thead
while(1==1)//on fait une boucle infinie car on arrête la boucle avec le break
{
if(arrayLignes[i].cells[4].innerHTML >= annee && arrayLignes[i].cells[3].innerHTML >= mois && arrayLignes[i].cells[2].innerHTML > jour)
{//si la date est dans le futur
//l'inverse de < est >= et celui de <= est > ; faites bien attention à cela
break;
}
i++;
}
//i représente donc maintenant l'indice de la ligne à insérer
var ligne = document.getElementById("tableau").insertRow(i);
ligne.insertCell(0).innerHTML += document.getElementById("titre").value;//on y met le contenu de titre
ligne.insertCell(1).innerHTML += document.getElementById("auteur").value;
ligne.insertCell(2).innerHTML += jour;//on ajoute le jour du mois
ligne.insertCell(3).innerHTML += mois;//les mois commencent par 0
ligne.insertCell(4).innerHTML += annee;
}
|
On peut certainement faire encore plus rapide, mais c'est déjà pas mal non ?