Czy możesz mieć wiele $ (dokument) .ready (function () {…}); Sekcje?

240

Jeśli mam wiele funkcji podczas uruchamiania, czy wszystkie muszą znajdować się pod jednym:

$(document).ready(function() {

czy mogę mieć wiele takich oświadczeń?

leora
źródło
1
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:

http://www.learningjquery.com/2006/09/multiple-document-ready

Wypróbuj to:

$(document).ready(function() {
    alert('Hello Tom!');
});

$(document).ready(function() {
    alert('Hello Jeff!');
});

$(document).ready(function() {
    alert('Hello Dexter!');
});

Przekonasz się, że jest to równoważne, zwróć uwagę na kolejność wykonywania:

$(document).ready(function() {
    alert('Hello Tom!');
    alert('Hello Jeff!');
    alert('Hello Dexter!');
});

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:

$(document).ready(function() {
    alert('hello1');
    function saySomething() {
        alert('something');
    }
    saySomething();

});
$(document).ready(function() {
    alert('hello2');
    saySomething();
}); 

wyjście było:

hello1
something
hello2
karim79
źródło
25
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ż:

$(document).ready(function() {
    // Jquery
    $('.hide').hide();
    $('.test').each(function() {
       $(this).fadeIn();
    });

    // Reqular JS
    function test(word) {
       alert(word);
    }
    test('hello!');
});
Mickel
źródło
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.

pjesi
źródło
11

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)

JW.
źródło
14
wywołany w dodanej kolejności
redsquare
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
3

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ę.

Neo
źródło
2

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=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.

James Wiseman
źródło
Tak, to prawda, funkcje są ustawione w kolejce w górę, zamiast zastępować poprzednie funkcje $ (dokument) .ready.
Deeksy
2

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:

function firstFunction() {
    console.log("first");
}

function secondFunction() {
    console.log("second");
}


function thirdFunction() {
    console.log("third");
}

W ten sposób możesz załadować je w jednej gotowej funkcji.

jQuery(document).on('ready', function(){
   firstFunction();
   secondFunction();
   thirdFunction();

});

Spowoduje to wyświetlenie następujących danych do pliku console.log:

first
second
third

W ten sposób możesz ponownie użyć funkcji do innych zdarzeń.

jQuery(window).on('resize',function(){
    secondFunction();
});

Sprawdź to skrzypce dla działającej wersji

Jelle Verzijden
źródło
0

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.

Nimantha Harshana Perera
źródło
0

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

<!DOCTYPE html>
<html lang="en">
<head>
    <script src="jquery-1.10.2.min.js"></script>
</head>

<body>
    <div id="main-container">
        <h1>test_main.html</h1>
    </div>

<script>
    $(document).ready( function()
    {
        console.log( 'test_main.html READY' );
        $("#main-container").load("test_embed.html");
    } );
</script>

</body>
</html>

Plik: test_embed.html

<h1>test_embed.html</h1>
<script>
    $(document).ready( function()
    {
        console.log( 'test_embed.html READY' );
    } );
</script>

Dane wyjściowe konsoli:

test_main.html READY                       test_main.html:15
test_embed.html READY                      (program):4

Przeglądarka pokazuje:

test_embed.html

Tim
źródło
0

Możesz to również zrobić w następujący sposób:

<html>
<head>
<script src="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>
<p id="test">This is a hidden paragraph.</p>
<button id="hide">Click me to hide</button>
<button id="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

JEPrice
źródło
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.
Stephen Rauch