前提・実現したいこと
サーバーにアップロードした動画(mp4)と画像(jpg)をPHPで動的に表示させ、JavaScriptにてスライドショーにしてループさせるプログラムを作ろうとしています。
/mediaのディレクトリ内にあるファイルがmp4,jpgなら数や順番にかかわらず自動再生し、動画は最後まで再生、画像は4秒でスライドする仕組みです。
動画は再生が終わったらcurrenTime = 0;で再生ヘッドを戻し、pause()で一時停止させて次のスライドに進めています。
リストである<li>にはposition: absoluteを適応してすべて重ねており、showクラスを与奪することで表示を切り替えさせています。
発生している問題・エラーメッセージ
1巡目は想定通りの挙動なのですが、2巡目から動画が再生し終わると次のようなエラーメッセージが表示されるようになり、その後のshowクラスの付与に誤作動が出てしまいます。
console
1Uncaught TypeError: slideList[num].pause is not a function at HTMLVideoElement.<anonymous> (javascript2.js:22)
そしてこのエラーメッセージは3巡目には2つ、4巡目には3つ重なって出てきます。
showクラスの誤作動はshowクラスが消えずに残ったり、2つ同時に与えられたりするような感じです。
該当のソースコード
PHP
1<!doctype html> 2<html> 3<head> 4<meta charset="utf-8"> 5<title>無題ドキュメント</title> 6<link rel="stylesheet" type="text/css" href="style.css"> 7<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0"> 8</head> 9 10<body> 11 <div class="media-space"> 12 <ul> 13 <?php $media = glob('media/*'); 14 15 foreach($media as $key => $file): //ファイルのインデックス番号とファイル名取得 16 17 if(is_file($file)): 18 19 $mediaPass = htmlspecialchars($file); //ファイル名 20 21 if(preg_match_all('/.jpg/',$mediaPass)): //拡張子がjpgなら?> 22 23 <li><img id="imgControl<?php echo $key ?>" src="<?php echo $mediaPass; ?>" class="img-control" alt=""></li> 24 25 <?php elseif(preg_match_all('/.mp4/',$mediaPass)): //拡張子がmp4なら ?> 26 27 <li><video id="videoControl<?php echo $key ?>" src="<?php echo $mediaPass; ?>" class="img-control" muted="muted" 28 style="margin: auto"></video></li> 29 30 <?php else: //拡張子がどちらでもなければ ?> 31 32 <p>jpg、mp4ではないファイルです</p> 33 </ul> 34 <?php endif; ?> 35 <?php endif; ?> 36 <?php endforeach ;?> 37 </div> 38 39 <script src="javascript.js"></script> 40 </body> 41</html>
JavaScript
1// JavaScript Document 2 3var slideList = document.querySelectorAll('li *'); 4var slideListParent = document.querySelectorAll('li'); 5var num = -1; 6 7function slideShow(){ 8 if(num === (slideListParent.length - 1)){ 9 num = 0; 10 }else{ 11 num ++; 12 }//end if 13 14 if(slideList[num].matches('video')){ 15 16 slideListParent[num].classList.toggle('show'); 17 slideList[num].play(); 18 slideList[num].addEventListener('ended',function(){ 19 20 slideListParent[num].classList.toggle('show'); 21 slideList[num].currentTime = 0; 22 slideList[num].pause(); 23 slideShow(); 24 });//end addEventListener 25 }else{ 26 slideListParent[num].classList.toggle('show'); 27 setTimeout(nextSlide,4000); 28 function nextSlide(){ 29 30 slideListParent[num].classList.toggle('show'); 31 slideShow(); 32 }// end function nextSlide() 33 }//end if 34 if(num === 0){ 35 return; 36 } 37 }// end function slideshow() 38 39 40addEventListener('load',slideShow);// end addEventListener
試したこと
関数内で処理が終わる前に同じ関数を呼び出して処理が重なったことが不具合の原因かと思いますが、if文をJavaScriptコードの末端に持ってきて、一周したら(num === 0)returnで最初の処理が終わるのかなと思いましたが改善されませんでした。
slideshow()の枠の外で同関数を呼び出せばいいのかなと思ったのですが、動画と画像を織り交ぜてスライドさせるには
setInterbal()は一定時間でのスライドになるから使えず、イベントトリガーの中で呼び出さざるを得ない状況です。
どなたかご教授いただけると幸いです。
回答1件
あなたの回答
tips
プレビュー