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

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

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

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

YouTube API

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

JavaScript

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

jQuery

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

HTML

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

Q&A

解決済

2回答

1399閲覧

JavaScriptで関数が複雑な入れ子になる場合の処理

eaconian

総合スコア21

YouTube

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

YouTube API

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

JavaScript

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

jQuery

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

HTML

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

1グッド

0クリップ

投稿2018/09/15 07:09

編集2018/09/15 23:24

YouTubeの制御ボタンについて、機能は実装できたのですが、関数を入れ子にすると動作せず、質問させて頂きます。

まず実装できた場合がこちらでして、
https://jsfiddle.net/8d3g6mc5/
ご覧のように「再生・停止」いずれも動画が制御できています。

今回はこれを3つの関数で囲みたいのですが、そうすると動作しなくなってしまう部分で躓いてしまいました。

つまり下記のJavaScriptにあるように、
// 制御ボタンの設定の部分を、
// ★使いまわすために関数にしておく
// ★「見る」クリックで動画表示
// ★動画表示してからで囲むと動作しなくなってしまうのです。

Javascript

1// ★使いまわすために関数にしておく 2function YoutubeCtr() { 3 4 // ★「見る」クリックで動画表示 5 $('.lazy-load-youtube').on('click', function() { 6 $('#target').html('<div class="media"> 7 <div class="container-youtube"> 8 <iframe src="//www.youtube.com/embed/ZVT_CNl0Wvc 9 ?autoplay=1&amp;iv_load_policy=3&amp;rel=0" 10 allowfullscreen="" 11 frameborder="0"> 12 </iframe> 13 </div> 14 </div>'); 15 16 // ★動画表示してから 17 setTimeout(function(){ 18 19 // 制御ボタンの設定 20 var player; 21 function onYouTubeIframeAPIReady() { 22 player = new YT.Player( 23 document.getElementsByClassName('container-youtube')[0], { 24 videoId: 'ZVT_CNl0Wvc', 25 }); 26 var clickElement = document.getElementById("play"); 27 clickElement.addEventListener("click", function(event) { 28 player.playVideo(); 29 },false); 30 var clickElement = document.getElementById("pause"); 31 clickElement.addEventListener("click", function(event) { 32 player.pauseVideo(); 33 },false); 34 } 35 function onPlayerReady(event) { 36 event.target.playVideo(); 37 } 38 39 },500); 40 41 }); 42} 43YoutubeCtr();

上記コードのように3つの関数を加えて動作しなくなったものがこちらです。
https://jsfiddle.net/8d3g6mc5/1/

これはYouTube APIについての問題というよりも、基本的なJavaScriptの入れ子構造について知識不足であると思うのですが、これだけ色々な入れ子になるとどう対処したらいいものか…、私ではまったく判断できません。

どうか有識者の皆さま、プロの視点からのアドバイスを頂戴できれば幸甚に存じます。
何卒宜しくお願い申し上げます。

miyabi-sun👍を押しています

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

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

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

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

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

miyabi-sun

2018/09/15 16:08

「Youtbe」に「Javascript」↑だと!?ふざけんじゃねえよお前、「YouTube」と「JavaScript」だろォ!!
miyabi-sun

2018/09/15 16:11

一文字違いでコードはすぐ動かなくなりますし、またコードが綺麗なルールで書かれて居ないとバグの箇所を見つける事が非常に困難になります。なので日本語には寛容なエンジニア達は固有名詞等、名付けられたものに関しては非常に敏感です。回答が付くor付かないにも影響することがありますので出来るだけ気をつける癖をつけて下さいね。
eaconian

2018/09/15 17:15

ありがとうございます。
退会済みユーザー

退会済みユーザー

2018/09/16 00:06

みやびすんは、いつまでたってもお子ちゃまでちゅねぇ。
miyabi-sun

2018/09/16 00:38

対応ありがとうございます!
guest

回答2

0

プロじゃなくて恐縮ですが、とりあえず原因には予想がつくので投稿させていただきます。

質問者様のおっしゃっている通り、JavaScript の入れ子構造の理解不足が原因のようですね。

JavaScript は関数がスコープを作るため、 varfunction で宣言した変数や関数は、基本的にその関数の外からは「見えなく」なります。

javascript

1function hoge(){ 2 function fuga(){ console.log(); } 3 fuga(); // 実行可能 4} 5 6hoge(); // 実行可能 7fuga(); // => エラー (fuga は未定義)

そのため、入れ子版コードでは、onYouTubeIframeAPIReady()onPlayerReady() 関数が youtube API から「見えなく」なってしまったため、API から呼び出せなくなっています。

youtubeAPI には詳しくありませんが、関数名から察するに、どちらの関数も(仮に複数の動画を埋め込む際でも)一つだけ定義しておけばよいのだと思います。

少なくとも、同名の関数を何度定義しても意味がない(上書きされる)ので、素直に最初のコードのように入れ子にせずに記述してください。

その上で、どのように「使いまわす」ことを考えているのか明示いただければ、何かしらの解決策も提示できる方が現れるかと存じます。

また、setTimeout() を利用して遅延させるのはこの場合明らかに無意味(どころかおそらくこれも動作を妨げる一因になっている)ので注意してください。

投稿2018/09/15 10:00

R.Mizukami

総合スコア1086

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

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

eaconian

2018/09/15 13:08 編集

ありがとうございます。『// ★使いまわすために関数にしておく』は諦めるにしても、他の2つの必要性は次の通りです。 理由➀ 動画はプラグインによって遅延読み込みさせておりますゆえ、『// ★「見る」クリックで動画表示』は必須となります。(正確には「見る」でなく「サムネイル」のクリックですが。) 理由➁ クリック後に動画が読み込まれる過程で当該プラグインがiframeを出現させるために、出現後に『// 制御ボタンの設定』を適用しなければならないのですが、その順番について私は『当該プラグインの処理後に』という条件が書けないために『// ★動画表示してから』という条件にしております。 これらの理由によって、『.on('click', function() {』が必須で、『setTimeout()』も私には必要であるという事情でございます。 また思い至る点があればご指摘くださいませ。
guest

0

自己解決

ご回答下さったR.Mizukami様、別途質問させて頂いた方々、お騒がせして申し訳ございませんでした。

こちらで出来ました。
https://jsfiddle.net/sek7wfxp/

質問との大きな変更としては、APIの読み込み方と、addEventListenerの追加です。
本件が皆様のお役に立てれば幸いでございます。

投稿2018/09/15 23:39

eaconian

総合スコア21

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問