Gibt es eine schnelle Möglichkeit zu überprüfen, ob ein Objekt ein jQuery-Objekt oder ein natives JavaScript-Objekt ist?
Beispiel:
var o = {};
var e = $('#element');
function doStuff(o) {
if (o.selector) {
console.log('object is jQuery');
}
}
doStuff(o);
doStuff(e);
Natürlich funktioniert der obige Code, aber er ist nicht sicher. Sie können dem o
Objekt möglicherweise einen Auswahlschlüssel hinzufügen und das gleiche Ergebnis erzielen. Gibt es eine bessere Möglichkeit, um sicherzustellen, dass das Objekt tatsächlich ein jQuery-Objekt ist?
Etwas im Einklang mit (typeof obj == 'jquery')
javascript
jquery
David Hellsing
quelle
quelle
selector
Eigenschaft vor langer Zeit veraltet und in 3.0 entfernt wurde. Selbst in früheren Versionen kann ein jQuery-Objekt eine leere Selektorzeichenfolge haben, z. B.$(window)
keinen Selektor. Verwenden Sieinstanceof
stattdessen.Antworten:
Sie können den
instanceof
Operator verwenden:Erläuterung : Die
jQuery
Funktion (aka$
) ist als Konstruktorfunktion implementiert . Konstruktorfunktionen sind mit demnew
Präfix aufzurufen.Wenn Sie anrufen
$(foo)
, übersetzt jQuery dies intern innew jQuery(foo)
1 . JavaScript wirdthis
innerhalb der Konstruktorfunktion initialisiert , um auf eine neue Instanz von zu verweisen,jQuery
und setzt seine Eigenschaften auf die aufjQuery.prototype
(akajQuery.fn
) gefundenen. So erhalten Sie einnew
Objekt, woinstanceof jQuery
isttrue
.1 Es ist tatsächlich so
new jQuery.prototype.init(foo)
: Die Konstruktorlogik wurde in eine andere Konstruktorfunktion mit dem Namen ausgelagertinit
, aber das Konzept ist dasselbe.quelle
if (obj instanceof jQuery){...}
?typeof jQuery === 'function' && obj instanceof jQuery
dajQuery
nicht für die um deklariert werden musstypeof
Bediener arbeiten , ohne einen Fehler zu werfen.Sie können die .jquery-Eigenschaft auch wie hier beschrieben verwenden: http://api.jquery.com/jquery-2/
quelle
b instanceof jQuery
ein ReferenceError ausgelöst wird, wenn jQuery auf der Seite nicht verfügbar ist. Beide Ansätze sind in unterschiedlichen Fällen nützlich.try ... catch
Dies kann insbesondere bei oldIE erforderlich sein.if ((typeof jQuery !== 'undefined') && (obj instanceof jQuery)) {...
a
wäre ein DOM-Knoten,document.body
und dann besteht theoretisch die Möglichkeit, dass derjquery
Schlüssel irgendwie über der Kette dieses Knotens liegt.Überprüfen Sie die Instanz des Operators.
quelle
Der beste Weg , um die Instanz eines Objekts zu überprüfen ist , durch Instanceof Bediener oder mit dem Verfahren isPrototypeOf () , die , wenn der Prototyp eines Objekts prüft in einem anderen Prototypkette des Objekts.
Manchmal kann dies jedoch bei mehreren jQuery-Instanzen in einem Dokument fehlschlagen. Wie @Georgiy Ivankin erwähnte:
Eine Möglichkeit, dieses Problem zu beheben, besteht darin, das jQuery-Objekt in einem Closure oder IIFE zu aliasen
Eine andere Möglichkeit, dieses Problem zu lösen, besteht darin, die
jquery
Immobilie in zu erkundigenobj
Wenn Sie jedoch versuchen, diese Prüfung mit primitiven Werten durchzuführen, wird ein Fehler ausgegeben, sodass Sie die vorherige Prüfung ändern können, indem Sie sicherstellen
obj
, dass es sich um eine handeltObject
Obwohl der vorherige Weg nicht der sicherste ist (Sie können die
'jquery'
Eigenschaft in einem Objekt erstellen ), können wir die Validierung verbessern, indem wir mit beiden Ansätzen arbeiten:Das Problem hierbei ist, dass jedes Objekt eine Eigenschaft
jquery
als eigene definieren kann. Ein besserer Ansatz wäre es, im Prototyp nachzufragen und sicherzustellen, dass das Objekt nichtnull
oder istundefined
Durch Zwang , die
if
wird Anweisung durch die Auswertung der Kurzschluss machen&&
Bediener , wennobj
eine der ist falsy Werte (null
,undefined
,false
,0
,""
), und dann geht die anderen Validierungen durchzuführen.Endlich können wir eine Utility-Funktion schreiben:
Werfen wir einen Blick auf: Logische Operatoren und Wahrheit / Falschheit
quelle
||
jedoch mit a'jquery' in Object(obj)
tun, wird es entleert, da nicht verhindert wird, dass Nicht-jQuery-Objekte mit dieser Eigenschaft die Überprüfung bestehen. Ich glaube jedoch, dass die Überprüfung dieser Eigenschaft im Prototyp die Situation verbessert. Vielleicht sollten Sie das zu Ihrer Antwort hinzufügen! Ich glaube, keine andere Antwort hier erwähnt diese Möglichkeit :)obj.__proto__.jquery
stattobj.constructor.prototype.jquery
genug? nur ein bisschen kurz :)constructor.prototype
weilobj
es eine Instanz des Konstruktors sein solljQuery
. Auf der anderen Seite__proto__
ist für jede Art von Objekt verfügbar.quelle
nodeType
boolean
!!(el && el.nodeType)
Es gibt jedoch noch eine weitere Möglichkeit, das Objekt in jQuery zu überprüfen.
Ich habe ein Beispiel gemacht, um Dinge zu verstehen, jsfiddle link
quelle
Für diejenigen, die wissen möchten, ob ein Objekt ein jQuery-Objekt ist, ohne dass jQuery installiert ist, sollte das folgende Snippet die Arbeit erledigen:
quelle
Sie können mit der
jquery
Eigenschaft überprüfen, ob das Objekt von JQuery erstellt wurde :=> Gibt die Nummer der JQuery-Version zurück, wenn das Objekt von JQuery erstellt wurde. => Andernfalls wird zurückgegeben
undefined
quelle
quelle