ブラウザは外部リソース – スクリプト, iframes, 画像 など – の読み込みを追跡することができます。
そのためのイベントが2つあります:
onload– ロードが成功した,onerror– エラーが発生した.
スクリプトの読み込み
外部スクリプトにある関数を呼び出す必要があるとしましょう。
次のようにして動的にロードすることができます。:
let script = document.createElement('script');
script.src="/?originalUrl=https%3A%2F%2Fja.javascript.info%2F%26quot%3Bmy.js%26quot%3B%3Bdocument.head.append(script)%3B%253C%2Fcode">
…しかし、どうやってそのスクリプトの中で宣言された関数を実行するのでしょう?私たちはそのスクリプトの読み込みまで待つ必要があり、その後に初めて呼び出すことができます。
script.onload
主なヘルパーは load イベントです。スクリプトがロードされ、実行された後にトリガされます。
let script = document.createElement('script');
// 任意のドメインから任意のスクリプトがロードできます
script.src="/?originalUrl=https%3A%2F%2Fja.javascript.info%2F%26quot%3Bhttps%3A%2F%2Fcdnjs.cloudflare.com%2Fajax%2Flibs%2Flodash.js%2F4.3.0%2Flodash.js%26quot%3Bdocument.head.append(script)%3Bscript.onload%2520%3D%2520function()%2520%257B%2520%2520%2F%2F%2520%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%2597%25E3%2583%2588%25E3%2581%25AF%25E3%2583%2598%25E3%2583%25AB%25E3%2583%2591%25E3%2583%25BC%25E9%2596%25A2%25E6%2595%25B0%2520%26quot%3B_%26quot%3B%2520%25E3%2582%2592%25E4%25BD%259C%25E3%2582%258A%25E3%2581%25BE%25E3%2581%2599%2520%2520alert(_)%3B%2520%2F%2F%2520%25E9%2596%25A2%25E6%2595%25B0%25E3%2581%25AF%25E5%2588%25A9%25E7%2594%25A8%25E5%258F%25AF%25E8%2583%25BD%25E3%2581%25A7%25E3%2581%2599%257D%3B%253C%2Fcode">
そのため、onload では、スクリプト変数の利用や関数の実行などが可能です。
…そして、仮に読み込みが失敗したらどうなるでしょう?例えば、そのようなスクリプトがない(404 エラー)もしくはサーバがない、サーバがダウンしている場合です。
script.onerror
スクリプトの読み込み(実行ではない)中に発生したエラーは error イベントで追跡することが可能です。
例えば、存在しないスクリプトを要求してみましょう:
let script = document.createElement('script');
script.src="/?originalUrl=https%3A%2F%2Fja.javascript.info%2F%26quot%3Bhttps%3A%2F%2Fexample.com%2F404.js%26quot%3B%3B%2520%2F%2F%2520%25E3%2581%2593%25E3%2582%2593%25E3%2581%25AA%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%2597%25E3%2583%2588%25E3%2581%25AF%25E3%2581%2582%25E3%2582%258A%25E3%2581%25BE%25E3%2581%259B%25E3%2582%2593document.head.append(script)%3Bscript.onerror%2520%3D%2520function()%2520%257B%2520%2520alert(%26quot%3BError%2520loading%2520%26quot%3B%2520%2B%2520this.src)%3B%2520%2F%2F%2520Error%2520loading%2520https%3A%2F%2Fexample.com%2F404.js%257D%3B%253C%2Fcode">
ここではエラーの詳細を取得することはできないことに注意してください。エラーが 404, 500, または他の何かだったのかは分かりません。単に読み込みに失敗したということだけです。
他のリソース
load と error イベントは他のリソースに対しても機能します。そこには微妙な違いがあります。
例えば:
<img>,<link>(外部のスタイルシート)loadとerror両方のイベントは期待通りに機能します。<iframe>- iframe の読み込みが完了した時の
loadイベントのみです。ロードが成功した場合とエラーが発生した場合の両方をトリガーします。 これは歴史的な理由によるものです。
サマリ
画像 <img>, 外部スタイル, スクリプトや他のリソースは、それらの読み込みを追跡するために load と error イベントを提供しています。:
loadはロードが成功したときにトリガされます。errorはロードに失敗したときにトリガされます。
唯一の例外は <iframe> です: 歴史的な理由により、どんな完了にもかかわらず(たとえページが見つからなくても)、常に load をトリガします。
readystatechange イベントもリソースに対して機能しますが、殆ど使われません。なぜなら load/error イベントの方がシンプルなためです。
コメント
<code>タグを使ってください。複数行の場合は<pre>を、10行を超える場合にはサンドボックスを使ってください(plnkr, JSBin, codepen…)。