Puoi avere più $ (document) .ready (function () {…}); sezioni?


240

Se all'avvio ho molte funzioni, devono essere tutte sotto un unico:

$(document).ready(function() {

o posso avere più di tali dichiarazioni?


1
Necessario principalmente quando devo caricare più file js dove ognuno contiene $ (documento) .ready (); funzione
Abdillah,

@leora questa domanda è stata posta in un'intervista: D Grazie
eirenaios il

Risposte:


288

Puoi averne di più, ma non è sempre la cosa più bella da fare. Cerca di non usarli eccessivamente, poiché ciò pregiudicherebbe seriamente la leggibilità. A parte questo, è perfettamente legale. Vedi sotto:

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

Prova questo:

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

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

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

Scoprirai che è equivalente a questo, nota l'ordine di esecuzione:

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

Vale anche la pena notare che una funzione definita all'interno di un $(document).readyblocco non può essere richiamata da un altro $(document).readyblocco, ho appena eseguito questo test:

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

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

l'output era:

hello1
something
hello2

25
Non è saggio fare affidamento sull'ordine di esecuzione quando si utilizzano più istruzioni $ (document) .ready (). Ognuno deve eseguire indipendentemente dal fatto che qualsiasi altro sia già stato eseguito o meno.
James,

@AoP - Non so quanto abbia senso, se non vengono eseguiti in ordine, allora sono completamente privi di significato nel contesto dell'applicazione, quindi utilizzando più $ (documento). Già (i blocchi verrebbero completamente rotti.
karim79,

7
@ karim79 sicuramente questo (la domanda del PO) è più applicabile quando si scrive un po 'di codice complicato con più problemi di avvio - vale a dire un codice che viene sempre eseguito al termine del caricamento e alcuni che sono richiesti solo su alcuni nodi di contenuto? In una situazione del genere, il contesto dovrebbe essere analizzato e l'ordine di esecuzione dovrebbe essere irrilevante: essere in grado di assegnare all'evento "DOM ready" senza sovrascrivere quello precedente diventa una funzione utile, indipendentemente dal comportamento dell'ordine.
tehwalrus,

1
Per quanto riguarda una funzione definita in un blocco pronto non richiamabile da un altro blocco pronto - questo è vero nel modo in cui si definisce la funzione, ma se invece la si definisce come saySomething = function () {}, è possibile chiamarla. Strano, vero? jsfiddle.net/f56qsogm provalo qui.
ferr

2
Penso che si comporti in questo modo perché sta aggiungendo la funzione all'oggetto finestra accessibile a livello globale. Altrimenti si tratta di una funzione dichiarativa con ambito locale per quella funzione pronta.
ferr

19

Puoi usarne più. Ma puoi anche usare più funzioni in un unico documento. Già:

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

    // Reqular JS
    function test(word) {
       alert(word);
    }
    test('hello!');
});

Questo va bene se hai il pieno controllo del codice allegato alla pagina. Se qualcuno ha già scritto questo in un altro file allegato alla pagina, allora puoi dichiararlo in questo modo.
James Wiseman,

Non sono sicuro di quello che stai cercando di dire. Ma se lo metti nella tua testa e includi altri 15 JS esterni, tutti contenenti uno (o più document.load) funzionerà comunque come se ce ne fosse solo uno. Vale la pena ricordare che lo scoop di ogni funzione / variabile termina con la parentesi di chiusura della funzione $ (documento) .ready.
Mickel,

