16 Stimmen

:nth-of-type() in jQuery / Sizzle?

Es hat mich überrascht, dass Sizzle (die Selektor-Engine, die jQuery verwendet) verfügt über eine eingebaute :nth-child() Selektor, aber es fehlt ein :nth-of-type() Selektor.

Zur Veranschaulichung des Unterschieds zwischen :nth-child() y :nth-of-type() und um das Problem zu veranschaulichen, betrachten wir das folgende HTML-Dokument :

<!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>

Da Sizzle die browser-native querySelector() y querySelectorAll() Methoden, wenn diese vorhanden sind (d. h. in Browsern, die bereits die Selektoren-API ), Dinge wie $('body p:nth-child'); wird natürlich funktionieren. Es wird jedoch nicht in älteren Browsern funktionieren, da Sizzle keine Fallback-Methode für diesen Selektor hat.

Ist es möglich, auf einfache Weise die :nth-of-type() Selektor für Sizzle zu verwenden oder ihn in jQuery zu implementieren (indem man den eingebauten :nth-child() Selektor vielleicht)? A benutzerdefinierter Selektor mit Parametern wäre schön.

14voto

gblazex Punkte 47453
/**
 * Return true to include current element
 * Return false to exclude current element
 */
$.expr[':']['nth-of-type'] = function(elem, i, match) {
    if (match[3].indexOf("n") === -1) return i + 1 == match[3];
    var parts = match[3].split("+");
    return (i + 1 - (parts[1] || 0)) % parseInt(parts[0], 10) === 0;
};

Testfall - ( im IE überprüfen oder den Selektor umbenennen )

Sie können natürlich hinzufügen sogar & ungerade auch:

match[3] = match[3] == "even" ? "2n" : match[3] == "odd" ? "2n+1" : match[3];

4voto

Emil Stenström Punkte 11959

Das jQuery-Plugin moreSelectors hat Unterstützung für nth-of-type (und viele andere Selektoren). Ich schlage vor, entweder mit, dass, oder implementieren Sie einfach ein einfaches Plugin, das nur die genaue Selektoren, die Sie benötigen implementiert. Sie sollten in der Lage sein, Code von dort zu kopieren und einzufügen.

Viel Spaß beim Hacken!

1voto

James Wiseman Punkte 29172

Ich kann nicht behaupten, zu wissen, wie nth-of-type implementiert ist, aber jQuery bietet einen Mechanismus, mit dem Sie Ihre eigenen benutzerdefinierten Selektor erstellen können.

Die folgende Frage befasst sich mit benutzerdefinierten Selektoren und könnte Ihnen einen nützlichen Einblick verschaffen

Welche nützlichen benutzerdefinierten jQuery-Selektoren haben Sie geschrieben?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X