jQuery Bestimmen Sie, ob eine übereinstimmende Klasse eine bestimmte ID hat

95

Was ist jQuery, dessen ID der folgenden Anweisung entspricht?

$('#mydiv').hasClass('foo')

Sie können also einen Klassennamen angeben und überprüfen, ob er eine angegebene ID enthält.

etwas wie:

$('.mydiv').hasId('foo')
Nicholas Murray
quelle
Ich möchte einen Stil auf ein bestimmtes Div anwenden. Zum Beispiel werden beim Laden alle mit einer Klasse von foo angezeigt, aber ich möchte möglicherweise eine Instanz der Klasse foo ausschalten, die eine ID von bar hat.
Nicholas Murray
1
Dann würden Sie einfach tun, dass $('#bar.foo').toggle();Sie immer nur eine ID haben, da diese für das Dokument eindeutig sein müssen. Wenn Sie diese ID nur umschalten möchten, wenn sie von Klasse fooist, fügen Sie die Klasse einfach dem ID-Selektor hinzu. Wenn der Selektor eine leere Menge findet, passiert nichts. Wenn er eine Menge mit Ergebnissen findet (von denen es nur eine gibt), schaltet er das Element um. Ich denke, du überdenkst das.
prodigitalson
3
nur um zu sagen, es ist frustrierend, wenn Leute sagen: "Warum willst du das jemals tun?" wenn ich das gerade versuche. Das Problem mit hasClass ist, dass True zurückgegeben wird, wenn ein Element, das mit dem Selektor übereinstimmt, die angegebene Klasse hat. Wo ich also viele p mit der Klasse "Kuchen" und zusätzlichen Klassennamen für jede ("eins", "zwei" usw.) habe, habe ich ein Problem. Ich möchte den allgemeinen Satz von p.cake auswählen und dann eine Bedingung haben (wenn class = "one" - $ var = 23 - etc). Der Punkt ist, dass ich versuche, abhängig vom zusätzlichen Klassennamen eine andere $ var zu übergeben. Ich versuche nicht das ganze bisschen wiederholen zu müssen
Stella

Antworten:

171

Sie können diese Logik in den Selektor einbinden, indem Sie mehrere Selektoren kombinieren . Zum Beispiel könnten wir alle Elemente mit einer bestimmten ID ansprechen, die auch eine bestimmte Klasse haben:

$("#foo.bar"); // Matches <div id="foo" class="bar">

Dies sollte ähnlich aussehen wie etwas, das Sie in CSS schreiben würden. Beachten Sie, dass dies nicht für alle #fooElemente gilt (obwohl es nur eines geben sollte), und dass es nicht für alle .barElemente gilt (obwohl es möglicherweise viele gibt). Es werden nur Elemente referenziert, die für beide Attribute qualifiziert sind.

jQuery hat auch eine großartige .isMethode , mit der Sie feststellen können, ob ein Element bestimmte Eigenschaften hat. Sie können eine jQuery-Auflistung anhand eines Zeichenfolgenselektors, eines HTML-Elements oder eines anderen jQuery-Objekts testen. In diesem Fall überprüfen wir es einfach anhand eines String-Selektors:

$(".bar:first").is("#foo"); // TRUE if first '.bar' in document is also '#foo'
Sampson
quelle
32
+1 für is(). Es sollte einen .hasId()Selektor geben, nur weil es wie ein offensichtlicher Partner für .hasClass()wirklich ...
Matt Fletcher
43

Ich würde das wahrscheinlich verwenden. $('.mydiv').is('#foo');Das heißt, wenn Sie die ID kennen, warum würden Sie sie dann nicht einfach auf den Selektor anwenden?

prodigitalson
quelle
17
Möglicherweise wird der Code in eine Rückruffunktion umgewandelt, die einen bestimmten Fall anders behandeln muss. Daher wird der Funktion automatisch ein jQuery-Objekt mit unbekannten Attributen übergeben. In diesem Fall ist $ ('Ihre Antwort'). ('Hilfreich');
Peter G
1
Ich kann mir eine Reihe von Gründen vorstellen. Was ist, wenn Sie eine mobile spezifische Einstellung anwenden möchten, z. B. wenn ein Element die ID = "mobil" hat? Das Warum ist nicht wichtig.
Platzierbar
Nun, nur 1 Element sollte jemals eine gegebene haben, idsonst sollte es ein anderes Attribut sein ... Ich nehme an, wenn sich die strukturelle Position des fraglichen Elements basierend auf der Seite oder dem Client / Benutzer-Agent ändert, dann ok, aber anders als das. .
prodigitalson
19

