画像の読み込みの仕組み
画像の読み込みは非同期であるため、画像が読み込まれているかどうかを確認する必要があります。コードがなくても機能することがあります。これは主に、画像がキャッシュに存在し、ブラウザーが が呼び出される前に画像を十分に高速にロードできるdrawImage
か、または画像がローカル ディスクに存在するためです。
ただし、新しいユーザーは最初にデータをダウンロードする必要があり、初めてのユーザーには、読み込みが完了していないために画像が表示されないなどのエラーが発生することは望ましくありません。
非同期で動作するため、バックグラウンドで画像の読み込みが行われている間もコードは実行され続けます。これにより、イメージの読み込みが完了する前にコードが実行される可能性があります。そのため、画像の読み込みを処理することが重要です
複数画像の扱い
最初にすべての画像 (または開始する必要がある画像) をロードし、配列を使用してそれらを定義できます。
var imageURLs = [url1, url2, url3, ...],
images = [],
count = imageURLs.length;
次に、画像要素を繰り返し作成します。
for(var i = 0; i < count; i++) {
/// create a new image element
var img = new Image();
/// element is valid so we can push that to stack
images.push(img);
/// set handler and url
img.onload = onloadHandler;
img.src = imageURLs[i];
/// if image is cached IE (surprise!) may not trigger onload
if (img.complete) onloadHandler().bind(img);
}
コールバック関数で在庫数を計算します。
function onloadHandler() {
/// optionally: "this" contains current image just loaded
count--;
if (count === 0) callbackDone();
}
コールバックは、次に実行するコードです。画像はimages
、 と同じ順序で配列に配置されimageURLs
ます。
本番onerror
環境では、何か問題が発生した場合に備えてハンドラーも組み込む必要があります。