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

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

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

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

YouTube

YouTubeとはユーザーがビデオをアップロード・共有・閲覧できるビデオ共有ウェブサイトです。

YouTube API

YouTube APIはYouTubeのビデオコンテンツと機能性をウェブサイト、アプリケーション、デバイスに統合することを可能にします。

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1467閲覧

JavaScriptの[i]が複雑になり、対象の指示が困難になってしまいました

eaconian

総合スコア21

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

YouTube

YouTubeとはユーザーがビデオをアップロード・共有・閲覧できるビデオ共有ウェブサイトです。

YouTube API

YouTube APIはYouTubeのビデオコンテンツと機能性をウェブサイト、アプリケーション、デバイスに統合することを可能にします。

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2018/09/17 06:17

YouTubeAPIで動画の制御をしています。

質問内容はAPIというよりも**[i]による対象の指示方法**になると思うので、APIについてご存知ない方でも、JavaScriptの処理に慣れた方でしたらご意見頂戴できれば幸いでございます。

本題として、【機能】と【問題】を整理します。

【機能】としては、
サムネイルクリックで、➀動画再生と制御ボタン表示がされ、➁再生中は他の動画が停止する。というものなのですが、

【問題】があり、
2回目のサムネイルクリックに限って➁が効かない(1回目の動画が停止しない)。という状態です。

実際のサンプルがこちらです。
https://jsfiddle.net/38r9tmzo/
ご覧のように、サムネイルを2回連続でクリックしたときに、1回目の動画が停止せず、しかし3回以上連続でクリックした場合であれば他の動画が停止いたします。

以下にサンプルのHTMLとjavaScriptを掲載いたします。

html

1<div id="contents"> 2 <div id="ytButton"></div> 3 <div class="ytBox"> 4 <div id="sample1"></div> 5 </div> 6 <div class="ytBox"> 7 <div id="sample2"></div> 8 </div> 9 <div class="ytBox"> 10 <div id="sample3"></div> 11 </div> 12</div>

javascript

1//YouTube API 読み込み 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 7// 各プレーヤーの格納 8var ytPlayer = []; 9var ytPlaying, ytStop, ytPlay; 10 11// プレーヤーのサイズ 12var ytWidth = 200; 13var ytHeight = 130; 14 15// 各動画情報 16var ytData = [ 17 { 18 id: 'rJYQ5jWHSeM', 19 area: 'sample1' 20 }, { 21 id: 'q7JEUetg8lE', 22 area: 'sample2' 23 }, { 24 id: 'nNuHVKNWYSE', 25 area: 'sample3' 26 } 27]; 28 29// サムネイルの埋め込み 30function onYouTubeIframeAPIReady() { 31 for(var i = 0; i < ytData.length; i++) { 32 // サムネイルの埋め込み 33 document.getElementById(ytData[i]['area']).innerHTML = '<img id="yt-thumb' + i + '" src="http://i.ytimg.com/vi/' + ytData[i]['id'] + '/sddefault.jpg">'; 34 // 埋め込んだサムネイルにイベント追加 35 ytEmbedding(i); 36 } 37} 38 39// サムネイルクリック時のアクション 40function ytEmbedding(i) { 41 document.getElementById('yt-thumb' + i).addEventListener('click', function() { 42 // プレーヤーの埋め込み 43 ytPlayer[i] = new YT.Player(ytData[i]['area'], { 44 width: ytWidth, 45 height: ytHeight, 46 videoId: ytData[i]['id'], 47 playerVars: { 48 rel: 0 49 }, 50 events: { 51 'onStateChange': onPlayerStateChange, 52 'onReady': onPlayerReady 53 } 54 }); 55 // 制御ボタンの表示 56 $('#ytButton').html('<button id="play">play</button><button id="pause">pause</button>'); 57 var ytPlay = document.getElementById('play'); 58 ytPlay.addEventListener('click', function() { 59 ytPlayer[i].playVideo(); 60 }); 61 var ytPause = document.getElementById('pause'); 62 ytPause.addEventListener('click', function() { 63 ytPlayer[i].pauseVideo(); 64 }); 65 }); 66} 67 68// プレーヤー読み込み後の処理 69function onPlayerReady(e) { 70 e.target.playVideo(); 71 72} 73 74// プレーヤーの状態に変化があった時に実行 75function onPlayerStateChange(event) { 76 // 各プレーヤーの状態を確認 77 for(var i = 0; i < ytData.length; i++) { 78 var thisState = ytPlayer[i].getPlayerState(); 79 if( thisState == 1 && ytPlaying == undefined) { 80 ytPlaying = i; 81 } else if(thisState == 1 && ytPlaying != i) { 82 ytStop = ytPlaying; 83 ytPlay = i; 84 } else { 85 } 86 } 87 // 同時再生があった場合、元々再生していた方を停止する 88 if(ytStop != undefined) { 89 ytPlayer[ytStop].pauseVideo(); 90 ytStop = undefined; 91 } 92 // 現在再生中のプレーヤー番号を保存しておく 93 if(ytPlay != undefined) { 94 ytPlaying = ytPlay; 95 ytPlay = undefined; 96 } 97 // 制御ボタンを書き換えて、現在再生中のプレーヤーを制御対象にする 98 $('#ytButton').html('<button id="play2">play</button><button id="pause2">pause</button>'); 99 var ytPlay2 = document.getElementById('play2'); 100 ytPlay2.addEventListener('click', function() { 101 ytPlayer[ytPlaying].playVideo(); 102 }); 103 var ytPause2 = document.getElementById('pause2'); 104 ytPause2.addEventListener('click', function() { 105 ytPlayer[ytPlaying].pauseVideo(); 106 }); 107} 108 109

