Il m'a surpris que Sizzle (le moteur de sélection utilise jQuery) est livré avec un sélecteur :nth-child()
intégré, mais il manque un sélecteur :nth-of-type()
.: nth-of-type() dans jQuery/Sizzle?
Pour illustrer la différence entre :nth-child()
et :nth-of-type()
et pour illustrer le problème, pensez the following HTML document:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>:nth-of-type() in Sizzle/jQuery?</title>
<style>
body p:nth-of-type(2n) { background: red; }
</style>
</head>
<body>
<p>The following CSS is applied to this document:</p>
<pre>body p:nth-of-type(2n) { background: red; }</pre>
<p>This is paragraph #1.</p>
<p>This is paragraph #2. (Should be matched.)</p>
<p>This is paragraph #3.</p>
<p>This is paragraph #4. (Should be matched.)</p>
<div>This is not a paragraph, but a <code>div</code>.</div>
<p>This is paragraph #5.</p>
<p>This is paragraph #6. (Should be matched.)</p>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
<script>
$(function() {
// The following should give every second paragraph (those that had red backgrounds already after the CSS was applied) an orange background.
// $('body p:nth-of-type(2n)').css('background', 'orange');
});
</script>
</body>
</html>
Depuis Sizzle utilise les querySelector()
et querySelectorAll()
navigateur natif méthodes si ceux-ci sont présents (par exemple dans les navigateurs qui mettent déjà en œuvre le Selectors API), des choses comme $('body p:nth-child');
vont bien sûr fonctionner. Cela ne fonctionnera pas dans les anciens navigateurs, car Sizzle n'a pas de méthode de secours pour ce sélecteur.
Est-il possible d'ajouter facilement le sélecteur :nth-of-type()
à Sizzle, ou de l'implémenter dans jQuery (en utilisant the built-in :nth-child()
selector, peut-être)? Un custom selector with parameters serait bien.
Je ne suis pas sûr, mais je ne veux pas que $ ('p: pair') 'vous donne ce que vous cherchez? Vous avez déjà le sélecteur ('p'), vous avez juste besoin de le filtrer. – Kobi
@Kobi: Ce n'est pas si simple. Le sélecteur 'p: nth-child (2n)' correspondrait à chaque deuxième paragraphe * de chaque élément parent *. S'il y a deux DIVs, les deux contenant trois paragraphes, les paragraphes suivants (dans l'ordre DOM) seront comparés par 'p: nth-child (2n)': # 2, # 5. Voir? Il ne s'agit pas seulement d'obtenir chaque «P» dans le document, puis de le filtrer à chaque * mn * ème élément. Oui, '$ ('p: even')' est un alias pour '$ ('p: nth-child (2n)')', mais pas pour '$ ('p: nth-of-type (2n) ') '. En outre, j'utilise '2n' dans cet exemple, mais bien sûr d'autres variations devraient aussi être possibles. –
Got it, et supprimé ma réponse. – Kobi