2
Sto solo cercando di dire che a volte altre persone hanno scritto moduli allegati alla pagina che hanno già dichiarata una funzione di documento pronto, quindi potresti non avere il lusso di spostare tutto il tuo codice in una funzione (che, garantito, sarebbe l'ideale ). Vorrei anche diffidare di avere troppe cose qui, poiché avremo On Ready Bloating, il che può rendere il codice altrettanto difficile da mantenere.
James Wiseman,

1
Ah, ora ti capisco. Sì, sono d'accordo. Ho appena fatto un esempio per dimostrare che è possibile;)
Mickel,

15

Sì, puoi facilmente avere più blocchi. Fai solo attenzione alle dipendenze tra di loro poiché l'ordine di valutazione potrebbe non essere quello che ti aspetti.


11

, è possibile avere più chiamate $ (document) .ready (). Tuttavia, non penso che tu possa sapere in che modo verranno giustiziati. (fonte)


14
chiamato nell'ordine aggiunto
redsquare il

Grazie, è bene chiarirlo, poiché - nonostante la saggezza generale sull'argomento - la pagina jQuery ready () in realtà non dice se puoi o no (al momento della scrittura :)). Tuttavia, in qualche modo implica che sia OK, se leggi tra le righe di una frase:Ready handlers bound this way are executed after any bound by the other three methods above.
Modifica Reg


3

Sì, è perfettamente ok, ma evita di farlo senza un motivo. Ad esempio, l'ho usato per dichiarare le regole globali del sito separatamente rispetto alle pagine individuali quando i miei file javascript sono stati generati dinamicamente, ma se continui a farlo più e più volte, sarà difficile da leggere.

Inoltre, non puoi accedere ad alcuni metodi da un'altra jQuery(function(){});chiamata, quindi questo è un altro motivo per cui non vuoi farlo.

Con il vecchio window.onloadperò sostituirai il vecchio ogni volta che hai specificato una funzione.


2

Si, puoi.

Sezioni multiple pronte per documenti sono particolarmente utili se hai altri moduli che si estendono dalla stessa pagina che lo usano. Con la vecchia window.onload=funcdichiarazione, ogni volta che si specificava una funzione da chiamare, sostituiva la vecchia.

Ora tutte le funzioni specificate sono accodate / impilate (qualcuno può confermare?) Indipendentemente dalla sezione pronta per il documento in cui sono specificate.


Sì, è vero, le funzioni sono più in coda rispetto alla sostituzione delle precedenti funzioni $ (document) .ready.
Deeksy,

2

Penso che il modo migliore per andare sia quello di passare alle funzioni nominate (controlla questo overflow per ulteriori informazioni sull'argomento) . In questo modo puoi chiamarli da un singolo evento.

Così:

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

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


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

In questo modo è possibile caricarli in un'unica funzione pronta.

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

});

Questo produrrà quanto segue su console.log:

first
second
third

In questo modo è possibile riutilizzare le funzioni per altri eventi.

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

Controlla questo violino per la versione funzionante


0

È legale, ma a volte causa comportamenti indesiderati. Come esempio ho usato la libreria MagicSuggest e ho aggiunto due input MagicSuggest in una pagina del mio progetto e ho usato le funzioni di documento separato separate per ogni inizializzazione degli input. La prima inizializzazione dell'input ha funzionato, ma non la seconda e non ha dato alcun errore, il secondo input non è stato visualizzato. Pertanto, consiglio sempre di utilizzare una funzione Document Ready.


0

Puoi persino annidare le funzioni pronte per i documenti all'interno dei file html inclusi. Ecco un esempio usando jquery:

File: 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>

File: test_embed.html

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

Uscita console:

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

Il browser mostra:

test_embed.html


0

Puoi anche farlo nel modo seguente:

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

le risposte precedenti mostravano l'uso di più funzioni nominate all'interno di un singolo blocco .ready o di una singola funzione senza nome nel blocco .ready, con un'altra funzione denominata al di fuori del blocco .ready. Ho trovato questa domanda mentre cercavo se ci fosse un modo per avere più funzioni senza nome all'interno del blocco .ready - Non sono riuscito a ottenere la sintassi corretta. Alla fine l'ho capito e speravo che pubblicando il mio codice di prova avrei aiutato gli altri a cercare la risposta alla stessa domanda che avevo


Puoi descriverci come questo è diverso dalle altre risposte?
Stephen Rauch,

certo: le risposte precedenti mostravano l'uso di più funzioni nominate all'interno di un singolo blocco .ready o di una singola funzione senza nome nel blocco .ready, con un'altra funzione denominata al di fuori del blocco .ready. Ho trovato questa domanda mentre cercavo se ci fosse un modo per avere più funzioni senza nome all'interno del blocco .ready - Non sono riuscito a ottenere la sintassi corretta. Alla fine l'ho capito e speravo che pubblicando il mio codice di prova avrei aiutato gli altri a cercare la risposta alla stessa domanda che avevo.
Giovedì

Scusa, intendevo nella domanda. C'è un pulsante di modifica in basso a sinistra nella casella di testo. Descrivere perché la tua soluzione è diversa / migliore la rende una risposta molto migliore in quanto il futuro lettore può capire più rapidamente il "Perché". Grazie.
Stephen Rauch,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.