Wählen Sie Elemente nach Attribut aus


253

Ich habe eine Sammlung von Kontrollkästchen mit generierten IDs und einige von ihnen haben ein zusätzliches Attribut. Ist es möglich, mit JQuery zu überprüfen, ob ein Element ein bestimmtes Attribut hat? Kann ich beispielsweise überprüfen, ob das folgende Element das Attribut "myattr" hat? Der Wert des Attributs kann variieren.

<input type="checkbox" id="A" myattr="val_attr">A</input>

Wie kann ich beispielsweise eine Sammlung aller Kontrollkästchen mit diesem Attribut abrufen, ohne sie einzeln zu aktivieren? Ist das möglich?


2
Abgesehen davon ist eine <Eingabe /> ein leeres Tag, das keinen Inhalt enthalten soll. Vielleicht geht es Ihnen nicht darum, das Sehen zu validieren, da Sie myatttr anwesend haben ...
ScottE


Wenn Sie bereits eine Sammlung haben und nur Elemente mit einem bestimmten Attribut herausfiltern möchten, tun Sie es einfach -$filtered = $collection.filter('[attribute_name]');
jave.web

Antworten:


190

Meinst du, kannst du sie auswählen? Wenn ja, dann ja:

$(":checkbox[myattr]")

4
Beachten Sie, dass es beim Testen auf Existenz (vermutlich in einer if-Anweisung zum Beispiel) wahrscheinlich korrekter / zuverlässiger ist: if ($ (": checkbox [myattr]"). Length ()> 0) ...
Rinogo

14
@rinogo: Eigentlich brauchen Sie nur if ($ (": checkbox [myattr]"). length). Die () Nachlänge ist nicht erforderlich, und die Bewertung> 0, 0 wird in Gleichheitstests, die keine strikte Gleichheit erfordern (sowohl Wert als auch Typ), als falsch ausgewertet.
bmarti44

1
Es wirft js Fehler aus, wenn Sie etwas versuchen wie: td [myattr]. Ich denke, diese Funktion war speziell auf Kontrollkästchen ausgerichtet.
Foolbybyprimes

6
Der Doppelpunkt wählt Pseudoklassen aus, die durch den Typ attr bestimmt werden. Um dasselbe auf td's anzuwenden, lassen Sie einfach den Doppelpunkt weg.
Dhochee

Oder wenn Sie sehen möchten, ob etwas kein Attribut hat, z. B. alle Links finden, die keine hrefAttribute haben. $("#myBox").find('a').filter(':not([href])')
Timbrown

368
if ($('#A').attr('myattr')) {
    // attribute exists
} else {
    // attribute does not exist
}

BEARBEITEN:

Das Obige fällt in die else-zweig, wenn es myattrexistiert, ist aber eine leere Zeichenkette oder "0". Wenn dies ein Problem ist, sollten Sie explizit Folgendes testen undefined:

if ($('#A').attr('myattr') !== undefined) {
    // attribute exists
} else {
    // attribute does not exist
}

3
Keine gute Antwort. "undefined" ist kein Schlüsselwort in Javascript. Siehe constc.blogspot.com/2008/07/…
mhenry1384

16
Sie haben Recht ... Aber eine Neudefinition undefinedwird als Randfall angesehen, und der obige Vergleich funktioniert in 99% aller Fälle.
Stefan Gehrig

6
Funktioniert nicht, wenn das Attribut eine leere Zeichenfolge enthält. Ein Beispiel ist myattr = ''
mythischer

3
@mhenry - dann wären Sie im Irrtum :) Wenn Sie das Projekt für mich oder neben mir erstellen würden, müssten Sie Ihren Fehler beheben. Wenn es ein Open-Source-Paket wäre, würde ich (zusammen mit vielen Benutzern) die Verwendung einstellen, da es schlecht codiert ist. Wenn Sie es nicht ändern würden, würde irgendwann jemand anderes eine Version ohne den Fehler geben und die Leute würden diese stattdessen verwenden, und Sie würden Ihr eigenes Projekt verlieren, wie es schon oft passiert ist, wenn jemand ein Paket erstellt, mit dem eine gute Idee ist schlechte Umsetzung. In jedem Fall würde es Ihnen eine Lektion über Codierungspraktiken erteilen :)
Jimbo Jonny

8
if (typeof $ ('# A'). attr ('myattr')! == 'undefined')
James Westgate

166

Ich weiß, dass die Frage schon lange nicht mehr gestellt wurde, aber ich fand den Scheck so klarer:

