2012-03-11 10 views
6

Sono un po 'confuso con document.ready in jQuery.jQuery document.ready

Quando si definiscono le funzioni javascript all'interno di $ (documento) .ready() e quando non si?

È abbastanza sicuro solo inserire tutto il codice javascript all'interno di $ (document) .ready()?

Cosa succede quando non lo fai?

Ad esempio, utilizzo i soliti selettori jQuery che fanno qualcosa quando si fa clic su qualcosa. Se non li avvolgi con il documento, già qual è il danno?

E causerà solo problemi se qualcuno fa clic sull'elemento nella frazione di secondo prima che la pagina sia caricata? Oppure può causare altri problemi?

risposta

5

Il gestore document.ready viene attivato quando il DOM è stato caricato dal browser e pronto per essere manipolato.

Se lo si deve usare o meno dipenderà da dove si stanno inserendo gli script personalizzati. Se li metti alla fine del documento, appena prima del tag di chiusura </body> non hai bisogno di usare document.ready perché al momento dell'esecuzione dello script il DOM sarà già caricato e sarai in grado di manipolarlo.

Se invece si inserisce lo script nella sezione <head> del documento, è necessario utilizzare document.ready per assicurarsi che il DOM sia completamente caricato prima di tentare di modificarlo o collegare gestori di eventi a vari elementi. Se non si esegue questa operazione e si tenta di allegare ad esempio un gestore di eventi .click a un pulsante, questo evento non verrà mai attivato perché al momento dell'esecuzione dello script, il selettore jQuery utilizzato per trovare il pulsante non è stato restituito qualsiasi elemento e non hai collegato correttamente il gestore.

+0

Grazie. Mi chiedo se questo è il motivo per cui ho avuto un comportamento strano. – Dave31415

0

Non c'è alcun danno se non si aggiungono gestori di eventi in ready() se si stanno chiamando le funzioni js nell'attributo href. Se li stai aggiungendo con jQuery, devi assicurarti che gli oggetti a cui si riferiscono questi gestori siano caricati, e questo codice deve venire dopo che il documento è stato ritenuto pronto(). Ciò non significa che debbano essere nella chiamata ready() tuttavia, è possibile chiamarli in funzioni che sono chiamate all'interno ready().

4

Inserisci il codice all'interno di $(document).ready quando hai bisogno di quel codice per attendere il caricamento del DOM prima dell'esecuzione. Se il codice non richiede che il DOM venga caricato prima di esistere, puoi metterlo fuori da $ (document) .ready.

Per inciso, $(function() { }) è a breve mano a $ (document).ready();

$(function() { 
    //stuff here will wait for the DOM to load 
    $('#something').text('foo'); //should be okay 
}); 

//stuff here will execute immediately. 
/* this will likely break */ 
$('#something').text('weee!'); 
+1

grazie! non lo sapevo mai di '$ function()' –

+0

Diventa più divertente di così, in realtà. A causa di questo costrutto, è possibile passare tecnicamente qualsiasi riferimento a '' (() 'e lo kicking off quando il documento era pronto:' $ (miafunzione) '. Salva un capello nella memoria a causa di una chiusura in meno. –

+0

Anche in questo caso è possibile farlo anche in questo caso: '$ (documento) .ready (miafunzione)' è uguale a '$ (miafunzione)' –

1

Se avete i vostri script alla fine del documento, non avete bisogno di document.ready.

esempio: c'è un pulsante e al suo clic, è necessario mostrare un avviso. È possibile associare l'evento click al pulsante in document.ready. È possibile scrivere lo script jquery alla fine del documento o una volta caricato l'elemento nel markup.

Scrivere tutto in un evento document.ready renderà la tua pagina slug.

6

Quando si definiscono le funzioni javascript all'interno di $ (documento).pronto() e quando non lo fai?

Se le funzioni dovrebbero essere accessibile a livello globale (che potrebbe indicare una cattiva progettazione della vostra applicazione), allora è necessario definire loro al di fuori del gestore ready.

È abbastanza sicuro solo inserire tutto il codice javascript all'interno di $ (document) .ready()?

Vedere sopra.

Cosa succede quando non lo fai?

Dipende da cosa sta facendo il codice JavaScript e da dove si trova. Nel peggiore dei casi si avranno errori di runtime perché si sta tentando di accedere agli elementi DOM prima che esistano. Ciò avverrebbe se il codice si trova nello head e non si definiscono solo le funzioni, ma si sta già tentando di accedere agli elementi DOM.

Ad esempio, utilizzo i soliti selettori jQuery che fanno qualcosa quando si fa clic su qualcosa. Se non li avvolgi con il documento, già qual è il danno?

Non c'è "danno" di per sé. Non funzionerebbe se lo script si trova nello head, perché gli elementi DOM non esistono ancora. Ciò significa che jQuery non può trovare e associare il gestore a loro.
Ma se si posiziona lo script poco prima del tag di chiusura body, allora gli elementi DOM esisteranno.


Per essere sul sicuro, ogni volta che si desidera accedere a elementi DOM, inserire queste chiamate nel gestore ready evento o in funzioni che sono chiamati solo dopo che il DOM è stato caricato.

Come il jQuery tutorial (si dovrebbe leggerlo) già afferma:

Come quasi tutto ciò che facciamo quando si utilizza jQuery legge o manipola il Document Object Model (DOM), abbiamo bisogno di fare in modo che si cominci l'aggiunta eventi ecc. non appena il DOM è pronto.

Per fare ciò, registriamo un evento pronto per il documento.

$(document).ready(function() { 
    // do stuff when DOM is ready 
}); 

Per dare un esempio più completo:

<html> 
    <head> 
     <!-- Assuming jQuery is loaded --> 
     <script> 

      function foo() { 
       // OK - because it is inside a function which is called 
       // at some time after the DOM was loaded 
       alert($('#answer').html()); 
      } 

      $(function() { 
       // OK - because this is executed once the DOM is loaded 
       $('button').click(foo); 
      }); 

      // OK - no DOM access/manipulation 
      alert('Just a random alert ' + Math.random()); 

      // NOT OK - the element with ID `foo` does not exist yet 
      $('#answer').html('42'); 

     </script> 
    </head> 
    <body> 
     <div id="question">The answer to life, the universe and everything</div> 
     <div id="answer"></div> 
     <button>Show the answer</button> 

     <script> 
      // OK - the element with ID `foo` does exist 
      $('#answer').html('42'); 
     </script> 
    </body> 
</html> 
+0

C'è qualche ragione per cui la funzione foo() è esclusa document.ready altro di portata? Questa è solo una convenzione o c'è una ragione come la performance? Quando utilizzo l'ambito globale, utilizzo "window.foo = function() {};" stile per utilizzare il targeting per ambito esplicito.Questo non spinge l'esecuzione JS che dichiara le variabili un po 'più tardi e quindi consente al browser di continuare a caricare HTML prima di dichiarare le funzioni e quindi rendere più visibile (in modo trascurabile) qualcosa di più veloce? – Nenotlep

+1

@Nenotlep: direi che spostare la funzione all'interno del gestore pronto è * probabilmente * più veloce, esattamente per la ragione che hai menzionato. Ecco perché è anche buona pratica mettere tutti gli script alla fine del corpo. Ma se l'impatto sulle prestazioni è trascurabile, dipende anche dalle preferenze personali. Questo esempio concreto è stato solo per dimostrare cosa * ha * per andare nel gestore del 'pronto 'cosa non deve. –

Problemi correlati