Czy istnieje szybki sposób sprawdzenia, czy obiekt jest obiektem jQuery czy rodzimym obiektem JavaScript?
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żesz potencjalnie dodać klawisz wyboru do o
obiektu i uzyskać ten sam wynik. Czy istnieje lepszy sposób upewnienia się, że obiekt faktycznie jest obiektem jQuery?
Coś zgodnego z (typeof obj == 'jquery')
javascript
jquery
David Hellsing
źródło
źródło
selector
właściwość została dawno przestarzała i usunięta w 3.0. Nawet we wcześniejszych wersjach obiekt jQuery może mieć pusty ciąg selektora, na przykład$(window)
nie ma selektora. Użyjinstanceof
zamiast tego.Odpowiedzi:
Możesz użyć
instanceof
operatora:Objaśnienie :
jQuery
funkcja (aka$
) jest zaimplementowana jako funkcja konstruktora . Funkcje konstruktora należy wywoływać znew
prefiksem.Kiedy dzwonisz
$(foo)
, wewnętrznie jQuery tłumaczy to nanew jQuery(foo)
1 . JavaScript przechodzi do inicjalizacjithis
wewnątrz funkcji konstruktora, aby wskazać nowe wystąpieniejQuery
, ustawiając jego właściwości na właściwości znalezione najQuery.prototype
(akajQuery.fn
). W ten sposób otrzymujesznew
obiekt gdzieinstanceof jQuery
jesttrue
.1 To jest właściwie
new jQuery.prototype.init(foo)
: logika konstruktora została przeniesiona do innej wywoływanej funkcji konstruktorainit
, ale koncepcja jest taka sama.źródło
if (obj instanceof jQuery){...}
?typeof jQuery === 'function' && obj instanceof jQuery
ponieważjQuery
nie muszą być zadeklarowane w porządku dlatypeof
operatora do pracy bez rzuca błąd.Możesz także użyć właściwości .jquery, jak opisano tutaj: http://api.jquery.com/jquery-2/
źródło
b instanceof jQuery
zgłasza błąd ReferenceError, jeśli jQuery nie jest dostępny na stronie. Oba podejścia są przydatne w różnych przypadkach.try ... catch
, szczególnie w oldIE.if ((typeof jQuery !== 'undefined') && (obj instanceof jQuery)) {...
a
że byłby to węzeł DOM,document.body
a wtedy teoretycznie istnieje szansa, żejquery
klucz jakoś pojawił się na łańcuchu tego węzła.Sprawdź operator instanceof .
źródło
Najlepszym sposobem sprawdzenia wystąpienia obiektu jest operator instanceof lub metoda to ProtrotOf (), która sprawdza, czy prototyp obiektu znajduje się w łańcuchu prototypów innego obiektu.
Ale czasami może się nie powieść w przypadku wielu instancji jQuery w dokumencie. Jak wspomniał @Georgiy Ivankin:
Jednym ze sposobów rozwiązania tego problemu jest aliasing obiektu jQuery w zamknięciu lub IIFE
Innym sposobem rozwiązania tego problemu jest zapytanie o
jquery
nieruchomość wobj
Jeśli jednak spróbujesz przeprowadzić sprawdzanie z wartościami pierwotnymi, wygeneruje błąd, więc możesz zmodyfikować poprzednie sprawdzenie, upewniając
obj
się, żeObject
Chociaż poprzedni sposób nie jest najbezpieczniejszy (możesz utworzyć
'jquery'
właściwość w obiekcie), możemy poprawić sprawdzanie poprawności, pracując z obiema metodami:Problem polega na tym, że każdy obiekt może zdefiniować właściwość
jquery
jako własną, dlatego lepszym rozwiązaniem byłoby zapytanie w prototypie i upewnienie się, że obiekt nie jestnull
lubundefined
Ze względu na przymus The
if
stwierdzenie uczyni zwarcie poprzez ocenę&&
operatora kiedyobj
to każdy z falsy wartości (null
,undefined
,false
,0
,""
), a następnie przechodzi do wykonywania innych walidacji.Wreszcie możemy napisać funkcję narzędzia:
Spójrzmy na: Operatory logiczne i prawda / fałsz
źródło
||
którykolwiek z'jquery' in Object(obj)
nich ma opcję, spowoduje to wyczerpanie, ponieważ nie zapobiegnie przejściu weryfikacji przez obiekty inne niż jQuery z tą właściwością. Uważam jednak, że sprawdzenie tej właściwości w prototypie poprawia sytuację. Może powinieneś dodać to do swojej odpowiedzi! Nie wydaje mi się, żeby inna odpowiedź tutaj wspominała o takiej możliwości :)obj.__proto__.jquery
zamiastobj.constructor.prototype.jquery
? tylko trochę krótko :)constructor.prototype
ponieważobj
ma to być instancja konstruktorajQuery
. Z drugiej strony__proto__
jest dostępny dla każdego rodzaju obiektu.źródło
nodeType
właściwości i upewnić się, żeboolean
wartość zostanie zwrócona, możesz użyć podwójnej negacji!!(el && el.nodeType)
Istnieje jednak jeszcze jeden sposób sprawdzenia obiektu w jQuery.
Dałem przykład, aby zrozumieć rzeczy, link jsfiddle
źródło
Dla tych, którzy chcą wiedzieć, czy obiekt jest obiektem jQuery bez zainstalowanego jQuery, następujący fragment kodu powinien wykonać tę pracę:
źródło
Możesz sprawdzić, czy obiekt jest generowany przez JQuery za pomocą
jquery
właściwości:=> zwraca numer wersji JQuery, jeśli obiekt utworzony przez JQuery. => w przeciwnym razie zwraca
undefined
źródło
źródło