Pour rendre un tableau plus lisible, il est pratique de mettre un fond de couleur différent pour les lignes paires et les lignes impaires.
Mais c’est parfois pénible de générer un html contenant des class="pair" ou impair selon le rang de la ligne.
En jquery, c’est immédiat :
$('table.tableau//tr:even').addClass('pair');
et hop, les lignes paires des tableaux de classe tableau se retrouvent avec la classe pair.
Facile non ?
Il y a pourtant un effet de bord assez moche, s’il y a plusieurs tableaux dans la page. En effet, si le premier tableau contient par exemple 3 lignes, jquery les numérote 0, 1 et 2, la première est donc paire. Dans le second tableau, l’expression considère la première ligne du tableau comme étant la quatrième qui répond à l’expression, donc numéro 3, donc impair. Bref, le premier tableau commence par une ligne de classe pair et le second tableau, par une ligne sans classe ... et c’est moche.
Il faut donc travailler en deux temps : trouver les tableaux, et pour chacun, trouver les lignes paires. Le résultat est un poil plus compliqué :
$('.tableau').each(function() {
$('tr:even', this).addClass('pair');
});Mais finalement, ça se lit exactement comme la phrase précédente !
Une autre façon de faire consiste à ne pas compter les tr en vrac, mais a demander explicitement les "fils" des tableaux, via le prédicat nth-child qui peut prendre en argument un nombre mais aussi "even".
On obtient alors
$('table.tableau tr:nth-child(even)').addClass('pair');
Comme c’est vraiment trop simple, pour finir, on va chercher la petite bête, en disant qu’on ne veut pas repeindre les lignes d’entête du tableau, c’est à dire celles qui contiennent des th.
La solution est immédiate : « les tr qui contiennent un td », se dit tr[td], donc on obtient :
$('.tableau').each(function() {
$('tr[td]:even', this).addClass('pair');
});C’est vexant de simplicité en fait :-)
On peut aussi reprendre le principe de la solution "sans each()", à condition d’avoir un tableau "propre", c’est à dire avec des blocs thead et tbody, la solution étant alors tout simplement
$('.tableau tbody tr:nth-child(even)').addClass('pair');

