onload además de ser un evento para invocar una función, también sirve para que no se ejecute ninguna función hasta que el documento esté totalmente cargado. de tal manera que si invocas a la función antes o justamente después de la etiqueta <body>, se ejecutará entes de que el documento esté totalmente cargado. de tal modo que si el elemento aún no existe
Cita: <html>
<head>
<script type="text/javascript">
alert(document.getElementById('bloque').innerHTML) ; // return null o no es un objeto
</script>
</head>
<body>
<script type="text/javascript">
alert(document.getElementById('bloque').innerHTML) ; // return null o no es un objeto
</script>
<div id="bloque">un texto</div>
<script type="text/javascript">
alert(document.getElementById('bloque').innerHTML) ; // return "un texto"
</script>
</body>
</html>
por otro lado tienes ready() de jquery