自分の状況
現在JSのサイトを作って練習しているのですが、独学の為少しつまずいてしまったのでご教授いただければ幸いです。
分からないこと
初期化エラーのエラーコードが出てきたのだが、自分のコードのどこが出来ていないのか理解できなかった。
errorcode
1script.js:28 Uncaught ReferenceError: Cannot access 'checkPlaying' before initialization at HTMLImageElement.<anonymous> (script.js:28)
試したこと
エラーコードを検索してみたところ初期化のエラーだと分かった。検索結果
しかし、該当箇所のコードを見たところletなどを使用しておらず、知識も浅いため初期化についての理解が出来なかった。
コード
HTML
1<div class="app"> 2 <div class="vid-container"> 3 <video loop> 4 <source src="video/rain.mp4"> 5 </source> 6 </video> 7 </div> 8 9 <div class="time-select"> 10 <button data-time="1500">25 Minutes</button> 11 <button data-time="300">5 Minutes</button> 12 <button data-time="600">10 Minutes</button> 13 </div> 14 <div class="player-container"> 15 <audio class="song"> 16 <source src="sounds/rain.mp3"> 17 </audio> 18 <img src="svg/play.svg" alt="play" class="play"> 19 <svg class="track-outline" width="453" height="453" viewBox="0 0 453 453" fill="none" 20 xmlns="http://www.w3.org/2000/svg"> 21 <circle cx="226.5" cy="226.5" r="216.5" stroke="white" stroke-width="20" /> 22 </svg> 23 <svg class="moving-outline" width="453" height="453" viewBox="0 0 453 453" fill="none" 24 xmlns="http://www.w3.org/2000/svg"> 25 <circle cx="226.5" cy="226.5" r="216.5" stroke="#018EBA" stroke-width="20" /> 26 </svg> 27 <h3 class="time-display">0:00</h3> 28 </div> 29 <div class="sound-picker"> 30 <button data-sound="sounds/rain.mp3" data-video="sounds/rain.mp4"><img src="svg/rain.svg" 31 alt="rain"></button> 32 <button data-sound="sounds/beach.mp3" data-video="sounds/beach.mp4"><img src="svg/beach.svg" 33 alt="beach"></button> 34 </div> 35 </div>
JS
1const app = () => { 2 const song = document.querySelector(".song"); 3 const play = document.querySelector(".play"); 4 const outline = document.querySelector(".moving-outline circle"); 5 const video = document.querySelector(".vid-container video"); 6 7 const sounds = document.querySelectorAll(".sound-picker button"); 8 9 const timeDisplay = document.querySelector(".time-display"); 10 const timeSelect = document.querySelector("time-select button"); 11 12 const outlineLength = outline.getTotalLength(); 13 14 let fakeDuration = 600; 15 16 outline.style.strokeDasharray = outlineLength; 17 outline.style.strokeDashoffset = outlineLength; 18 19 sounds.forEach(sound => { 20 sound.addEventListener("click" , function(){ 21 song.src = this.getAttribute("data-sound"); 22 video.src = this.getAttribute("data-video"); 23 checkPlaying(song); 24 }); 25 }) 26 27 play.addEventListener("click", () => { 28 checkPlaying(song); 29 }); 30 31 timeSelect.forEach(option => { 32 option.addEventListener("click", function () { 33 fakeDuration = this.getAttribute("data-time"); 34 timeDisplay.textContent = `${Math.floor(fakeDuration / 60)}:${Math.floor(fakeDuration % 60)}`; 35 }); 36 }); 37 38 const checkPlaying = song => { 39 if (song.paused) { 40 song.play(); 41 video.play(); 42 play.src = "svg/pause.svg"; 43 } else { 44 song.pause(); 45 video.pause(); 46 play.src = "svg/play.svg"; 47 } 48 }; 49 50 song.ontimeupdate = () => { 51 let currentTime = song.currentTime; 52 let elapsed = fakeDuration - currentTime; 53 let seconds = Math.floor(elapsed % 60); 54 let minutes = Math.floor(elapsed / 60); 55 56 let progress = outlineLength - (currentTime / fakeDuration) * outlineLength; 57 outline.style.strokeDashoffset = progress; 58 59 timeDisplay.textContent = `${minutes}:${seconds}`; 60 61 if(currentTime >= fakeDuration) { 62 song.pause(); 63 song.currentTime = 0; 64 play.src= "svg/play.svg"; 65 video.pause(); 66 } 67 } 68}; 69 70app();
掲載しているソースコードは実際に該当のエラーが発生しているソースコードと相違がありますか?わたしが試してみたところ別のエラー「Uncaught TypeError: Cannot read property 'forEach' of null」を確認しました。
const timeSelect = document.querySelector("time-select button");
ではなく
const timeSelect = document.querySelectorAll(`.time-select button`);
となるはずです。
回答1件
あなたの回答
tips
プレビュー