実現したいこと
- YouTube iFrame Player APIを使って複数のidセレクタに動画を埋め込む
- 更新時に変更しなくてはならないファイルの数を減らす
- それぞれのiframeに埋め込んだ動画のシークバーを動かすボタンをそれぞれのidセレクタに配置する予定
質問
こちらのサイトを参考に、複数のYouTube動画を埋め込んだサイトを作っています。
こちらのコードで一応問題なく動いているのでこのままでも良いのですが、コンテンツを更新する際にHTMLとJavaScriptの両方を変更しなくてはならないため、HTMLの変更だけで済むように改善したいと考えています。
jQueryの.each()を使えば良いかなと思ったのですがうまく動きません。
間違っているところ、またより良い書き方などありましたら教えていただきたいです。
変更前のソースコード
HTML
1<!doctype html> 2<html lang="ja"> 3<head> 4 <meta charset="utf-8"> 5 <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script> 6 <script src="iframe.js"></script> 7 <title>youtube player test</title> 8</head> 9<body> 10 <div id="sample01"></div> 11 <div id="sample02"></div> 12 <div id="sample03"></div> 13 <div id="sample04"></div> 14</body> 15</html>
JavaScript
1var tag = document.createElement('script'); 2tag.src = "https://www.youtube.com/iframe_api"; 3var firstScriptTag = document.getElementsByTagName('script')[0]; 4firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); 5 6// 各プレーヤーの格納 7var ytPlayer = []; 8// プレーヤーのサイズ 9var ytWidth = 640; 10var ytHeight = 390; 11// 各動画情報 12var ytData = [ 13 { 14 id: 'NcgBHHMbSGg', 15 area: 'sample01' 16 }, { 17 id: 'wbqOCoBkGvg', 18 area: 'sample02' 19 }, { 20 id: 'idIHKr4GvPY', 21 area: 'sample03' 22 }, { 23 id: 'ke8aMAvP7pk', 24 area: 'sample04' 25 } 26]; 27 28// 各プレーヤーの埋め込み 29function onYouTubeIframeAPIReady() { 30 for(var i = 0; i < ytData.length; i++) { 31 ytPlayer[i] = new YT.Player(ytData[i]['area'], { 32 width: ytWidth, 33 height: ytHeight, 34 videoId: ytData[i]['id'], 35 playerVars: { 36 rel: 0 37 }, 38 events: { 39 'onReady': onPlayerReady 40 } 41 }); 42 } 43} 44 45// 各プレーヤー準備完了後の処理 46function onPlayerReady(e) { 47 for (var i = 0; i < ytData.length; i++) { 48 if(e.target.getIframe().id == ytData[i]['area']) { 49 console.log(ytData[i]['area'] + 'のプレーヤー準備完了しました。'); 50 } 51 }; 52} 53 54// ボタン作成用 55function myPlayVideo(num) { 56 ytPlayer[num].playVideo(); 57} 58function myPauseVideo(num) { 59 ytPlayer[num].pauseVideo(); 60} 61function mySeekTo(num, sec) { 62 ytPlayer[num].seekTo(sec,true); 63}
試したこと
- 前回の質問で.each()を知ったためそれを使ったコードにしてみましたがうまく動きませんでした。
後々わかりやすいかと思いidセレクタをdataに変更してます。
HTML
1<body> 2 <div data-archive="YouTube動画のid"></div> 3 <div data-archive="YouTube動画のid"></div> 4 <div data-archive="YouTube動画のid"></div> 5 <div data-archive="YouTube動画のid"></div> 6</body>
JavaScript
1 2var tag = document.createElement('script'); 3tag.src = "https://www.youtube.com/iframe_api"; 4var firstScriptTag = document.getElementsByTagName('script')[0]; 5firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); 6 7var ytWidth = 640; 8var ytHeight = 390; 9 10$(function (){ 11 $('[data-archive]').each(function(index, target) { 12 function onYouTubeIframeAPIReady() { 13 player = new YT.Player(target.dataset.archive, { 14 width: ytWidth, 15 height: ytHeight, 16 videoId: target.dataset.archive, 17 playerVars: { 18 rel: 0 19 }, 20 events: { 21 'onReady': onPlayerReady 22 } 23 24 }); 25 } 26 }); 27});
- 違うだろうなと思いましたが念のため、.each()はfor文のような挙動をするようなのでonYouTubeIframeAPIReady()と位置を逆にしてみて、変更前にfor文があった位置に書いてみましたがそれもうまく動きませんでした。
JavaScript
1 2var tag = document.createElement('script'); 3tag.src = "https://www.youtube.com/iframe_api"; 4var firstScriptTag = document.getElementsByTagName('script')[0]; 5firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); 6 7var ytWidth = 640; 8var ytHeight = 390; 9 10$(function (){ 11 $(function onYouTubeIframeAPIReady() { 12 $('[data-archive]').each(function(index, target) { 13 player = new YT.Player(target.dataset.archive, { 14 width: ytWidth, 15 height: ytHeight, 16 videoId: target.dataset.archive, 17 playerVars: { 18 rel: 0 19 }, 20 events: { 21 'onReady': onPlayerReady 22 } 23 24 }); 25 }); 26 }); 27});
回答2件
あなたの回答
tips
プレビュー