上のfunction xxxxは全てYouYubeAPIによる関数ですが、おそらくこれらの使い方については間違いはなく、先述の【問題】は**[i]による対象の指示方法**が間違っているのだと考えております。が…、不馴れなため複雑になると間違いの箇所が抽出できません。

お詳しい方、どうぞご意見宜しくお願い申し上げます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

onPlayerStateChangeの中でJavaScriptがエラー終了しています。
各プレーヤーの状態を確認のところ、中でコンソールログを出してみてください。

js

1 // 各プレーヤーの状態を確認 2 for(var i = 0; i < ytData.length; i++) { 3 console.log('player: ', ytPlayer[i]); 4

こういう感じです。

そうすると、まず最初の動画をクリックしたとき、ytPlayer[1]ytPlayer[2]undefinedであることがわかると思います。
で、次の行を見るとvar thisState = ytPlayer[i].getPlayerState();こうなっています。
undefined.getPlayerState();なんてものは存在しませんので、この時点で処理が中断されエラーが出力されます。
つまり、同時再生があった場合、元々再生していた方を停止するまで処理がたどり着きません。

解決するには、プレイヤーがちゃんと取得できているかどうか確認すればOKです。
あんまりいい判定じゃないですが、これでもいいです。
var thisState = ytPlayer[i] && ytPlayer[i].getPlayerState();
thisStateundefined代入されちゃいますけどね。

追記

焦らずゆっくり見ましょう。
まずはコンソールエラーです。
Chromeだと、「Uncaught SyntaxError: Invalid or unexpected token (index):82 」と出てきます。
「(index):82 」の部分はクリックできるので、それをクリックしてみたらどこがSyntaxErrorなのかすぐにわかります。

js

1var ytData = [ 2 { 3 id: BoxId[0], 4 area: BoxArea[0]' // ← コイツ 5 }, { 6 id: BoxId[1], 7 area: BoxArea[1]' // ← コイツ 8 }, { 9 id: BoxId[2], 10 area: BoxArea[2]' // ← コイツ 11 } 12];

オブジェクトの定義に変な記号が混入していますよ。

投稿2018/09/17 06:43

編集2018/09/17 08:40
spookybird

総合スコア1803

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

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

eaconian

2018/09/17 08:42 編集

すごいですね。とても分かりやいです。どうもありがとうございます。 (この部分には追加質問がありましたが、まったく別の話だったので削除させて頂きました。失礼致しました。)
eaconian

2018/09/17 08:45

追記について、入れ違いですみません! まったく別の話についての追加質問では図々しすぎると思い、上のコメントをたった今編集してしまいました!(削除した追加質問については別のスレッドを立てました。) >変な記号 あ、なるほど。上のアポストロフィーでしょうか。汗 後で確かめてみます。 ドタバタして申し訳ございません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問