jeudi 18 mars 2010
En traduisant une librairie Prototype vers jQuery, c'est toujours une bonne occasion de voir les équivalences et de quelle façon on peut faire un workaround pour arriver au même résultat.
Dans un de mes scripts, j'accédais par un sélecteur à un élément du DOM et je devais remonter à un niveau supérieur dans l'imbrication HTML jusqu'à ce que je trouve l'élément cherché. Avec Prototype, j'utilisais Element.ancestors() ou Element.up() pour remonter l'arborescence jusqu'au parent.
Imaginez l'imbrication suivante :
<div id="grand-pere">En connaissant initialement le div "fils", je voulais savoir quel était le conteneur parent ("pere") et remonter jusqu'au géniteur originel ("grand-pere"). Sous jQuery, j'ai converti le code pour faire l'équivalent en utilisant les fonctions suivantes :
<div id="pere">
<div id="fils"></div>
</div>
</div>
// je ne savais pas que la propriété selector existait!Cette dernière me rappelle Dreamweaver (et la fonction Inspect de Firebug) lorsqu'on sélectionne un élément en mode Design. On voit apparaître la descendence du DOM dans la console de Firebug, en commençant par celui rencontré en premier : [div#pere, div#grand-pere, body, html].
var selected = $j('#fils');
console.log(selected.selector); // #fils
// parent immédiat
console.log( $j('#fils').parent() ); // [div#pere]
// array qui permet d'obtenir la liste des nodes parents
console.log( $j('#fils').parents() );
Comme la fonction retourne une liste d'éléments, on peut boucler dans l'array pour le traverser :
$j.each( $j('#fils').parents(),Il suffit ensuite de comparer la valeur de e.id pour savoir à quel niveau s'arrêter.
function(i, e){
console.log(e);
}
);
Aussi, depuis la version 1.3 de jQuery, la méthode .closest( sélecteur ) te permet de répondre au besoin que tu cites en début d'article : "Dans un de mes scripts, j'accédais par un sélecteur à un élément du DOM et je devais remonter à un niveau supérieur dans l'imbrication HTML jusqu'à ce que je trouve l'élément cherché."
cf. http://api.jquery.com ;-)
Un truc qui serait énorme, ça serait de pouvoir retrouver le parent d'un élément en CSS, pour le styler (par exemple quand on a pas accès à la source pour y ajouter des identifiants).
A l'heure actuelle on ne peut styler que les éléments enfants.
@Conradson : en effet!
@Audesou : j'avais testé closest() mais comme je cherchais le div le plus proche du sélecteur (div), il me retournait lui-même. C'est pour ça que j'ai utilisé les autres fonctions.