Wie kann ich die Existenz eines Elements in jQuery überprüfen?
Der aktuelle Code, den ich habe, ist folgender:
if ($(selector).length > 0) {
// Do something
}
Gibt es einen eleganteren Weg, dies zu erreichen? Vielleicht ein Plugin oder eine Funktion?
javascript
jquery
Jake McGraw
quelle
quelle
NaN != false
.[] + []
=""
... ahh ich liebe Javascript[].toString() === [].join(',') === ""
und"" === ""
.typeof NaN == 'number'
Ja!
Dies ist eine Antwort auf: Herding Code Podcast mit Jeff Atwood
quelle
$.fn.exists
Beispiel ist das Ersetzen einer Eigenschaftssuche (billig!) Durch zwei Funktionsaufrufe, die viel teurer sind - und einer dieser Funktionsaufrufe erstellt ein bereits vorhandenes jQuery-Objekt neu, was einfach albern ist..exists
sauber gelesen, während es.length
als etwas semantisch anderes gelesen wird, selbst wenn die Semantik mit einem identischen Ergebnis übereinstimmt.Wenn du benutzt hast
Sie würden implizieren, dass eine Verkettung möglich war, wenn dies nicht der Fall ist.
Das wäre besser:
Alternativ aus den FAQ :
Sie können auch Folgendes verwenden. Wenn das jQuery-Objektarray keine Werte enthält, wird das Abrufen des ersten Elements im Array undefiniert zurückgegeben.
quelle
$(".missing").css("color", "red")
macht schon das Richtige… (dh nichts)$.fn
Methoden, die etwas anderes als ein neues jQuery-Objekt zurückgeben und daher nicht verketten.Sie können dies verwenden:
quelle
Der schnellste und semantisch selbsterklärendste Weg, die Existenz zu überprüfen, ist die Verwendung von plain
JavaScript
:Das Schreiben ist etwas länger als die Alternative zur jQuery-Länge, wird jedoch schneller ausgeführt, da es sich um eine native JS-Methode handelt.
Und es ist besser als die Alternative, eine eigene
jQuery
Funktion zu schreiben . Diese Alternative ist aus den von @snover angegebenen Gründen langsamer. Es würde aber auch anderen Programmierern den Eindruck vermitteln, dass dieexists()
Funktion jQuery eigen ist.JavaScript
würde / sollte von anderen verstanden werden, die Ihren Code bearbeiten, ohne die Wissensverschuldung zu erhöhen.NB: Beachten Sie das Fehlen eines '#' vor dem
element_id
(da dies nur JS ist, nichtjQuery
).quelle
$('#foo a.special')
. Und es kann mehr als ein Element zurückgeben.getElementById
Ich kann nicht anfangen, mich dem anzunähern.if(document.querySelector("#foo a.special"))
würde funktionieren. Keine jQuery erforderlich.Sie können einige Bytes speichern, indem Sie Folgendes schreiben:
Dies funktioniert, weil sich jedes jQuery-Objekt auch als Array tarnt, sodass wir den Array-Dereferenzierungsoperator verwenden können, um das erste Element aus dem Array abzurufen . Es wird zurückgegeben,
undefined
wenn sich am angegebenen Index kein Element befindet.quelle
jQuery.first()
oderjQuery.eq(0)
beide geben Objekte zurück, Objekte sind wahr, auch wenn sie leer sind. Dieses Beispiel sollte veranschaulichen, warum diese Funktionen nicht unverändert verwendet werden können:if(jQuery("#does-not-exist").eq(0)) alert("#does-not-exist exists")
.eq(0)
Gibt nur ein anderes jQuery-Objekt zurück, das auf Länge 1 oder 0 abgeschnitten wurde. Dies.first()
ist nur eine bequeme Methode für.eq(0)
. Aber.get(0)
gibt das erste DOM - Element oderundefined
und ist das gleiche wie[0]
. Das erste DOM-Element in einem jQuery-Objekt wird in der regulären Objekteigenschaft mit dem Namen gespeichert'0'
. Das ist ein einfacher Zugang zu Immobilien. Das einzige Typ-Casting ergibt sich aus der impliziten Konvertierung der Zahl0
in die Zeichenfolge'0'
. Wenn also Typ Casting ein Problem ist, können Sie$.find(selector)['0']
stattdessen verwenden.Sie können verwenden:
Ein wenig elegante, vielleicht.
quelle
666
haben wahrscheinlich viele andere Gründe, warum ihr Code kaputt ist. Obwohl es sich um einen ungültigen Selektor handelt, ist $ (666) .length ein gültiges Javascript : Es wird als wahr ausgewertet und sollte daher die Bedingung erfüllen.$.find(666).length
funktioniert.Dieses Plugin kann in einer
if
Anweisung wieif ($(ele).exist()) { /* DO WORK */ }
oder mithilfe eines Rückrufs verwendet werden.Plugin
jsFiddle
Sie können einen oder zwei Rückrufe angeben. Der erste wird ausgelöst, wenn das Element vorhanden ist, der zweite wird ausgelöst, wenn das Element nicht vorhanden ist. Wenn Sie jedoch nur eine Funktion übergeben, wird diese nur ausgelöst, wenn das Element vorhanden ist. Somit stirbt die Kette, wenn das ausgewählte Element dies nicht tut existiert. Wenn es existiert, wird natürlich die erste Funktion ausgelöst und die Kette wird fortgesetzt.
Beachten Sie, dass die Verwendung der Rückrufvariante zur Aufrechterhaltung der Verkettbarkeit beiträgt - das Element wird zurückgegeben und Sie können Befehle wie bei jeder anderen jQuery-Methode weiter verketten!
Beispielverwendungen
quelle
Has Items
Rückruf in der Rückrufversion das Objekt nicht tatsächlich als Argument übergeben?Ich sehe, dass die meisten Antworten hier nicht genau sind, wie sie sein sollten. Sie überprüfen die Elementlänge. In vielen Fällen kann dies in Ordnung sein , aber nicht zu 100% . Stellen Sie sich vor, die Zahl wird stattdessen an die Funktion übergeben, und ich prototypisiere eine Funktion, die alle überprüft Bedingungen und geben Sie die Antwort zurück, wie es sein sollte:
Dadurch werden sowohl Länge als auch Typ überprüft. Jetzt können Sie dies folgendermaßen überprüfen:
quelle
JQuery ist wirklich nicht erforderlich. Mit einfachem JavaScript ist es einfacher und semantisch korrekter:
Wenn Sie dem Element aus irgendeinem Grund keine ID hinzufügen möchten, können Sie dennoch eine andere JavaScript-Methode verwenden, die für den Zugriff auf das DOM entwickelt wurde.
jQuery ist wirklich cool, aber lassen Sie reines JavaScript nicht in Vergessenheit geraten ...
quelle
:has()
?Sie könnten dies verwenden:
quelle
Der Grund, warum alle vorherigen Antworten den
.length
Parameter erfordern , ist, dass sie meistens den$()
Selektor von jquery verwenden, der querySelectorAll hinter den Vorhängen hat (oder ihn direkt verwenden). Diese Methode ist ziemlich langsam, da der gesamte DOM-Baum analysiert werden muss, um nach allen Übereinstimmungen mit diesem Selektor zu suchen und ein Array mit diesen zu füllen.Der Parameter ['length'] wird nicht benötigt oder ist nicht nützlich, und der Code ist viel schneller, wenn Sie ihn direkt verwenden
document.querySelector(selector)
, da er das erste Element zurückgibt, mit dem er übereinstimmt, oder null, wenn er nicht gefunden wird.Bei dieser Methode bleibt jedoch das tatsächlich zurückgegebene Objekt erhalten. Das ist in Ordnung, wenn es nicht als Variable gespeichert und wiederholt verwendet wird (so dass die Referenz erhalten bleibt, wenn wir es vergessen).
In einigen Fällen kann dies erwünscht sein. Es kann in einer for-Schleife wie folgt verwendet werden:
Wenn Sie das Element nicht wirklich benötigen und nur ein wahres / falsches Element erhalten / speichern möchten, verdoppeln Sie es einfach nicht !! Es funktioniert für Schuhe, die sich lösen. Warum also hier knoten?
quelle
Ist
$.contains()
was du willstquelle
Ich habe festgestellt
if ($(selector).length) {}
, dass dies nicht ausreicht. Es wird Ihre App stillschweigend beschädigen, wennselector
es sich um ein leeres Objekt handelt{}
.Mein einziger Vorschlag ist, eine zusätzliche Prüfung durchzuführen
{}
.Ich bin immer noch auf der Suche nach einer besseren Lösung, da diese etwas schwer ist.
Edit: WARNUNG! Dies funktioniert im IE nicht, wenn
selector
es sich um eine Zeichenfolge handelt.quelle
$()
mit einem leeren Objekt als Argument an?{}
zu$()
?Sie können überprüfen, ob das Element vorhanden ist oder nicht, indem Sie die Länge im Java-Skript verwenden. Wenn die Länge größer als Null ist, ist das Element vorhanden. Wenn die Länge Null ist, ist das Element nicht vorhanden
quelle
Die Überprüfung der Existenz eines Elements ist auf der offiziellen jQuery-Website selbst übersichtlich dokumentiert!
quelle
Dies ist allen Antworten sehr ähnlich, aber warum nicht den
!
Operator zweimal verwenden, damit Sie einen Booleschen Wert erhalten:quelle
Boolean(x)
kann manchmal effizienter sein.quelle
if
demif
die Lesbarkeit auf Kosten von 2 Bytes verbessert wird.&&
für Sie.Versuchen Sie, auf
DOM
Elemente zu testenquelle
Inspiriert von Hiways Antwort fand ich Folgendes:
jQuery.contains verwendet zwei DOM-Elemente und prüft, ob das erste das zweite enthält.
Die Verwendung
document.documentElement
als erstes Argument erfüllt die Semantik derexists
Methode, wenn wir sie nur anwenden möchten, um die Existenz eines Elements im aktuellen Dokument zu überprüfen.Im Folgenden habe ich ein Snippet zusammengestellt, das
jQuery.exists()
mit dem$(sel)[0]
und den$(sel).length
Ansätzen verglichen wirdtruthy
, für die beide Werte für$(4)
while$(4).exists()
zurückgebenfalse
. Im Zusammenhang mit der Überprüfung der Existenz eines Elements im DOM scheint dies das gewünschte Ergebnis zu sein .Code-Snippet anzeigen
quelle
Keine Notwendigkeit für jQuery (Basislösung)
Viel leistungsfähigere Option unten (beachten Sie das Fehlen eines Punktes vor einer Klasse).
querySelector verwendet eine geeignete Matching-Engine wie $ () (sizzle) in jQuery und verbraucht mehr Rechenleistung, reicht jedoch in 99% der Fälle aus. Die zweite Option ist expliziter und teilt dem Code genau mit, was zu tun ist. Laut jsperf https://jsperf.com/getelementsbyclassname-vs-queryselectorall/25 ist es viel schneller
quelle
Ich benutze einfach gerne einfaches Vanille-Javascript, um dies zu tun.
quelle
Ich bin auf diese Frage gestoßen und möchte einen Codeausschnitt teilen, den ich derzeit verwende:
Und jetzt kann ich Code wie diesen schreiben -
Es mag viel Code sein, aber wenn es in CoffeeScript geschrieben ist, ist es ziemlich klein:
quelle
Ich hatte einen Fall, in dem ich sehen wollte, ob ein Objekt in einem anderen vorhanden ist, also habe ich der ersten Antwort etwas hinzugefügt, um nach einem Selektor im Selektor zu suchen.
quelle
Wie wäre es mit:
Es ist sehr minimal und erspart es Ihnen, den Selektor
$()
jedes Mal einzuschließen .quelle
if($("#thing").exists(){}
lautet. Es ist auch nicht der jQuery-Weg.Ich benutze dies:
Führen Sie die Kette nur aus, wenn ein jQuery-Element vorhanden ist - http://jsfiddle.net/andres_314/vbNM3/2/
quelle
Hier ist meine Lieblingsmethode
exist
in jQueryund eine andere Version, die Rückruf unterstützt, wenn kein Selektor vorhanden ist
Beispiel:
quelle
$("selector"
) gibt ein Objekt zurück, das dielength
Eigenschaft hat. Wenn der Selektor Elemente findet, werden diese in das Objekt aufgenommen. Wenn Sie also die Länge überprüfen, können Sie feststellen, ob Elemente vorhanden sind.0 == false
Wenn Sie in JavaScript nicht0
Ihren Code erhalten, wird er ausgeführt.quelle
Hier ist das vollständige Beispiel für verschiedene Situationen und die Möglichkeit, mithilfe von direct zu überprüfen, ob ein Element vorhanden ist, wenn der jQuery-Selektor möglicherweise funktioniert oder nicht, da er ein Array oder Elemente zurückgibt.
ENDGÜLTIGE LÖSUNG
quelle
Sie müssen nicht überprüfen, ob es größer als
0
ähnlich ist$(selector).length > 0
,$(selector).length
es ist genug und eine elegante Möglichkeit, die Existenz von Elementen zu überprüfen. Ich denke nicht, dass es sich lohnt, nur dafür eine Funktion zu schreiben, wenn Sie mehr zusätzliche Dinge tun möchten, ja.quelle