Überprüfen Sie, ob das Objekt ein jQuery-Objekt ist


601

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 oObjekt 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')


3
Ab jQuery 3.0 ist dies definitiv keine korrekte Methode, um zu überprüfen, ob ein Objekt ein jQuery-Objekt ist, da die selectorEigenschaft 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 Sie instanceofstattdessen.
Dave Methvin

Antworten:


878

Sie können den instanceofOperator verwenden:

if (obj instanceof jQuery){
    console.log('object is jQuery');
}

Erläuterung : Die jQueryFunktion (aka $) ist als Konstruktorfunktion implementiert . Konstruktorfunktionen sind mit dem newPräfix aufzurufen.

Wenn Sie anrufen $(foo), übersetzt jQuery dies intern in new jQuery(foo)1 . JavaScript wird thisinnerhalb der Konstruktorfunktion initialisiert , um auf eine neue Instanz von zu verweisen, jQueryund setzt seine Eigenschaften auf die auf jQuery.prototype(aka jQuery.fn) gefundenen. So erhalten Sie ein newObjekt, wo instanceof jQueryist true.


1 Es ist tatsächlich so new jQuery.prototype.init(foo): Die Konstruktorlogik wurde in eine andere Konstruktorfunktion mit dem Namen ausgelagert init, aber das Konzept ist dasselbe.


8
Also meinst du if (obj instanceof jQuery){...}?
Nigel Angel

2
@ NigelAngel: Ja, das ist es, was er meint :)
ChaseMoskal

12
Dies funktioniert nicht bei mehreren jQuery-Instanzen auf einer Seite.
Georgii Ivankin

5
@CrescentFresh Ich meine, wenn in meinem aktuellen Namespace $ auf jQuery2 verweist und ich ein Objekt aus dem äußeren Namespace habe (wobei $ jQuery1 ist), kann ich instanceof nicht verwenden, um zu überprüfen, ob dieses Objekt ein jQuery-Objekt ist.
Georgii Ivankin

6
Wenn Sie sich nicht sicher , ob jQuery zum Zeitpunkt der if - Anweisung geladen werden, können Sie die Prüfung verlängern sein , typeof jQuery === 'function' && obj instanceof jQueryda jQuerynicht für die um deklariert werden muss typeofBediener arbeiten , ohne einen Fehler zu werfen.
Patrick Roberts

105

Sie können die .jquery-Eigenschaft auch wie hier beschrieben verwenden: http://api.jquery.com/jquery-2/

var a = { what: "A regular JS object" },
b = $('body');

if ( a.jquery ) { // falsy, since it's undefined
    alert(' a is a jQuery object! ');    
}

if ( b.jquery ) { // truthy, since it's a string
    alert(' b is a jQuery object! ');
}

12
Wie David in der Frage betonte, ist das Überprüfen einer Eigenschaft einer Variablen, deren Wert null sein könnte (dh wenn "a" oder "b" null wären), nicht sicher (es wird ein TypeError ausgelöst). Die Verwendung von "b instanceof jQuery" ist besser.
Stapelhaus

23
Diese Methode funktioniert, wenn jQuery nicht geladen ist, während b instanceof jQueryein ReferenceError ausgelöst wird, wenn jQuery auf der Seite nicht verfügbar ist. Beide Ansätze sind in unterschiedlichen Fällen nützlich.
Nate

Effizienter vielleicht, aber immer noch nicht sicher. try ... catchDies kann insbesondere bei oldIE erforderlich sein.
ClarkeyBoy

