忘れると正常に動作しない。
開発環境
- Linux Mint 17.3 MATE
- Firefox 42.0
- d3.js v4.5.0
背景
以前、window.onload
を忘れていて2時間悩んだ。
戒めとして記事にまとめる。
戒め
ローカルのブラウザで実行するときはwindow.onload
が必要である。
CodePenなどのPlaygroundsでは必要ないから忘れやすいので注意。
実行の流れ
Playground
- 実装中HTMLの
<script>
タグから外部参照ライブラリを読み込む - 実装中JavaScriptを読み込む
ローカル
- 実装中HTMLの
<script>
タグから外部参照ライブラリを読み込む - 実装中HTMLの
<script>
タグから今回実装するJavaScriptを読み込む - 今回実装するにある
window.onload
関数を実行する
window.onloadの用途
window.onload
関数に処理内容をふくめることで、すべての外部参照したライブラリすべてのロードが完了した後で実行できるようになる。
逆に、window.onload
関数にふくめないと、外部参照ライブラリなどのロード完了を待たずに実行されてしまう。
もしwindow.onload
を忘れると、DOM要素の操作がまったく反映できなかったり、なぜか<head>
と<body>
の間に挿入されたり、意味不明なことになる。というか、なった。しっかりロードが完了してから実行するためにwindow.onload
が必要。
ソースコード
main.html
<!DOCTYPE html> <html lang="ja-JP"> <head> <meta charset="utf-8"> <script type="text/javascript" src="http://d3js.org/d3.v4.min.js"></script> <script type="text/javascript" src="test.js"></script> </head> <body> </body> </html>
test.js
window.onload = function(){ d3.select("body") .selectAll("p") .data([1,2,3]) .enter() .append("p") .text(function(d) {return d;}); };
上記のコードは<body>
内に以下の3つのp要素を作成する。
<p>1</p> <p>2</p> <p>3</p>
所感
ローカルとPlaygroundの違いは結構ある。1つ1つは小さくても、総合すると思ったより面倒くさい。