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.bodyczegoś 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, documentaby 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