jQuery : les sélecteurs Par JarodxXx
le samedi 10 janvier 2009, 10:05
C'est pour moi une des fonctionnalités les plus puissantes de jQuery : les sélecteurs.
Un sélecteur permet de pointer et d'interagir avec n'importe quel élément de votre code source pour peu qu'il soit existant...
On va pouvoir ainsi modifier autant le contenu d'un <div>, que sa propriété CSS ou encore le masquer ou l'afficher en le combinant avec d'autres fonctions...
Les sélecteurs
Il nous suffit donc de citer un élément en paramètre de jQuery. Je rappelle que la fonction jQuery se note tout simplement "$", et que les paramètres se passent entre parenthèses.
Exemple :
$("body")
va sélectionner la balise <body> de votre page, mais il ne se passera rien puisqu'on ne lui associe aucune fonction !
En revanche avec :
$("body").hide();
On va pouvoir tout simplement masquer toute la page (inutile donc mais c'est un exemple 
La force des sélecteurs, c'est sans aucun doute la possibilité de spécifier en paramètres le chemin vers l'élément.
En effet s'il n'y a qu'un seul élément <body> sur votre page, en revanche il peut y avoir plusieurs balises <a href...>
Imaginons l'exemple suivant :
...
<body>
<div id="global">
<a href="#">clic</a>
<p class="test">
<a href="#">clic</a>
<a href="#" class="ikule">clic</a>
</p>
</div>
</body>
...
On a donc 2 liens <a href...>. L'un peut être identifié par sa classe, l'autre par son absence de classe, mais les deux liens peuvent être identifiés par leurs positions dans la balise <p> !
Exemple de sélection par chemin :
$("body #global .test a.ikule").click();
va déclencher le clic automatique sur le lien (c'est mal, ne le faites pas ).
Pour ce même lien on peut aussi utiliser tout simplement
$(".ikule").click();
Puisque c'est le seul lien qui porte cette classe.
si on fait :
$("a").hide();
On va donc cacher TOUS les liens de la page... pas cool !
Comment faire, donc, pour ne cacher QUE le PREMIER lien qui se trouve dans la balise <p> mais pas au-dessus ?
Rappelez-vous du tuto sur les fonctions essentielles de jQuery. On va donc utiliser la fonction Eq pour pointer sur ce lien.
Deux possibilités :
$("a").eq(1); // la fonction eq commence à compter les éléments à partir de 0. Comme nous voulons la 2e position, on utilise le eq(1);
On peut faire aussi :
$("p a").eq(0);Ici on va sélectionner le 1e élément <a> se trouvant à l'intérieur de <p>.
Voilà , normalement si vous avez compris tout ça, vous devez pouvoir interagir sur tous les éléments de votre page. Cependant il faut connaitre les possibilités offertes par jQuery...
Documentations des sélecteurs jQuery
Considérons que notre élément s'appelle "E" (ce qui n'existe pas !) : E sera donc remplacé par <a> ==> donc $("a");*: n'importe quel élément
E: élément de type E
E:nth-child(n): élément E, le n-ième fils de son père
E:first-child: élément E, le premier fils de son père
E:last-child: élément E, le dernier fils de son père
E:only-child: élément E, seul fils de son père
E:empty: élément E qui n'a pas de fils (en incluant les nœuds textes)
E:enabled: élément de type interface (élément de formulaire) E qui n'est pas désactivé
E:disabled: élément de type interface E qui est désactivé
E:checked: élément de type interface E qui est coché (case à cocher, bouton radio...)
E:selected: élément de type interface E qui est sélectionné (options d'un select). Ce sélecteur n'est pas dans la spécification CSS, mais est supporté par jQuery.
E.warning: élément E dont la classe est "warning"
E#myID: élément E dont l'id est "myID". Ne retourne qu'un élément maximum.
E:not(s): élément E qui ne répond pas à la condition du sélecteur. Exemple : E:not(enabled) = E:disabled
E F: élément F descendant d'un élément E.
E > F: élément F fils d'un élément E.
E + F: élément F immédiatement précédé d'un élément E.
E ~ F: élément F précédé d'un élément E.
E,F,G: sélectionne tous les éléments E, F et G.
Les possibilités des sélecteurs
jQuery ne supporte que les sélecteurs qui sélectionnent des éléments DOM, les autres sont ignorés :
E:link
E:visited
E:active
E:hover
E:focus
E:target
E::first-line
E::first-letter
E::selection
E::before
E::after
jQuery ne supporte pas non plus les sélecteurs suivants en raison de leur utilité très limitée :
E:nth-last-child(n)
E:nth-of-type(n)
E:nth-last-of-type(n)
E:first-of-type
E:last-of-type
E:only-of-type
E:lang(fr)
E[foo~="test"]
E[hreflang|="en"]


















Ziki
Dailymotion
Flickr
Technorati
Twitter
1. Le samedi 10 janvier 2009, 10:44 par Olivier
Je ne vois pas le sélecteur E:machine à café, est-il supporté?
2. Le samedi 10 janvier 2009, 16:34 par GeekFG
Pour le $("a").eq(1); tu peux aussi faire $("a:eq(1)");
Je trouve cela plus stylé et propre à écrire, mais ce n'est que mon humble point de vue :).
3. Le samedi 10 janvier 2009, 18:14 par Julien
+1 avec GeekFG !
4. Le samedi 10 janvier 2009, 19:46 par guiralantoine
+1, mieux vaut en utilisant la méthode eq(1) tu applique une méthode à ton objet jquery ce qui va lui faire reparcourir l'arbre alors que les selecteur CSS/XPATH permettent de recup directement le premier élément.
Ensuite la methode clic() ne clique pas automatiquement sur un lien, elle remplace la méthode onClick habituellement utilisée en mode intrusif.
5. Le dimanche 11 janvier 2009, 02:59 par oelmekki
@guiralantoine :
si, la fonction click() execute l'événement onClick, c'est click( fonction ) qui bind un nouvel événement (cf http://docs.jquery.com/Events/click ).
@jarodxxx :
Je rejoins en revanche les autres sur la préférence donnée aux filtres directement dans le selecteur plutôt qu'en les chaînant. Appeler eq() n'a un réel intérêt que lorsque l'objet jquery auquel il est appliqué est dynamique.
Un autre point que tu aurais pu aborder ici est le contexte, qui permet de passer un objet jquery en second argument du sélecteur pour y restreindre la sélection.
ex:
var divs = [ $('#un-div-au-pif'), $('#un-autre') ];
$.each( divs, function(i,el){ $( 'p:first', el).hide() });
6. Le dimanche 11 janvier 2009, 11:53 par GeekFG
Je viens de voir qu'il est conseillé d'utiliser $('a:eq(1)'); au lieu d'utiliser .eq(1), voir : http://docs.jquery.com/Release:jQue...
7. Le dimanche 11 janvier 2009, 14:43 par oelmekki
@GeekFG
ah tiens, je ne savais pas que c'était carrément marqué deprecated, merci pour l'info. La version 1.3 de jquery étant actuellement en beta test, il ne serait pas surprenant de voir cette méthode disparaître totalement bientôt.
Je trouve un peu dommage de devoir utiliser un slice quand on veut un seul élément, mais je suppose que ça va permettre d'alléger le code de jquery même en groupant des fonctions aux effets proches.
Enfin, quand on aura besoin de quelque chose de dynamique, on pourra toujours utiliser le eq() dans un sélecteur en lui fournissant un contexte (et là , je me rend compte que c'est *déjà * ce que je fais).
8. Le lundi 12 janvier 2009, 20:49 par remrem
Juste une petite question d'un noob en jquery et js... comment récupérer dans une variable la valeur de eq() ?
par exemple avec un hover ? Merci
google ne m'a pas aidé sur ce coup ...
9. Le lundi 12 janvier 2009, 21:36 par remrem
A trouvé ...
var index = $("#bouton li a").index(this);
Désolé pour le dérangement ...