quindi il problema era che lo script veniva eseguito prima che la pagina fosse stata caricata completamente.
evidentemento lo script si trovava ad agire su elementi che non esistevano, perchè non erano stati ancora caricati.
in questo caso avresti potuto risolvere aggiungendo:
$(document).ready(function() {
qui il resto del codice
});
in questo modo tutto lo script viene letto solo a pagina completamente caricata.
usare il .ready() è sempre una buona cosa quando si lavora con javascript, salvo casi eccezionali.
comunque hai fatto bene a spostare il tutto a fondo pagina, evita rallentamenti nel caricamento.
ciao