2013-07-11 8 views
10

Sono un principiante che apprende jQuery e sviluppo web, quindi questa potrebbe essere una domanda stupida, ma non riesco a trovare una risposta a questo su Google (probabilmente non sono cercando le parole chiave giuste). Ho un semplice file HTML (ad esempio, 'test.html' che carica jQuery, un file javascript esterno (ad esempio 'test.js') che ho scritto e con un pulsante. Ad esempio,Perché jQuery click non funziona quando incluso in un file separato

<html> 
.... 
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script> 
<script src="scripts/test.js" type="text/javascript"></script> 
.... 
<body> 
<button type="button" class="button" id="my_button">test</button> 
</body> 
</html> 

in 'test.js', ho:.

$("#my_button").click(function() { 
    alert('test'); 
    return false; 
}); 

Ma quando clicco sul pulsante, non funziona Tuttavia, quando ho messo cosa c'è in 'test.js' in 'test.html 'Mi piace:

<html> 
.... 
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script> 
<script type="text/javascript"> 
$(function() { 
    $("#my_button").click(function() { 
     alert('test'); 
     return false; 
    }); 
}); 
</script> 
.... 
<body> 
<button type="button" class="button" id="my_button">test</button> 
</body> 
</html> 

Funziona. La prima domanda è: Qualcuno può spiegarmi perché io t funzionerebbe quando inserirò il codice nel file esterno e lo caricherò? È sempre necessario avvolgere il codice jQuery con $(function() {......} perché funzioni?

Idealmente, non voglio codice javascript nel mio modello HTML perché è ovviamente disordinato. Related/seconda domanda è: qual è il modo più pulito/migliore per separare il codice javascript/jQuery come sopra e tuttavia farlo funzionare nel modello HTML previsto?

Grazie per la risposta.

+3

$ (function() {}) == $ (document) .ready() come negli elementi dom sono stati caricati ed è sicuro collegarli ad ascoltatori. –

+1

* "Qual è il modo più pulito/migliore per separare il codice javascript/jQuery come sopra e tuttavia farlo funzionare nel modello HTML previsto?" * Spostare gli script a destra prima del tag body di chiusura. –

+0

Sì, lo faresti in qualsiasi file a cui stai facendo un collegamento diretto

11
$(document).ready(function() { 

    $("#my_button").click(function() { 
     alert('test'); 
     return false; 
    }); 

}); 
+0

Grazie. $ (document) .ready (....) è molto più leggibile (facile da capire) di solo $ (function() {..... – user1330974

1

Il bind evento su jquery richiede che l'oggetto HTML sia già sottoposto a rendering.

Se dici $('#button').click(function(){dosomething()}); È necessario che #button esista già su HTML per funzionare.

Quando si utilizza $(function(){}); Il codice attende di documentare l'evento pronto per eseguire il codice. Quindi, se chiami button.click sul momento sbagliato, non troverà il pulsante e non funzionerà.

+1

Grazie. Sto leggendo tutti i commenti e apprendo diversi modi di spiegazioni (ma la risposta è la stessa) :) – user1330974

0

Sposta il tag script di test.js appena sopra il tag di chiusura body (o dopo il tag button). Se chiami lo script prima del pulsante, non è possibile trovare il pulsante con il nome id. Se lo metti dopo il pulsante, funzionerà.

Problemi correlati