質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

1回答

881閲覧

【JavaScript】音声再生の処理が一度しか実行されない

MK-95

総合スコア0

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2021/11/10 01:26

編集2021/11/10 02:43

Iroha Board(CakePHP)でe-ラーニングシステムを試作しています。

■[HTML5] 音声ファイルをJSで再生/停止する – audioタグ編
https://blog.katsubemakito.net/html5/audio1

上記の記事を参考にJavaScriptでシンプルな音声再生ボタンを実装したいのですが、
一つ目のボタンしか再生されず、二つ目以降のボタンはクリックしても一時停止に切り替わらず再生もされません。

コードは以下のようになっています。

HTML

1<!DOCTYPE html> 2<html> 3<head> 4 <meta charset="UTF-8"> 5 <title>HTML5 Audio Sample1</title> 6</head> 7<body> 8<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous"> 9 10<!-- 音声ファイル --> 11<audio id="bgm1"> 12 <source src="https://miku3.net/asset/sound/html5/op.mp3" type="audio/mp3"> 13</audio> 14<!-- 再生ボタン --> 15<button id="btn-play" type="button"><i class="fas fa-play"></i></button> 16 17<!-- 音声ファイル --> 18<audio id="bgm1"> 19 <source src="https://miku3.net/asset/sound/html5/op.mp3" type="audio/mp3"> 20</audio> 21<!-- 再生ボタン --> 22<button id="btn-play" type="button"><i class="fas fa-play"></i></button> 23 24<!-- 音声ファイル --> 25<audio id="bgm1"> 26 <source src="https://miku3.net/asset/sound/html5/op.mp3" type="audio/mp3"> 27</audio> 28<!-- 再生ボタン --> 29<button id="btn-play" type="button"><i class="fas fa-play"></i></button> 30 31<!-- 音声ファイル --> 32<audio id="bgm1"> 33 <source src="https://miku3.net/asset/sound/html5/op.mp3" type="audio/mp3"> 34</audio> 35<!-- 再生ボタン --> 36<button id="btn-play" type="button"><i class="fas fa-play"></i></button> 37 38<!-- 音声ファイル --> 39<audio id="bgm1"> 40 <source src="https://miku3.net/asset/sound/html5/op.mp3" type="audio/mp3"> 41</audio> 42<!-- 再生ボタン --> 43<button id="btn-play" type="button"><i class="fas fa-play"></i></button> 44</body> 45</html>

JavaScript

1<script> 2 for(var i=0;i<audios.length;i++){ 3audios[ i ].addEventListener( "play", function(){ 4for(var j=0;j<audios.length;j++){ 5if( audios[ j ]!=this ){ audios[ j ].pause() } 6} 7}, false ); 8} 9 const bgm1 = document.querySelector("#bgm1"); // <audio> 10 const btn = document.querySelector("#btn-play"); // <button> 11 btn.addEventListener("click", ()=>{ 12 // pausedがtrue=>停止, false=>再生中 13 if( ! bgm1.paused ){ 14 btn.innerHTML = '<i class="fas fa-play"></i>'; 15 bgm1.pause(); 16 } 17 else{ 18 btn.innerHTML = '<i class="fas fa-pause"></i>'; 19 bgm1.play(); 20 } 21 }); 22 /** 23 * [event] 再生終了時に実行 24 */ 25 bgm1.addEventListener("ended", ()=>{ 26 bgm1.currentTime = 0; // 再生位置を先頭に移動 27 btn.innerHTML = '<i class="fas fa-play"></i>'; // 「再生ボタン」に変更 28 }); 29</script>

追記

id要素をclassに書き換えましたが当初の現象と変わりませんでした。

HTML

