Jestem początkującym jQuery i przeglądając kilka przykładów kodu, które znalazłem:
$(document.body)
i $('body')
Czy jest jakaś różnica między tymi dwoma?
Jestem początkującym jQuery i przeglądając kilka przykładów kodu, które znalazłem:
$(document.body)
i $('body')
Czy jest jakaś różnica między tymi dwoma?
$(body)
nie działa na .on('click'...
wydarzenia, podczas gdy $(document.body)
i $(document)
oba działają.
Odpowiedzi:
Odnoszą się do tego samego elementu, różnica polega na tym, że kiedy mówisz, document.body
że przekazujesz element bezpośrednio do jQuery. Alternatywnie, gdy przekazujesz ciąg 'body'
, silnik selektora jQuery musi zinterpretować ciąg, aby dowiedzieć się, do jakich elementów się odwołuje.
W praktyce albo wykonają swoją pracę.
Jeśli jesteś zainteresowany, więcej informacji znajdziesz w dokumentacji funkcji jQuery .
Odpowiedzi tutaj nie są w rzeczywistości całkowicie poprawne. Blisko, ale jest skrajna sprawa.
Różnica polega na tym, że $ ('body') faktycznie wybiera element na podstawie nazwy znacznika, podczas gdy document.body odwołuje się do obiektu bezpośredniego w dokumencie.
Oznacza to, że jeśli Ty (lub nieuczciwy skrypt) nadpiszesz element document.body (szkoda!) $ ('Body') nadal będzie działać, ale $ (document.body) nie. Więc z definicji nie są równoważne.
Zaryzykowałbym zgadywanie, że istnieją inne przypadki skrajne (takie jak globalnie identyfikowane elementy w IE), które również wyzwalałyby to, co oznacza nadpisany element ciała na obiekcie dokumentu i taka sama sytuacja miałaby zastosowanie.
document.body
czegoś innego niż <body>
: i.imgur.com/unJVwXy.png
Podczas testowania w przeglądarce zauważyłem dość dużą różnicę w czasie.
Użyłem następującego skryptu:
OSTRZEŻENIE: uruchomienie tego spowoduje trochę zawieszenie przeglądarki, a nawet jej zawieszenie.
var n = 10000000, i;
i = n;
console.time('selector');
while (i --> 0){
$("body");
}
console.timeEnd('selector');
i = n;
console.time('element');
while (i --> 0){
$(document.body);
}
console.timeEnd('element');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Zrobiłem 10 milionów interakcji i takie były wyniki (Chrome 65):
selector: 19591.97509765625ms
element: 4947.8759765625ms
Bezpośrednie przejście elementu jest około 4 razy szybsze niż przejście selektora.
$(document.body)
używa globalnego odniesienia, document
aby uzyskać odwołanie do elementu body
, podczas gdy $('body')
jest selektorem, w którym jQuery pobierze odwołanie do <body>
elementu w document
.
Żadnej większej różnicy, którą widzę, ani żadnego zauważalnego wzrostu wydajności między nimi.
$(document.body)
jest mierzalnie szybszy zgodnie z tym artykułem: sitepoint.com/jquery-body-on-document-on
Nie powinno być żadnej różnicy, może pierwsza jest trochę bardziej wydajna, ale myślę, że jest trywialna (naprawdę nie powinieneś się tym martwić).
W obu przypadkach zawijasz <body>
tag w obiekt jQuery
Wyjściowo oba są równoważne. Chociaż drugie wyrażenie przechodzi przez wyszukiwanie z góry na dół z katalogu głównego DOM. Możesz chcieć uniknąć dodatkowego narzutu (nawet najmniejszego), jeśli masz już obiekt document.body w ręku, aby JQuery mógł go zawinąć. Zobacz http://api.jquery.com/jQuery/ #Selector Context