window.onloadで関数が効かない(エラーになる)原因

f:id:supplementgym:20211208062448p:plain

モナリザの画像

onload時にp要素のinnerHTMLを変更する処理をしたいな

モナリザの画像

window.onload=hoge();  ・・・っと

パソコンの画像

Uncaught TypeError: Cannot set property 'innerHTML' of null

モナリザの画像

・・・

<script>
function hoge(){
 document.getElementById("text").innerHTML="text";
}

window.onload=hoge();

</script>

<p id="text"></p>

これがエラーになるのは、window.onload=hoge();が発動した時、まだ<p id="text"></p>が読み込まれていないからです。

モナリザの画像

onloadはDOMの読み込みが終わった時に発動するから、<p id="text"></p>も読み込まれているはずじゃないの?

hoge変数には関数オブジェクトが入っています。関数オブジェクトはコードを含んだ指示書のようなものだと考えてください。

これをhoge() のように()をつけて呼び出すと「hoge の指示書の内容を今すぐ実行しろ」とブラウザに命令することになります。

ブラウザはDOMを上から読み込んでいきますからwindow.onload=hoge();に到達したタイミングではまだp要素は読み込まれていませんが、hoge();とあるのでhogeの内容が実行されます。

そして、実行したタイミングでは p 要素はまだ存在しないのでこれは当然動作しないことになります。

逆に言えば()をつけなければ指示書の内容は実行されません。window.onload = hoge;と書けば、「hogeの指示書を渡しておくから、ページの読み込みが終わったら実行してね」と命令することができます。

この場合は当初意図した通り、p要素の中身が書き換えられることになります。

モナリザの画像

onloadでDOMの中身を参照する関数を発動させるときは注意が必要ね!