Update: Entschuldigung, die Frage wurde falsch verstanden, die .has()Antwort wurde entfernt .

Eine andere Alternative ist das Erstellen eines .hasId()Plugins

// the plugin
$.fn.hasId = function(id) {
  return this.attr('id') == id;
};

// select first class
$('.mydiv').hasId('foo') ?
  console.log('yes') : console.log('no');

// select second class
// $('.mydiv').eq(1).hasId('foo')
// or
$('.mydiv:eq(1)').hasId('foo') ?
  console.log('yes') : console.log('no');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div class="mydiv" id="foo"></div>
<div class="mydiv"></div>

ewwink
quelle
5
Entschuldigung, aber ich denke, Sie haben die Frage falsch interpretiert: has () API meldet dies: Reduzieren Sie die Menge der übereinstimmenden Elemente auf diejenigen, deren Nachkommen dem Selektor oder DOM-Element entsprechen. Das OP fragt, wie getestet werden soll, ob das Element mit der Klasse 'myDiv' auch die ID foo hat, während has () nach Nachkommen von 'myDiv' mit der ID 'foo' sucht.
Tilt
7

Angenommen, Sie durchlaufen einige DOM-Objekte und möchten ein Element mit einer bestimmten ID finden und abfangen

<div id="myDiv">
    <div id="fo"><div>
    <div id="bar"><div>
</div>

Sie können entweder etwas schreiben, um zu finden

$('#myDiv').find('#bar')

Beachten Sie, dass die find-Methode alle übereinstimmenden Elemente zurückgibt, wenn Sie einen Klassenselektor verwenden.

oder Sie könnten eine iterierende Funktion schreiben, die fortgeschrittenere Arbeiten erledigt

<div id="myDiv">
    <div id="fo"><div>
    <div id="bar"><div>
    <div id="fo1"><div>
    <div id="bar1"><div>
    <div id="fo2"><div>
    <div id="bar2"><div>
</div>

$('#myDiv div').each(function() {
   if($(this).attr('id') == 'bar1')
       //do something with bar1
});

Der gleiche Code kann für die Klassenauswahl leicht geändert werden.

<div id="myDiv">
    <div class="fo"><div>
    <div class="bar"><div>
    <div class="fo"><div>
    <div class="bar"><div>
    <div class="fo"><div>
    <div class="bar"><div>
</div>

$('#myDiv div').each(function() {
   if($(this).hasClass('bar'))
       //do something with bar
});

Ich bin froh, dass Sie Ihr Problem mit index () gelöst haben, was auch immer für Sie funktioniert. Ich hoffe, dies wird anderen mit dem gleichen Problem helfen. Prost :)

Nima Foladi
quelle
4
$('#' + theMysteryId + '.someClass').each(function() { /* do stuff */ });
Spitze
quelle
das jeder wird nicht benötigt, weil es nie mehr als eins geben wird #theMysteryId.
prodigitalson
2
Nun, es erspart Ihnen die Mühe, sie einer Variablen zuzuweisen, zu überprüfen, ob die Länge nicht leer ist, und dann mit dem Code fortzufahren. Wenn der Selektor mit nichts übereinstimmt, ruft jQuery die Funktion "each" einfach nicht auf, ist also schön und sauber. Wenn Sie nur eine jQuery-API aufrufen möchten, sind Sie sicher.
Pointy
4

Um nur zu sagen, ich habe dies schließlich mit index () gelöst.

NICHTS anderes schien zu funktionieren.

Für Geschwisterelemente ist dies eine gute Lösung, wenn Sie zuerst eine gemeinsame Klasse auswählen und dann für jede bestimmte Klasse etwas anderes ändern möchten.

BEARBEITEN: Für diejenigen, die (wie ich) nicht wissen, gibt index () einen Indexwert für jedes Element an, der mit dem Selektor übereinstimmt, und zählt von 0, abhängig von ihrer Reihenfolge im DOM. Solange Sie wissen, wie viele Elemente es mit class = "foo" gibt, benötigen Sie keine ID.

Natürlich hilft das nicht immer, aber jemand könnte es nützlich finden.

Stella
quelle
3

Überprüfen Sie, ob die ID des Elements vorhanden ist

if ($('#id').attr('id') == 'id')
{
  //OK
}

Việt Anh
quelle
1

Sie können auch überprüfen, ob das id-Element verwendet wird:

if(typeof $(.div).attr('id') == undefined){
   //element has no id
} else {
   //element has id selector
}

Ich verwende diese Methode für globale Datentabellen und bestimmte geordnete Datentabellen

user3379167
quelle
Das Undefinierte sollte in Anführungszeichen stehen, um so "undefiniert" zu arbeiten
Leo