2009-12-05 14 views
518

Czy istnieje szybki sposób sprawdzenia, czy obiekt jest obiektem jQuery lub natywnym obiektem JavaScript?Sprawdź, czy obiekt jest obiektem jQuery.

przykład:

var o = {}; 
var e = $('#element'); 

function doStuff(o) { 
    if (o.selector) { 
     console.log('object is jQuery'); 
    } 
} 

doStuff(o); 
doStuff(e); 

oczywiście, powyższy kod działa, ale nie jest bezpieczny. Można potencjalnie dodać klucz selektora do obiektu o i uzyskać taki sam wynik. Czy istnieje lepszy sposób, aby upewnić się, że obiekt faktycznie jest obiektem jQuery?

Coś zgodne z (typeof obj == 'jquery')

+3

Z jQuery 3.0 zdecydowanie nie jest to właściwy sposób sprawdzenia, czy obiekt jest obiektem jQuery, ponieważ właściwość 'selector' została wycofana dawno temu i usunięta w wersji 3.0. Nawet we wcześniejszych wersjach obiekt jQuery może mieć pusty ciąg selektora, na przykład '$ (okno)' nie ma selektora. Zamiast tego użyj 'instanceof'. –

Odpowiedz

782

Można użyć operatora instanceof:

obj instanceof jQuery 

Objaśnienie: funkcję jQuery (aka $) jest zaimplementowany jako constructor function. Funkcje konstruktora należy wywoływać z prefiksem new.

Po wywołaniu $(foo) wewnętrznie jQuery tłumaczy to na new jQuery(foo) . JavaScript kontynuuje inicjowanie funkcji this wewnątrz funkcji konstruktora w celu wskazania nowej instancji jQuery, ustawiając jej właściwości na te znalezione pod jQuery.prototype (aka jQuery.fn). W ten sposób otrzymasz obiekt new, gdzie instanceof jQuery jest true.


To rzeczywiście new jQuery.prototype.init(foo): logika konstruktor został wyładowywane do innej funkcji konstruktora, zwanym init, ale idea jest taka sama.

+5

Więc masz na myśli 'if (obj instanceof jQuery) {...}'? –

+2

@NigelAngel: Tak, to właśnie ma na myśli :) – ChaseMoskal

+11

To nie działa w przypadku wielu instancji jQuery na stronie. –

30

Sprawdź operatora instanceof.

var isJqueryObject = obj instanceof jQuery 
99

Można również użyć właściwości .jquery jak opisano tutaj: 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

Jako [David] (http://stackoverflow.com/users/210578/david) wskazał w pytaniu, sprawdzając właściwość zmiennej, której wartość może być zerowa (tj. Jeśli "a" lub "b" były zerowe) nie jest bezpieczny (wyrzuci TypeError). Używanie "b instanceof jQuery" jest lepsze. – rstackhouse

+21

W ten sposób działa, jeśli jQuery nie jest załadowany, natomiast 'b instanceof jQuery' zgłasza odwołanie ReferenceError, jeśli jQuery nie jest dostępny na stronie. Oba podejścia są przydatne w różnych przypadkach. – Nate

+0

Bardziej wydajne może, ale nadal nie jest bezpieczne. Może wymagać 'try ... catch', szczególnie w oldIE. – ClarkeyBoy

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

Aby sprawdzić element DOM, lepiej użyj właściwości 'nodeType' i upewnij się, że zwrócono wartość' boolean', możesz użyć podwójnej negacji '!! (el && el.nodeType)' – jherax

19

Najlepszym sposobem, aby sprawdzić instancję obiektu jest przez instanceof operatora lub metodą isPrototypeOf() który sprawdza, czy prototyp obiektu znajduje się w łańcuchu prototypów innego obiektu.

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

Ale czasami może zawieść w przypadku wielu instancji jQuery na dokumencie.Jak @Georgiy Ivankin wymienić:

jeśli mam $ w moim obecnym nazw wskazując jQuery2 i mam obiektu z zewnętrznej przestrzeni nazw (gdzie $ jest jQuery1) wtedy nie mam sposobu korzystania instanceof do sprawdzania, czy to obiekt jest jQuery obiektowi

Jednym ze sposobów przezwyciężenia tego problemu jest przez aliasing obiekt jQuery w closure lub IIFE

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

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

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

Inny sposobem na przezwyciężenie tego problemu jest dociekliwy właściwość jquery w obj

'jquery' in obj 

Jeśli jednak spróbować wykonać to sprawdzenie z wartościami prymitywnych, to wygeneruje błąd, tak możesz zmodyfikować poprzednie sprawdzanie, upewniając się, że obj ma być Object Chociaż poprzedni sposób nie jest najbezpieczniejszym (można utworzyć właściwość w obiekcie 'jquery'), możemy poprawić walidację poprzez współpracę z obu podejść:

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

Problemem jest to, że każdy obiekt może zdefiniować nieruchomość jquery jako własny, więc lepszym rozwiązaniem byłoby zapytać w prototypie, i upewnić się, że obiekt nie jest null lub undefined

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

związku z przymus, rachunek if będzie zwarciem oceny operatora && gdy obj oznacza jakiekolwiek falsy wartości (null, undefined, false, 0, ""), a następnie przechodzi do wykonywania drugiej zatwierdzenia.

Wreszcie możemy napisać funkcję użytkową:

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

Rzućmy okiem na: Logical Operators and truthy/falsy

+0

Jak to poprawia bezpieczeństwo, chociaż ? Obiekty inne niż jQuery z właściwością jquery nadal będą błędnie wykrywane. Nie rozumiem, co jeszcze może za pomocą obu podejść "poprawić". –

+0

jest to prosty sposób sprawdzenia, czy obiekt jest obiektem jQuery, jeśli z jakiegoś powodu podejrzewasz, że ktoś tworzy obiekty o właściwościach takich jak _jquery_, możesz utworzyć walidator bardziej odporny, tj. Sprawdzając właściwości w _prototypie: _ *** myObj.constructor.prototype.jquery *** lub jeszcze lepiej, możesz użyć funkcji *** [Object.prototype.isPrototypeOf()] (https: //developer.mozilla.org/pl/docs/Web/JavaScript/Reference/Global_Objects/Object/IsPrototypeOf) *** – jherax

+1

Jeśli "||" którykolwiek z tego z "jquery" w Object (obj) ', to idzie do drenażu , ponieważ nie uniemożliwi to obiektom nie jQuery z tą właściwością przejścia weryfikacji. Uważam jednak, że sprawdzenie tej właściwości w prototypie poprawia sytuację. Może powinieneś dodać to do swojej odpowiedzi! Nie sądzę, że jakakolwiek inna odpowiedź tutaj wspomina o tej możliwości :) –

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

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

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

Zrzuty kodów bez wyjaśnienia rzadko są przydatne. Zastanów się nad dodaniem kontekstu do swojej odpowiedzi. – Chris

+3

Amazing! Jeśli tylko pytanie brzmiało "jak określić, czy zmienna jest tablicą lub obiektem", ta odpowiedź może być pomocna. – Isochronous

+1

poważnie? czy jesteś pijany ???? – minhajul

2

Istnieje jednak jeszcze jeden sposób na sprawdzenie obiektu w jQuery.

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

zrobiłem przykład, aby zrozumieć rzeczy, jsfiddle link

0

Dla tych, którzy chcą wiedzieć, czy dany obiekt jest obiektem jQuery bez konieczności zainstalowane jQuery następujący fragment powinien wykonać pracę:

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