In Fällen, in denen es möglich ist, dass jQuery nicht geladen ist, können Sie verwendenif ((typeof jQuery !== 'undefined') && (obj instanceof jQuery)) {...
Harry Pehkonen

Das ist kein so gutes Beispiel. Wahrscheinlicher awäre ein DOM-Knoten, document.bodyund dann besteht theoretisch die Möglichkeit, dass der jquerySchlüssel irgendwie über der Kette dieses Knotens liegt.
vsync


26

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.

obj instanceof jQuery;
jQuery.prototype.isPrototypeOf(obj);

Manchmal kann dies jedoch bei mehreren jQuery-Instanzen in einem Dokument fehlschlagen. Wie @Georgiy Ivankin erwähnte:

Wenn ich $in meinem aktuellen Namespace auf zeige jQuery2und ein Objekt aus dem äußeren Namespace (wo $ist jQuery1) habe, kann ich nicht instanceofüberprüfen, ob es sich bei diesem Objekt um ein jQueryObjekt handelt

Eine Möglichkeit, dieses Problem zu beheben, besteht darin, das jQuery-Objekt in einem Closure oder IIFE zu aliasen

//aliases jQuery as $
(function($, undefined) {
    /*... your code */

    console.log(obj instanceof $);
    console.log($.prototype.isPrototypeOf(obj));

    /*... your code */
}(jQuery1));
//imports jQuery1

Eine andere Möglichkeit, dieses Problem zu lösen, besteht darin, die jqueryImmobilie in zu erkundigenobj

'jquery' in obj

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

'jquery' in Object(obj)

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:

if (obj instanceof jQuery || 'jquery' in Object(obj)) { }

Das Problem hierbei ist, dass jedes Objekt eine Eigenschaft jqueryals eigene definieren kann. Ein besserer Ansatz wäre es, im Prototyp nachzufragen und sicherzustellen, dass das Objekt nicht nulloder istundefined

if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }

Durch Zwang , die ifwird Anweisung durch die Auswertung der Kurzschluss machen &&Bediener , wenn objeine der ist falsy Werte ( null, undefined, false, 0, ""), und dann geht die anderen Validierungen durchzuführen.

Endlich können wir eine Utility-Funktion schreiben:

function isjQuery(obj) {
  return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery));
}

Werfen wir einen Blick auf: Logische Operatoren und Wahrheit / Falschheit


Wie verbessert das jedoch die Sicherheit? Nicht-jQuery-Objekte mit einer jquery-Eigenschaft werden weiterhin falsch erkannt. Ich sehe auch nicht, was sich mit beiden Ansätzen "verbessern" könnte.
Gui Prá

Auf diese Weise können Sie auf einfache Weise überprüfen, ob ein Objekt ein jQuery-Objekt ist. Wenn Sie aus irgendeinem Grund den Verdacht haben, dass jemand Objekte mit Eigenschaften wie jquery erstellt , können Sie einen robusteren Validator erstellen, dh nach Eigenschaften im Prototyp suchen : myObj .constructor.prototype.jquery oder noch besser, Sie können die Funktion Object.prototype.isPrototypeOf ()
jherax

1
Wenn Sie dies ||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 :)
Gui Prá

1
ist nicht obj.__proto__.jquerystatt obj.constructor.prototype.jquerygenug? nur ein bisschen kurz :)
Axel

1
@ Axel ja, es funktioniert auch :). Ich habe es verwendet, constructor.prototypeweil objes eine Instanz des Konstruktors sein soll jQuery. Auf der anderen Seite __proto__ist für jede Art von Objekt verfügbar.
Jherax

3
return el instanceof jQuery ? el.size() > 0 : (el && el.tagName);

Um nach einem DOM-Element zu nodeTypeboolean!!(el && el.nodeType)
suchen

3

Es gibt jedoch noch eine weitere Möglichkeit, das Objekt in jQuery zu überprüfen.

jQuery.type(a); //this returns type of variable.

Ich habe ein Beispiel gemacht, um Dinge zu verstehen, jsfiddle link


2

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:

function isJQuery(obj) {
  // Each jquery object has a "jquery" attribute that contains the version of the lib.
  return typeof obj === "object" && obj && obj["jquery"];
}

1

Sie können mit der jqueryEigenschaft überprüfen, ob das Objekt von JQuery erstellt wurde :

myObject.jquery // 3.3.1

=> Gibt die Nummer der JQuery-Version zurück, wenn das Objekt von JQuery erstellt wurde. => Andernfalls wird zurückgegebenundefined


-9
var elArray = [];
var elObjeto = {};

elArray.constructor == Array //TRUE
elArray.constructor == Object//TALSE

elObjeto.constructor == Array//FALSE
elObjeto.constructor == Object//TRUE

11
Code-Dumps ohne Erklärung sind selten nützlich. Bitte erwägen Sie, Ihrer Antwort einen Kontext hinzuzufügen.
Chris
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.