補足説明ありがとうございます。
①この記述方法で間違っていないでしょうか。
一言で言えば間違っています。
提示されたコードには、肝心の画像や音声ファイルの読み込み完了を検知する記述がありません。
まずはwindow.onload
に関して理解してみましょう。
https://developer.mozilla.org/ja/docs/Web/API/Window/load_event
こちらのMDNの解説にあるとおり、window.onload
は「ページ全体が、スタイルシートや画像などのすべての依存するリソースを含めて読み込まれたときに発生」するイベントです。これには(非同期でない)JSも含まれます。
詳しくはさらにwindow.DOMContentLoaeded
に関しての解説を読んでみてください。
https://developer.mozilla.org/ja/docs/Web/API/Document/DOMContentLoaded_event
ここまでをある程度理解した前提で話しを進めますと、提示されたコードには画像自体の読み込みを検知するimg.addEventListener('load' ~
がありません。上記コードに追記するなら、こんな感じです。
JavaScript
1window.onload = function(){
2console.log('window.onload');
3 const MaxImg = 89 ;
4 for (i = 0; i < MaxImg; i++){
5 //ここではsrcが空のimgタグを作っただけ(ちなみにletじゃなくてconstで良いです)
6 let img = document.createElement('img');
7 img.addEventListener('load', ()=>{
8 //ここで画像の読み込みが完了したことを検知できる
9 console.log('img:'+i+' Load Complete.');
10 });
11 //ここで画像の読み込みが始まる
12 img.src = 'img/' + i + '.jpg';
13 }
14 //以下略
15}
これをコンソールで確認すると、window.onload
が先に出力され、img:0 Load Complete.
はその後に出力されます。
つまりwindow.onload
の中でプリロード処理を書いても、すでにページの要素は読み込みが完了しており、ページが動き出しているなかで(クイズなどがプレイできる状態で)、その後別途画像を読み込んでいることになります。
この状態では正確には「プリロード」とは呼べないでしょう。
画像や音声ファイルのプリロードを行う場合はwindow.onload
の中で書く必要はありません。
また今回のように読み込む個数が決まっている場合は、その数を利用してプログレスバーなどを作ることもできます。
②この後以下のような記述で呼び出した場合に通信負荷を下げられる、ということでしょうか。
「通信負荷」というのが漠然としているので、答えづらいのですが画像自体の読み込みは終わっていれば
すべての画像の読み込みが完了している状態でしたら、再度同じ画像を読み込む(ロード)することはないです。
ただ最初の読み込み時に提示していただいたコードで、document.createElement('img')
とimg要素をつくっているのに、また同じ画像を読み込むTargetLi.innerHTML = '<img~
としてしまうのはもったいないので、最初に作ったimg要素を格納しておき、それをTargetLi
に追加したほうが良いと思います。
ざっくりとこんな感じでしょうか。
https://codepen.io/mattari-panda/pen/jOVPYej
③imgやsound自体をクリエイトはしつつダミー的な要素にしていると思うのですが、これらをデベロッパツールなどで確認する方法はあるのでしょうか。
プリロード時点での読み込みはデベロッパツールの「Network」タブで見ることができます。
詳しくは公式ドキュメントか、「デベロッパーツール ネットワーク」で検索してみて下さい。
ネットワークタブの「Throttling」という部分(デフォルトではOnlineになっている)部分を変更すると、ネットワークの速度を擬似的に遅くすることも出来るので、ローカルでもプリロードなどの処理は見やすくなります。
■補足に関して
いくつかアドバイスです、ここまで長くなったので気が向いたら読んでください。
・wavファイルを使うのはおすすめできません
ファイルサイズが大きすぎるためです。mp3などに変換したほうが扱いやすくなります。
・Webサイトのパース、ロード、描画、このあたりをざっくりとで良いので学んでみてください。
基本はHTML+CSSを先にしっかり学ぶことが実は近道なのですが、今回のご質問ですとそのあたりがどこまで理解できているかわかりませんでした。HTML+CSSを学ぶ過程でWebサイトがどのようにして表示されるかを学ぶと割とすんなり理解出来ますし、そのあとJSを学ぶときにDOMのコントロールなどがすんなり出来るようになります。
「クイズのようなページ」のように一つのアプリケーションともいえるレベルになると、HTML+CSS+JSのすべてである程度理解している必要があるので、ものすごく勉強になると思います。
そしてかならず「Webサイトのパース、ロード、描画」あたりで悩むことになるので、ここを乗り越えられれば自分で思った通りにアプリケーションをコントロールできるようになります。
道は長いかもしれませんが、頑張ってみてください。