if ($("#A").is('[myattr]')) {
    // attribute exists
} else {
    // attribute does not exist
}

(Wie auf dieser Seite hier zu finden )

Dokumentation zu is finden Sie hier


Laut W3C werden boolesche Attribute durch Vorhandensein oder Nichtvorhandensein des Attributs definiert. jQuery bietet die Methode .attr () zum Bearbeiten von Attributwerten. Aber wie fügen wir ein Attribut ohne Wert hinzu? Die Methode, mit der Sie das Vorhandensein eines Attributs testen, wird in der jQuery-Dokumentation (1.8.2) nicht beschrieben. Wissen Sie, wie Sie mit jQuery ein Attribut hinzufügen?
chmike

@chmike Um ein Attribut hinzuzufügen, gehe ich folgendermaßen vor: $ ("# A"). prop ("myNewAttribute", someValue); Sie können someValue einen beliebigen Wert Ihrer Wahl geben: Zeichenfolge, Zahl, leere Zeichenfolge, true / false.
Jonathan Bergeron

Dadurch wird das Attribut mit einem zugewiesenen Wert hinzugefügt, der nicht mit einem Attribut ohne Wert identisch ist.
Chmike

5
Ich stimme zu, dies ist die beste Antwort (mit jQuery) - sehr klar und präzise. Ich habe mich gefragt, warum jQuery nicht nur eine hasAttribute () -Funktion hat, und die Antwort ist, dass natives Javascript bereits eine hat. Jedes HTML-Dom-Element verfügt über eine Methode hasAttribute ('attributeName'). Sie könnten also Folgendes tun: $ ('# A') [0] .hasAttribute ('myattr') @chmike - Ich glaube nicht, dass Sie mit jQuery-Funktionen ein leeres Attribut hinzufügen können, aber Sie können dies mit dem HTML-Dom-Element tun Objekt auf ähnliche Weise wie folgt: $ ("# A") [0] .setAttributeNode (document.createAttribute ("myNewAttribute"));
Daniel Howard

1
Nur ein Kommentar, der mir gefällt, aber ich war verwirrt über die Kommentare, in denen gefragt wurde, wie ein Attribut ohne Wert hinzugefügt werden soll. Diese beziehen sich nicht auf die Frage oder die Antwort.
Goodeye

9

Das wird funktionieren:

$('#A')[0].hasAttribute('myattr');


@RetroCoder, was ist dein Punkt über deinen Link? Dieser Test scheint ziemlich gut zu sein, vor allem, weil Sie ihn oft verwenden, $(this).<something>wenn Sie ihn this.hasAttribute('...')direkt ausführen können (und sich natürlich nicht um ältere Browser kümmern).
Alexis Wilke

8

In JavaScript ...

null == undefined

... gibt true* zurück. Es ist der Unterschied zwischen ==und ===. Außerdem kann der Name undefineddefiniert werden (es ist kein Schlüsselwort wie es nullist), sodass Sie besser auf eine andere Weise prüfen sollten. Der zuverlässigste Weg ist wahrscheinlich, den Rückgabewert des typeofBedieners zu vergleichen .

typeof o == "undefined"

Der Vergleich mit null sollte in diesem Fall jedoch funktionieren.

* Angenommen, es undefinedist tatsächlich undefiniert.


Undefiniert ist kein reserviertes Schlüsselwort in JavaScript. In jQuery ist es möglich, seinen Namen genau deshalb zu ändern, weil er mit dem Konstruktor "var" erstellt und nicht bewertet wurde. Oben im Code der magischen Bibliothek befindet sich eine Zeile mit der Aufschrift "var undefined". und auf diese Weise wird eine undefinierte Variable mit diesem Namen im jQuery-Bereich definiert ... Sie kann jedoch trotzdem "unbenannt" genannt werden, indem Sie "var unbenannt" eingeben.
Emanuele Del Grande

1
Dies ist keine Überprüfung auf ein Attribut, diese Überprüfung auf eine Eigenschaft in einem Javascript-Objekt, warum dies 6 Upvotes hat?
Ncubica

5

$("input[attr]").length könnte eine bessere Option sein.


4

Ein paar Ideen wurden mit "typeof", jQuery ".is" und ".filter" herumgeschleudert, also dachte ich, ich würde einen schnellen Perf-Vergleich von ihnen veröffentlichen. Der Typ scheint hierfür die beste Wahl zu sein. Während die anderen funktionieren, scheint es einen deutlichen Leistungsunterschied zu geben, wenn die jq-Bibliothek für diese Bemühungen aufgerufen wird.


