Pensalo asi: el explorador lee el codigo de arriba abajo. Entonces, si tenes codigo en la cabecera, se lee antes que el html (del body). El problema está en que el codigo pretenda modificar el html, porque tl html todavía no se imprimió! Entonces, para evitar conflictos, existe DOM.ready o document.ready (que son muy similares).
Cita: jQuery(document).ready(function() {
})
Esa función lo que logra es que el codigo que escribas ahi adentro se ejecute en una segunda lectura, en vez de en una primera. Asi que lo que sea que escribas ahi, se va a ejecutar una vez que todo el DOM esté construido.
Si tratas de modificar el DOM antes de terminar de imprimirlo, vas a tener error.