2010-01-07 2 views
12

Ich versuche, ein HTML-Element auf meiner Seite, die eine bestimmte Klasse und ID hat. Hier ist der tag:JQuery Selectors: Wie wähle ich ein Element mit einer bestimmten Klasse * und * ID

<div class="statusLight" id="green"></div> 

Ich habe versucht, dies ohne Glück:

$statusLight = $('.statusLight#green'); 

Ich weiß, dass ich einfach

$statusLight = $('#green'); 

sagen könnte, aber ich versuche, einen Weg zu finden, um es auszuwählen basierend auf seiner Klasse. Jede Hilfe wäre willkommen.

+5

Warum möchten Sie nach Klasse auswählen, wenn Sie die ID kennen? Da IDs eindeutig sind, ist dies der schnellste Weg, ein Element auszuwählen. – cfbarbero

+1

Ich verstehe nicht. Die ID sollte UNIQUE sein und alle Filter beenden. Anwenden von irgendetwas + ID sollte genau das gleiche sein wie die Auswahl nur nach ID. Warum würdest du das jemals tun wollen? –

+0

Auf jeden Fall bin ich ziemlich sicher, dass jQuery stoppt, wenn es die erste Instanz eines Selektors mit einer ID findet, was eine Klassenunterscheidung von doppelten IDs unmöglich macht. –

Antwort

17

Sowohl #green.statusLight als auch .statusLight#green sind gültige Selektoren und sollten das Element auswählen, nach dem Sie suchen. Der Erste wird jedoch schneller sein.

Verwenden Sie $(...), nachdem Ihr Dokument geladen wurde, d. H. Von $(document).ready(function() { ... }) oder indem Sie Ihr Skript nach Ihrem Element platzieren?

+0

Danke Peter für die schnelle Antwort. Es war tatsächlich ein Tippfehler mit "Light" statt "Light". Beide Methoden, die du gabst, funktionierten. – BAHDev

11

Ich bin nicht ganz sicher, warum Sie das tun möchten.

Eine ID sollte eindeutig sein. Wenn Sie sie auswählen, ist keine weitere Spezialisierung erforderlich. Wenn nicht, müssen Sie Ihren HTML-Code ändern, um ihn zu ändern.

Dieses Szenario wäre nur sinnvoll, wenn Sie einen Klassenselektor mit einem Elementselektor kombinieren, z.

$("div.statuslight") 

Aber in Ihrem Beispiel gibt es keinen Sinn, da Sie sowieso eine ID haben!

+0

James, ich stimme dir zu. Wirklich mehr eine Lesbarkeit Sache in meinem Code, aber du hast Recht .. alle IDs sind sowieso einzigartig, also warum müssen sie mehr filtern? Mein Problem war übrigens ein Tippfehler. – BAHDev

+8

Es gibt den Fall, dass Sie die Ereignisdelegierung für ein Element nur ausführen möchten, wenn es eine Klasse hat. Angenommen, Sie haben ein Drag'n'Drop-Element, und Sie möchten nur, dass es anklickbar ist, wenn es eine bestimmte Klasse (über eine Art Interaktion) erhalten hat. –

3

Warum sollten Sie auch in der Klasse auswählen? IDs sollten eindeutig sein. Wenn Sie also die Klasse hinzufügen, würden Sie nichts kaufen. Wenn Sie nur ID verwenden, ist es effizienter, denn dann kann jQuery einfach die native getElementByID verwenden, die immer die schnellste ist. Halten Sie Ihre Abfragen so einfach wie möglich.

+0

@Parrots, stimme ich zu. Dies ist eher eine Lesbarkeit in meinem Code als eine funktionale Notwendigkeit. Danke für den Hinweis. – BAHDev

+6

Ein Grund dafür könnte sein, dass sich die Klasse des Elements ändert und er das Element nur dann auswählen möchte, wenn es die Klasse angegeben hat. (Ok, nur raten, aber der Punkt ist, dass es einen Grund dafür geben kann). [wiederhole denselben Kommentar wie oben] –

0

Ein anderer Grund, dass Sie wahrscheinlich dies tun würden, ist, wenn Sie generischen Code zwischengespeichert haben, der nach einer bestimmten ID sucht, aber Sie möchten nur aktivieren, wenn Sie einen bestimmten Stil zugewiesen haben. Insbesondere beim Rendern von skalierten MVC-Elementen, bei denen IDs in bestimmten Ansichten vorhanden sind, aber keine Aktion ausgeführt werden soll, sagen wir ... "versteckte" ID-Felder, aber in anderen Ansichten können dies Lookup-Werte in einem Combo sein ein AddIn Select2 zugewiesen ...

0

der einfachste Weg ist:

$('.statusLight[id=green]');

Da die ID ein Attribut ist, können Sie das Attribut Selektor

2

$(".class#id") oder $("#id.class") wird verwenden beide arbeiten.

Alle Kommentare in dieser Frage ist, dass es keinen Grund gibt, dies zu tun ... es gibt möglicherweise keinen "Best Practices" Grund, dies mit einem gut gestalteten Programm zu tun, aber in der realen Welt arbeiten die meisten von uns Unternehmen, die Codebasen haben, die nicht sehr gut organisiert sind, und wenn Sie an einem großen 10000+ Dateiprogramm arbeiten, möchten Sie vielleicht keine nicht beschreibende ID ersetzen und indem Sie dem Selektor eine Klasse hinzufügen, können Sie Ihren Mitschreibern helfen, dies zu verstehen wo die ID herkam.

Typischer Fall, ich an einem Projekt arbeiten, wo wir Container DIVs haben, die „Widgets“ auf der Seite ... diese „Widgets“ sind eine numerische ID aus der Datenbank gegeben, so dass wir am Ende des mit <div id="12345" class="widget">

erstellen

Jemand anders hat die mehrdeutige ID lange bevor ich hier arbeitete codiert ... aber es bleibt. Wenn ich JQuery schreibe, würde ich es vorziehen, nicht mehr eine verwirrende Unordnung des Codes zu machen ... so könnte ich anstelle von $("#12345")$(".widget#12345") bevorzugen, so dass jemand keine halbe Stunde verbringen muss, um herauszufinden, dass die 12345 id in diesem Szenario ist für ein Widget.

Also während $("#12345") und $(".widget#12345") wählen Sie das gleiche ... es macht den Code viel lesbarer für meine Mitarbeiter und das ist wichtiger als ein Bruchteil einer Sekunde in der Geschwindigkeit Verbesserung für das Javascript.

+0

In der Tat! Ein weiterer Anwendungsfall, ich verwende Wildcards in meinem ID-Selektor [id^= lightbox_flex_field_flex_field_] und muss in einigen Fällen auch eine Klasse erhalten, um zu unterscheiden, da Benutzer Feldtypen selbst definieren können ... – rept

0

Nur eine Follow-up-Info:

Wenn Sie suchen eine ID und Unterklasse (zB die grüne Statuslight, aber nicht die blau) verweisen:

<div id="green"> 
    <div class="statusLight"></div> 
</div> 

<div id="blue"> 
    <div class="statusLight"></div> 
</div> 

Dann müssen Sie hinzufügen ein Leerzeichen $("#green .statusLight")