Potrzebny głównie, gdy muszę załadować wiele plików js, z których każdy zawiera $ (dokument) .ready (); funkcja
Abdillah
@leora to pytanie zostało zadane w wywiadzie: D Thanks
eirenaios
Odpowiedzi:
288
Możesz mieć wiele, ale nie zawsze jest to najładniejsza rzecz. Staraj się ich nie nadużywać, ponieważ poważnie wpłynie to na czytelność. Poza tym jest to całkowicie legalne. Zobacz poniżej:
Warto również zauważyć, że funkcja zdefiniowana w jednym $(document).readybloku nie może zostać wywołana z innego $(document).readybloku, właśnie uruchomiłem ten test:
Używanie wielu instrukcji $ (document) .ready () nie jest mądrze polegać na kolejności wykonywania. Każdy musi wykonać niezależnie od innych, które zostały już wykonane lub nie.
James
@AoP - Nie wiem, jaki to ma sens, jeśli nie są wykonywane po kolei, to są całkowicie pozbawione znaczenia w kontekście aplikacji, więc używając wielu $ (dokument) .ready (bloki zostałyby całkowicie zepsute.
karim79
7
@ karim79 z pewnością to (pytanie OP) jest najbardziej odpowiednie przy pisaniu skomplikowanego fragmentu kodu z wieloma problemami związanymi z uruchamianiem - tj. jakiegoś kodu, który jest zawsze uruchamiany po zakończeniu ładowania, a innego , który jest wymagany tylko w niektórych węzłach treści? W takiej sytuacji kontekst powinien być silosowany, a kolejność wykonywania powinna być nieistotna - możliwość przypisania do zdarzenia „DOM ready” bez nadpisywania poprzedniego staje się przydatną funkcją, niezależnie od zachowania związanego z porządkowaniem.
tehwalrus
1
Jeśli chodzi o funkcję zdefiniowaną w jednym gotowym bloku, która nie jest wywoływalna z innego gotowego bloku - jest to prawda, w jaki sposób definiujesz funkcję, ale jeśli zamiast tego zdefiniujesz ją jako saySomething = function () {}, możesz ją wywołać. Dziwne, prawda? jsfiddle.net/f56qsogm przetestuj to tutaj.
śr.
2
Myślę, że tak się zachowuje, ponieważ dodaje funkcję do obiektu okna, który jest dostępny globalnie. W przeciwnym razie jest to funkcja deklaratywna o zasięgu lokalnym dla tej gotowej funkcji.
dniu
19
Możesz użyć wielu. Ale możesz również korzystać z wielu funkcji w jednym dokumencie. Już:
Jest to w porządku, jeśli masz pełną kontrolę nad kodem dołączonym do strony. Jeśli ktoś już to napisał w innym pliku dołączonym do strony, możesz to zadeklarować w ten sposób.
James Wiseman,
Nie jestem pewien, co próbujesz powiedzieć. Ale jeśli umieścisz to w swojej głowie i dodasz 15 innych zewnętrznych JS, wszystko, co zawiera jeden (lub wiele ładowań dokumentów), nadal będzie działać tak, jakby był tylko jeden. Warto wspomnieć, że miarka każdej funkcji / zmiennej kończy się zamykającym nawiasem funkcji $ (dokument) .ready.
Mickel,
2
Po prostu próbuję powiedzieć, że czasami inni ludzie będą pisać moduły dołączone do strony, które mają już zadeklarowaną funkcję przygotowania dokumentu, więc możesz nie mieć luksusu przeniesienia całego kodu do jednej funkcji (co, oczywiście, byłoby idealne ). Byłbym jednak ostrożny, ponieważ mam tu zbyt wiele rzeczy, ponieważ otrzymamy On Ready Bloating, co może sprawić, że kod będzie równie trudny do utrzymania.
James Wiseman,
1
Ach, teraz rozumiem. Tak, zgadzam się z tym. Podałem tylko przykład, aby udowodnić, że jest to możliwe;)
Mickel
15
Tak, możesz łatwo mieć wiele bloków. Uważaj tylko na zależności między nimi, ponieważ kolejność oceny może nie być zgodna z oczekiwaniami.
Dzięki, dobrze to wyjaśnić, ponieważ - pomimo ogólnej wiedzy na ten temat - strona jQuery ready () tak naprawdę nie mówi, czy możesz (w momencie pisania :)). To jednak sugeruje, że jest OK, jeśli czytasz między wierszami jednego zdania:Ready handlers bound this way are executed after any bound by the other three methods above.
Reg Edit
5
Tak, jest to możliwe, ale możesz lepiej użyć div #mydiv i użyć obu
Tak, jest całkowicie ok. Ale unikaj robienia tego bez powodu. Na przykład użyłem go do zadeklarowania globalnych reguł witryny osobno niż poszczególnych stron, kiedy moje pliki javascript były generowane dynamicznie, ale jeśli będziesz to robić w kółko, utrudni to czytanie.
Nie możesz również uzyskać dostępu do niektórych metod z innego
jQuery(function(){});połączenia, więc to kolejny powód, dla którego nie chcesz tego robić.
Ze starym, window.onloadjednak będziesz wymieniać stary za każdym razem, gdy określisz funkcję.
Wiele sekcji gotowych na dokumenty jest szczególnie przydatne, jeśli inne moduły znajdują się na tej samej stronie, która ich używa. W starej window.onload=funcdeklaracji za każdym razem, gdy podałeś funkcję do wywołania, zastępowała ona starą.
Teraz wszystkie określone funkcje są ustawione w kolejce / układane w stosy (czy ktoś może to potwierdzić?) Niezależnie od tego, w której sekcji dotyczącej dokumentów są określone.
Jest to legalne, ale czasami powoduje niepożądane zachowanie. Jako przykład wykorzystałem bibliotekę MagicSuggest i dodałem dwa wejścia MagicSuggest na stronie mojego projektu i użyłem osobnych funkcji gotowych do dokumentów dla każdej inicjalizacji danych wejściowych. Pierwsza inicjalizacja wejścia działała, ale nie druga, a także nie dawała żadnego błędu, drugie wejście się nie pojawiło. Dlatego zawsze zalecam korzystanie z jednej funkcji gotowości do dokumentów.
<html><head><scriptsrc="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script><script>
$(document).ready(function(){
$("#hide").click(function(){
$("#test").hide();});
$("#show").click(function(){
$("#test").show();});});</script></head><body><h2>This is a test of jQuery!</h2><pid="test">This is a hidden paragraph.</p><buttonid="hide">Click me to hide</button><buttonid="show">Click me to show</button></body>
poprzednie odpowiedzi wskazywały na użycie wielu nazwanych funkcji w jednym bloku .ready lub pojedynczej nienazwanej funkcji w bloku .ready, z inną nazwaną funkcją poza blokiem .ready. Znalazłem to pytanie podczas badania, czy istnieje sposób na posiadanie wielu nienazwanych funkcji w bloku .ready - nie mogłem uzyskać poprawnej składni. W końcu to rozgryzłem i miałem nadzieję, że zamieszczając mój kod testowy, pomogę innym, szukając odpowiedzi na to samo pytanie, które miałem
Czy możesz opisać, jak różni się to od innych odpowiedzi?
Stephen Rauch
pewnie: poprzednie odpowiedzi pokazały użycie wielu nazwanych funkcji w jednym bloku .ready lub pojedynczej nienazwanej funkcji w bloku .ready, z inną nazwaną funkcją poza blokiem .ready. Znalazłem to pytanie podczas badania, czy istnieje sposób na posiadanie wielu nienazwanych funkcji w bloku .ready - nie mogłem uzyskać poprawnej składni. W końcu doszedłem do tego i miałem nadzieję, że zamieszczając mój kod testowy, pomogę innym, szukając odpowiedzi na to samo pytanie, które miałem.
JEPrice
Przepraszam, miałem na myśli w pytaniu. W lewym dolnym rogu pola tekstowego znajduje się przycisk edycji. Opisanie, dlaczego Twoje rozwiązanie jest inne / lepsze, czyni z niego znacznie lepszą odpowiedź, ponieważ przyszły czytelnik może szybciej zrozumieć „Dlaczego”. Dzięki.
Odpowiedzi:
Możesz mieć wiele, ale nie zawsze jest to najładniejsza rzecz. Staraj się ich nie nadużywać, ponieważ poważnie wpłynie to na czytelność. Poza tym jest to całkowicie legalne. Zobacz poniżej:
http://www.learningjquery.com/2006/09/multiple-document-ready
Wypróbuj to:
Przekonasz się, że jest to równoważne, zwróć uwagę na kolejność wykonywania:
Warto również zauważyć, że funkcja zdefiniowana w jednym
$(document).ready
bloku nie może zostać wywołana z innego$(document).ready
bloku, właśnie uruchomiłem ten test:wyjście było:
źródło
Możesz użyć wielu. Ale możesz również korzystać z wielu funkcji w jednym dokumencie. Już:
źródło
Tak, możesz łatwo mieć wiele bloków. Uważaj tylko na zależności między nimi, ponieważ kolejność oceny może nie być zgodna z oczekiwaniami.
źródło
Tak , możliwe jest posiadanie wielu wywołań $ (document) .ready (). Nie sądzę jednak, abyś wiedział, w jaki sposób zostaną one wykonane. (źródło)
źródło
Ready handlers bound this way are executed after any bound by the other three methods above.
Tak, jest to możliwe, ale możesz lepiej użyć div #mydiv i użyć obu
źródło
Tak, jest całkowicie ok. Ale unikaj robienia tego bez powodu. Na przykład użyłem go do zadeklarowania globalnych reguł witryny osobno niż poszczególnych stron, kiedy moje pliki javascript były generowane dynamicznie, ale jeśli będziesz to robić w kółko, utrudni to czytanie.
Nie możesz również uzyskać dostępu do niektórych metod z innego
jQuery(function(){});
połączenia, więc to kolejny powód, dla którego nie chcesz tego robić.Ze starym,
window.onload
jednak będziesz wymieniać stary za każdym razem, gdy określisz funkcję.źródło
Tak, możesz.
Wiele sekcji gotowych na dokumenty jest szczególnie przydatne, jeśli inne moduły znajdują się na tej samej stronie, która ich używa. W starej
window.onload=func
deklaracji za każdym razem, gdy podałeś funkcję do wywołania, zastępowała ona starą.Teraz wszystkie określone funkcje są ustawione w kolejce / układane w stosy (czy ktoś może to potwierdzić?) Niezależnie od tego, w której sekcji dotyczącej dokumentów są określone.
źródło
Myślę, że lepszym sposobem jest przejście do nazwanych funkcji (sprawdź to przepełnienie, aby uzyskać więcej informacji na ten temat) . W ten sposób możesz zadzwonić do nich z jednego wydarzenia.
Tak jak:
W ten sposób możesz załadować je w jednej gotowej funkcji.
});
Spowoduje to wyświetlenie następujących danych do pliku console.log:
W ten sposób możesz ponownie użyć funkcji do innych zdarzeń.
źródło
Jest to legalne, ale czasami powoduje niepożądane zachowanie. Jako przykład wykorzystałem bibliotekę MagicSuggest i dodałem dwa wejścia MagicSuggest na stronie mojego projektu i użyłem osobnych funkcji gotowych do dokumentów dla każdej inicjalizacji danych wejściowych. Pierwsza inicjalizacja wejścia działała, ale nie druga, a także nie dawała żadnego błędu, drugie wejście się nie pojawiło. Dlatego zawsze zalecam korzystanie z jednej funkcji gotowości do dokumentów.
źródło
Możesz nawet zagnieżdżać funkcje gotowe do dokumentów w dołączonych plikach HTML. Oto przykład użycia jquery:
Plik: test_main.html
Plik: test_embed.html
Dane wyjściowe konsoli:
Przeglądarka pokazuje:
test_embed.html
źródło
Możesz to również zrobić w następujący sposób:
poprzednie odpowiedzi wskazywały na użycie wielu nazwanych funkcji w jednym bloku .ready lub pojedynczej nienazwanej funkcji w bloku .ready, z inną nazwaną funkcją poza blokiem .ready. Znalazłem to pytanie podczas badania, czy istnieje sposób na posiadanie wielu nienazwanych funkcji w bloku .ready - nie mogłem uzyskać poprawnej składni. W końcu to rozgryzłem i miałem nadzieję, że zamieszczając mój kod testowy, pomogę innym, szukając odpowiedzi na to samo pytanie, które miałem
źródło