前提・実現したいこと
同じ記述を繰り返してしまっている部分をまとめられるかどうか知りたいです。
該当のソースコード
audioタグのロード状況を確認するために下記のコードを記述しました。
同じコードを5回書けば想定した動きにはなるのですが、
5回書いてしまっている部分をまとめたいと思い、後述の「試したこと」のように書き直そうとしたところ
フラグの変更の仕方がわからず、うまくいきませんでした。
JavaScript
1const audioElems = document.getElementsByTagName('audio'); 2 3const audio01 = document.getElementById('audio01'); 4const audio02 = document.getElementById('audio02'); 5const audio03 = document.getElementById('audio03'); 6const audio04 = document.getElementById('audio04'); 7const audio05 = document.getElementById('audio05'); 8 9let loadedAudio01 = false; 10let loadedAudio02 = false; 11let loadedAudio03 = false; 12let loadedAudio04 = false; 13let loadedAudio05 = false; 14 15let loadedAudiosLength = 0; 16let loadedAudioAll = false; 17 18// loadedAudio01がfalseであればロードを開始する 19if (!loadedAudio01) { 20 audio01.load(); 21 audio01.addEventListener("loadstart", function () { 22 // ロードスタート後の処理 23 console.log(audio01.id + ' is now loading...'); 24 }) 25 audio01.addEventListener("canplaythrough", function () { 26 // ロード完了後の処理 27 console.log(audio01.id + ' is loaded.'); 28 loadedAudio01 = true; 29 loadedAudiosLength += 1; 30 if (loadedAudiosLength === audioElems.length) { 31 // すべての要素をロードした後の処理 32 loadedAudioAll = true; 33 console.log('All contents are loaded.'); 34 } 35 }) 36} 37// ↓この後、「01」の部分を02〜05に変更した同じコードを4回記述 38 39//出力結果 40// audio01 is now loading... 41// audio02 is now loading... 42// audio03 is now loading... 43// audio04 is now loading... 44// audio05 is now loading... 45// audio02 is loaded. 46// audio01 is loaded. 47// audio03 is loaded. 48// audio04 is loaded. 49// audio05 is loaded. 50// All contents are loaded.
試したこと
JavaScript
1// 変数定義は省略 2 3const audioElems = [audio01,audio02,audio03,audio04,audio05]; 4const loadedAudioTriggers = [loadedAudio01, loadedAudio02, loadedAudio03, loadedAudio04, loadedAudio05]; 5 6for (let i = 0; i < audioElems.length; i++){ 7 if (!loadedAudioTriggers[i]) { 8 audioElems[i].load(); 9 audioElems[i].addEventListener("loadstart", function () { 10 console.log(audioElems[i].id + ' is now loading...'); 11 }) 12 audioElems[i].addEventListener("canplaythrough", function () { 13 console.log(audioElems[i].id + ' is loaded.'); 14 loadedAudioTriggers[i] = true; //これでは駄目だけど、やり方がわからない 15 loadedAudiosLength += 1; 16 if (loadedAudiosLength === audioElems.length) { 17 loadedAudioAll = true; 18 console.log('All contents are loaded.'); 19 console.log('loadedAudio01は' + loadedAudio01); 20 console.log('loadedAudio02は' + loadedAudio02); 21 console.log('loadedAudio03は' + loadedAudio03); 22 console.log('loadedAudio04は' + loadedAudio04); 23 console.log('loadedAudio05は' + loadedAudio05); 24 } 25 }) 26 } 27} 28 29//出力結果 30// audio01 is now loading... 31// audio02 is now loading... 32// audio03 is now loading... 33// audio04 is now loading... 34// audio05 is now loading... 35// audio02 is loaded. 36// audio01 is loaded. 37// audio03 is loaded. 38// audio04 is loaded. 39// audio05 is loaded. 40// All contents are loaded. 41// loadedAudio01はfalse ←本当はload後はtrueに変更したい 42// loadedAudio02はfalse 43// loadedAudio03はfalse 44// loadedAudio04はfalse 45// loadedAudio05はfalse
補足情報
下記の質問にご回答をいただき、間違っている理由はわかったのですが、上記の場合どのように修正してよいかわからず、
周辺のコードを追加して再度質問させていただきました。何卒よろしくお願いいたします。
https://teratail.com/questions/198715
回答3件
あなたの回答
tips
プレビュー