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

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

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

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

JavaScript

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

Q&A

1回答

1030閲覧

YouTube IFrame APIで遅延ロード

popopo1256

総合スコア0

YouTube

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

JavaScript

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

0グッド

1クリップ

投稿2023/08/09 09:00

実現したいこと

YouTube IFrame APIでYoutubeを埋め込んでいる部分の表示が重く、サイト評価に影響が出るので遅延読み込みを実施したいです。

前提

iframeタグで入れる際は、loading="lazy"を追記すれば解決すると思うのですが、YouTube IFrame APIを利用する際は空divに動画を表示させるということになるので、そもそもiframeタグがないのでその手は使えないかと思います。
調べてみましたが、遅延用の関数が用意されている様子がありませんでした。

最初は、生成されたiframeにJSでloading="lazy"つければ良いか?と思ったのですが、そもそもiframeが出てきてるってことはもう読み込まれているのでその後遅延読み込み入れても意味がないということに気づきました。。

初心者ですみませんが知見のある方、お知恵を貸していただけましたら嬉しいです。

該当のソースコード

該当のものを貼ることはできないので、リファレンスのコードを貼りました。
(これとほぼ同じような作りです)

<!DOCTYPE html> <html> <body> <!-- 1. The <iframe> (and video player) will replace this <div> tag. --> <div id="player"></div> <script> // 2. This code loads the IFrame Player API code asynchronously. var tag = document.createElement('script'); tag.src = "https://www.youtube.com/iframe_api"; var firstScriptTag = document.getElementsByTagName('script')[0]; firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); // 3. This function creates an <iframe> (and YouTube player) // after the API code downloads. var player; function onYouTubeIframeAPIReady() { player = new YT.Player('player', { height: '360', width: '640', videoId: '○○○○○', events: { 'onReady': onPlayerReady, 'onStateChange': onPlayerStateChange } }); } // 4. The API will call this function when the video player is ready. function onPlayerReady(event) { event.target.playVideo(); } // 5. The API calls this function when the player's state changes. // The function indicates that when playing a video (state=1), // the player should play for six seconds and then stop. var done = false; function onPlayerStateChange(event) { if (event.data == YT.PlayerState.PLAYING && !done) { setTimeout(stopVideo, 6000); done = true; } } function stopVideo() { player.stopVideo(); } </script> </body> </html>

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

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

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

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

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

guest

回答1

0

生成されたiframeにJSでloading="lazy"つければ良いか?と思ったのですが、そもそもiframeが出てきてるってことはもう読み込まれているのでその後遅延読み込み入れても意味がない

 そんなことないんじゃないですかね……? 当方で試したところ、動的に iframe 要素を追加しても loading="lazy" は有効のようでした(Chrome115)。


 それはそれとして、ご提示のコードは自動再生をして6秒後に停止するというコードでしたので、この場合は遅延読み込みをしていてたとしてもevent.target.playVideo()が実行される以上、結局は読み込まれてしまう、という話ではないでしょうか。

 ご提示のコードと問題のコードは異なるとのことですが、同様の構造になっているのではないですか? 適切なタイミングで読み込みや再生のスクリプトが実行されていますか?


 IntersectionObserver を使ってみてはどうでしょうか。

投稿2023/08/10 02:23

Lhankor_Mhy

総合スコア37421

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問