2
if (!$("#element").attr('my_attr')){
  //return false
  //attribute doesn't exists
}

1
Dies wird wahrscheinlich nicht funktionieren, da Sie ein Attribut ohne Wert hinzufügen können. In diesem Fall wird diese Bedingung erfüllt, obwohl das gewünschte Verhalten darin bestehen könnte, true zurückzugeben, wird das Attribut festgelegt. ähnlich wie PHPs isset()oder zum Beispiel in js $("#element").attr('my_attr') === false,
ulkas

2

Wie in diesem Beitrag können Sie mit .isund der Attributauswahl []einfach eine Funktion (oder einen Prototyp) hinzufügen:

function hasAttr($sel,attr) {
    return $sel.is('['+attr+']');
}


1

einfach:

$('input[name*="value"]')

Weitere Infos: offizielle Dokumente


1
Nicht entflohene doppelte Anführungszeichen innerhalb der mit doppelten Anführungszeichen definierten Zeichenfolge, keine gültige Zeichenfolge. Leider kann ich es nicht für Sie bearbeiten, da eine Bearbeitung 6 Zeichen oder mehr ändern muss, aber geändert werden muss.
Jimbo Jonny

0

Darüber hinaus alle Elemente mit einem Attribut für die Auswahl $('[someAttribute]')oder $('input[someAttribute]')Sie können auch eine Funktion zu tun boolean Kontrollen auf ein Objekt wie in einem Klick - Handler verwenden:

if(! this.hasAttribute('myattr') ) { ...


0

Ich habe ein npm-Paket mit dem beabsichtigten Verhalten wie oben beschrieben erstellt.

Link zu [npm] und [github]

Die Verwendung ist sehr einfach. Beispielsweise:

<p id="test" class="test">something</p>
$("#test").hasAttr("class")

gibt true zurück.

Funktioniert auch mit Kamelkoffer.


0

Informationen zum Auswählen von Elementen mit einem bestimmten Attribut finden Sie in den obigen Antworten.

Um festzustellen, ob ein bestimmtes jQuery-Element ein bestimmtes Attribut hat, verwende ich ein kleines Plugin, das zurückgibt, truewenn das erste Element in der ajQuery-Auflistung dieses Attribut hat:

/** hasAttr
 ** helper plugin returning boolean if the first element of the collection has a certain attribute
 **/
$.fn.hasAttr = function(attr) {
   return 0 < this.length
       && 'undefined' !== typeof attr
       && undefined !== attr
       && this[0].hasAttribute(attr)
}

-5

JQuery gibt das Attribut als Zeichenfolge zurück. Daher können Sie die Länge dieser Zeichenfolge überprüfen, um festzustellen, ob sie festgelegt ist:

if ($("input#A").attr("myattr").length == 0)
 return null;
else
 return $("input#A").attr("myattr");

Ich weiß also, dass es über ein Jahr her ist und ich hätte es schon vor langer Zeit ansprechen sollen. Ich bin gespannt, welcher Teil nicht funktioniert hat. Wenn ich gewusst hätte, dass Sie nur versuchen, sie auszuwählen, hätte ich den obigen Code nicht angegeben. Ich dachte, Sie wollten sie einzeln überprüfen. JQuery gibt das Attribut tatsächlich als Zeichenfolge zurück, und Sie können die Länge dieser Zeichenfolge wie jede andere Zeichenfolge überprüfen. Solange Ihr Selektor und Ihr Attribut korrekt waren, sollten Sie testen können, ob eine bestimmte Eingabe dieses Attribut hat. Wie auch immer, ich wollte einfach nicht, dass die Leute das Prinzip ablehnen, weil es funktioniert.
Zach

6
In dem Fall, in dem das Attribut nicht vorhanden ist, schlägt dies fehl. In diesem Fall gibt $ ("input # A"). attr ("myattr") eine undefinierte und keine Zeichenfolge zurück, und undefined.length schlägt fehl
Rune FS

Erkennt nur ein leeres Attribut im Vergleich zu einem Attribut mit Inhalt und schlägt bei einem nicht vorhandenen Attribut fehl. Bei der ursprünglichen Frage ging es darum, die Existenz des Attributs zu erkennen, was als Antwort auf die Frage zu einem Fehler führte.
Jimbo Jonny
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.