2010-11-30 10 views
33

Wie kommt es, dass die Gleichung im Titel falsch ist? Wie überprüfen Sie, ob zwei jQuery-Selektoren auf dasselbe DOM-Objekt zeigen?

Antwort

57

Sie vergleichen zwei verschiedene jQuery Objekte, da $() zweimal anrufen (einmal für jede Seite der Gleichung), und jQuery as MooGoo explains schafft neue Wrapper-Objekte für jedes Mal, wenn Sie es nennen. Deshalb endet der Vergleich falsch.

Sie können ein DOM-Objekt aus jedem jQuery-Objekt extrahieren, indem Sie entweder get() oder Array-Dereferenzierung verwenden, und dann diese Elemente vergleichen. Die beiden folgenden return true, da beide identisch Selektoren die gleiche body DOM-Element entsprechen:

$('body').get(0) == $('body').get(0) 
$('body')[0] == $('body')[0] 

Wenn Sie gegen einen jQuery-Selektor testen möchten, verwenden Sie is(). Beachten Sie, dass die Selektoren, die Sie verwenden, nicht unbedingt denselben DOM-Elementen entsprechen müssen (es sei denn, die Selektoren sind identisch). Das gibt auch true zurück:

$('body').is('body') 
+1

Der erste Satz ist nur dann klar, wenn Sie bereits wissen, dass die $() - Funktion NEW-Objekte erzeugt, daher ist MooGoo's Antwort etwas erklärender. Wenn ich 'function a() {return true; } ', dann ist' a() == a() 'wahr. –

+0

@ Jonathon: Du hast Recht. Ich werde auch meine Antwort klären. – BoltClock

+1

Falls es oben nicht klar ist, testet 'is' die Gleichheit nicht, es testet, ob mindestens ein Element in der Menge mit dem gegebenen Selektor übereinstimmt. ZB '$ ('# cb'). Is (': checked')'. – Flash

11

Verwenden $ .ist()

http://api.jquery.com/is/

die aktuelle aufeinander abgestimmten Satz von Elementen Prüfung gegen einen Selektor, Element oder Objekt jQuery und Rück true, wenn mindestens eines dieser Elemente entspricht der gegebene Argumente ...

Im Gegensatz zu anderen Filtermethoden erstellt .is() kein neues jQuery-Objekt. Stattdessen können Sie den Inhalt eines jQuery-Objekts ohne Änderung testen. Dies ist oft nützlich, innerhalb Rückrufe, wie Event-Handler ...

+0

Siehe andere Antworten für die tatsächliche Erklärung, warum Sie $ .is() benötigen. – pettazz

35

Da jQuery ein neues Wrapper-Objekt erstellt für jede $ Anruf, und in Javascript alle Objekte sind verschieden, auch wenn sie genau die gleichen Eigenschaften/Methoden .

Auf der anderen Seite würde document.body == document.body zu true bewerten.

+3

Sie haben zuerst die Erstellung des Wrapperobjekts erläutert. +1 –

+1

Yup, gab meine Stimme aus dem gleichen Grund. – BoltClock

Verwandte Themen