653 Stimmen

Prüfen, ob das Objekt ein jQuery-Objekt ist

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önnten möglicherweise einen Selektorschlüssel zu der o Objekt und erhalten das gleiche Ergebnis. Gibt es einen besseren Weg, um sicherzustellen, dass das Objekt tatsächlich ein jQuery-Objekt ist?

Etwas im Einklang mit (typeof obj == 'jquery')

3 Stimmen

Ab jQuery 3.0 ist dies definitiv kein korrekter Weg, um zu prüfen, ob ein Objekt ein jQuery-Objekt ist, da die selector wurde vor langer Zeit veraltet und in Version 3.0 entfernt. Auch in früheren Versionen kann ein jQuery-Objekt einen leeren Selektorstring haben, zum Beispiel $(window) hat keinen Selektor. Verwenden Sie instanceof stattdessen.

938voto

Crescent Fresh Punkte 111444

Sie können die instanceof Betreiber:

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

Erläuterung : die jQuery Funktion (auch bekannt als $ ) ist implementiert als ein Konstruktorfunktion . Konstruktorfunktionen sind mit der Anweisung new Vorwahl.

Wenn Sie anrufen $(foo) , intern übersetzt jQuery dies in new jQuery(foo) 1 . JavaScript fährt mit der Initialisierung fort this innerhalb der Konstruktorfunktion, um auf eine neue Instanz von jQuery und setzt seine Eigenschaften auf die Eigenschaften von jQuery.prototype (alias jQuery.fn ). Sie erhalten also eine new Objekt, bei dem instanceof jQuery es true .


1 Es ist eigentlich <code>new jQuery.prototype.init(foo)</code> : Die Konstruktorlogik wurde in eine andere Konstruktorfunktion namens <code>init</code> aber das Konzept ist dasselbe.

115voto

mt81 Punkte 3198

Sie können auch die Eigenschaft .jquery verwenden, wie hier beschrieben: 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! ');
}

32voto

Corey Sunwold Punkte 10012

Überprüfen Sie die instanceof Betreiber.

var isJqueryObject = obj instanceof jQuery

27voto

jherax Punkte 5128

Der beste Weg, die Instanz eines Objekts zu überprüfen, ist durch instanceof Betreiber oder mit der Methode isPrototypeOf() die prüft, ob der Prototyp eines Objekts in der Prototypenkette eines anderen Objekts enthalten ist.

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

Aber manchmal kann es bei mehreren jQuery-Instanzen in einem Dokument fehlschlagen. Wie @Georgiy Ivankin erwähnte:

wenn ich $ in meinem aktuellen Namespace, die auf jQuery2 und ich habe ein Objekt aus dem äußeren Namespace (wo $ es jQuery1 ), dann habe ich keine Möglichkeit, die instanceof um zu prüfen, ob das Objekt ein jQuery Objekt

Eine Möglichkeit, dieses Problem zu überwinden, ist das Aliasing des jQuery-Objekts in einer Verschluss o IIFE

//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 überwinden, ist die Anfrage an die jquery Eigentum in obj

'jquery' in obj

Wenn Sie jedoch versuchen, diese Prüfung mit primitiven Werten durchzuführen, wird ein Fehler ausgelöst, so dass Sie die vorherige Prüfung ändern können, indem Sie sicherstellen, dass obj zu sein Object

'jquery' in Object(obj)

Obwohl der vorherige Weg nicht der sicherste ist (Sie können die 'jquery' Eigenschaft in einem Objekt), können wir die Validierung verbessern, indem wir mit beiden Ansätzen arbeiten:

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

Das Problem dabei ist, dass jedes Objekt eine Eigenschaft definieren kann jquery als eigene, so dass ein besserer Ansatz wäre, im Prototyp zu fragen und sicherzustellen, dass das Objekt nicht null o undefined

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

Aufgrund von Nötigung El if Anweisung einen Kurzschluss durch Auswertung der && Betreiber, wenn obj ist eine der falsy Werte ( null , undefined , false , 0 , "" ), und führt dann die anderen Validierungen durch.

Schließlich können wir eine Nutzenfunktion schreiben:

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

Schauen wir uns das mal an: Logische Operatoren und wahr/falsch

5voto

Karl.S Punkte 2016

Für diejenigen, die wissen wollen, ob ein Objekt ein jQuery-Objekt ist, ohne jQuery installiert zu haben, sollte das folgende Snippet die Arbeit erledigen:

function isJQuery(obj) {
  // All jQuery objects have an attribute that contains the jQuery version.
  return typeof obj === "object" && obj != null && obj.jquery != null;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X