1<!DOCTYPE html> 2<html> 3<head> 4 <meta charset="UTF-8"> 5 <title>HTML5 Audio Sample1</title> 6</head> 7<body> 8<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous"> 9 10<!-- 音声ファイル --> 11<audio class="bgm1"> 12 <source src="https://miku3.net/asset/sound/html5/op.mp3" type="audio/mp3"> 13</audio> 14<!-- 再生ボタン --> 15<button class="btn-play" type="button"><i class="fas fa-play"></i></button> 16 17<!-- 音声ファイル --> 18<audio class="bgm1"> 19 <source src="https://miku3.net/asset/sound/html5/op.mp3" type="audio/mp3"> 20</audio> 21<!-- 再生ボタン --> 22<button class="btn-play" type="button"><i class="fas fa-play"></i></button> 23 24<!-- 音声ファイル --> 25<audio class="bgm1"> 26 <source src="https://miku3.net/asset/sound/html5/op.mp3" type="audio/mp3"> 27</audio> 28<!-- 再生ボタン --> 29<button class="btn-play" type="button"><i class="fas fa-play"></i></button> 30 31<!-- 音声ファイル --> 32<audio class="bgm1"> 33 <source src="https://miku3.net/asset/sound/html5/op.mp3" type="audio/mp3"> 34</audio> 35<!-- 再生ボタン --> 36<button class="btn-play" type="button"><i class="fas fa-play"></i></button> 37 38<!-- 音声ファイル --> 39<audio class="bgm1"> 40 <source src="https://miku3.net/asset/sound/html5/op.mp3" type="audio/mp3"> 41</audio> 42<!-- 再生ボタン --> 43<button class="btn-play" type="button"><i class="fas fa-play"></i></button> 44</body> 45</html>

JavaScript

1<script> 2 for(var i=0;i<audios.length;i++){ 3audios[ i ].addEventListener( "play", function(){ 4for(var j=0;j<audios.length;j++){ 5if( audios[ j ]!=this ){ audios[ j ].pause() } 6} 7}, false ); 8} 9 const bgm1 = document.querySelector(".bgm1"); // <audio> 10 const btn = document.querySelector(".btn-play"); // <button> 11 btn.addEventListener("click", ()=>{ 12 // pausedがtrue=>停止, false=>再生中 13 if( ! bgm1.paused ){ 14 btn.innerHTML = '<i class="fas fa-play"></i>'; 15 bgm1.pause(); 16 } 17 else{ 18 btn.innerHTML = '<i class="fas fa-pause"></i>'; 19 bgm1.play(); 20 } 21 }); 22 /** 23 * [event] 再生終了時に実行 24 */ 25 bgm1.addEventListener("ended", ()=>{ 26 bgm1.currentTime = 0; // 再生位置を先頭に移動 27 btn.innerHTML = '<i class="fas fa-play"></i>'; // 「再生ボタン」に変更 28 }); 29</script>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

#bgm1 #btn-play が複数存在しています。
ID属性は一意なので、想定しているような動作をしない可能性が高いです。

id グローバル属性は、文書全体で一意でなければならない識別子 (ID) を定義します。

id - HTML: HyperText Markup Language | MDN

解決方法ですが、複数存在することが想定される要素は、クラスで識別する方がいいかと思います。

投稿2021/11/10 02:19

Lhankor_Mhy

総合スコア36163

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MK-95

2021/11/10 02:31 編集

ご回答ありがとうございます。 #bgm1と#btn-playをclassに書き換え、scriptタグ内も書き換えましたが変わりませんでした。
Lhankor_Mhy

2021/11/10 02:34

具体的なコードがないと具体的なお返事はできませんが、一般論的な解決方法としては Devtools などで変数の値を確認してみるのがいいかと思いますね。
MK-95

2021/11/10 02:43

先ほどソースを追加しました。
MK-95

2021/11/10 02:58

ご回答ありがとうございます。 querySelectorからquerySelectorAllに書き換えました。 今度は一つ目も音声再生できなくなりました。
Lhankor_Mhy

2021/11/10 03:02 編集

「querySelectorAll addEventListener 動作しない」あたりでググるといいのではないでしょうか。 たとえば、こういう記事が検索で挙がってきます。 https://teratail.com/questions/223878 ググり力はエンジニアに必要な能力だと思いますので、もう少し鍛えた方がいいかもですね。
MK-95

2021/11/10 03:03

ご回答ありがとうございます。 ちょっと自身で調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問