iframeを非表示にするときにYouTubeプレーヤーを一時停止するにはどうすればよいですか?


86

にYouTube動画を含む非表示のdivがあります<iframe>。ユーザーがリンクをクリックすると、このdivが表示され、ユーザーはビデオを再生できるようになります。

ユーザーがパネルを閉じると、ビデオの再生が停止します。どうすればこれを達成できますか?

コード:

<!-- link to open popupVid -->
<p><a href="javascript:;" onClick="document.getElementById('popupVid').style.display='';">Click here</a> to see my presenting showreel, to give you an idea of my style - usually described as authoritative, affable and and engaging.</p>

<!-- popup and contents -->
<div id="popupVid" style="position:absolute;left:0px;top:87px;width:500px;background-color:#D05F27;height:auto;display:none;z-index:200;">

  <iframe width="500" height="315" src="http://www.youtube.com/embed/T39hYJAwR40" frameborder="0" allowfullscreen></iframe>

  <br /><br /> 
  <a href="javascript:;" onClick="document.getElementById('popupVid').style.display='none';">
  close
  </a>
</div><!--end of popupVid -->

私はわからないんだけど、あなたはそれを隠したビデオを停止またはDIVからビデオを削除する方法を見つけるために持っていない可能性があります...
aniri

あなたは答えを受け入れるべきです。
snymkpr 2015

回答:


188

この動作を実装する最も簡単な方法は、必要に応じてpauseVideoandplayVideoメソッドを呼び出すことです。以前の回答の結果に触発されて、目的の動作を実現するためのプラグインレス関数を作成しました。

唯一の調整:

  • 関数を追加しました、 toggleVideo
  • ?enablejsapi=1この機能を有効にするために、YouTubeのURLに追加しました

デモ:http//jsfiddle.net/ZcMkt/
コード:

<script>
function toggleVideo(state) {
    // if state == 'hide', hide. Else: show video
    var div = document.getElementById("popupVid");
    var iframe = div.getElementsByTagName("iframe")[0].contentWindow;
    div.style.display = state == 'hide' ? 'none' : '';
    func = state == 'hide' ? 'pauseVideo' : 'playVideo';
    iframe.postMessage('{"event":"command","func":"' + func + '","args":""}', '*');
}
</script>

<p><a href="javascript:;" onClick="toggleVideo();">Click here</a> to see my presenting showreel, to give you an idea of my style - usually described as authoritative, affable and and engaging.</p>

<!-- popup and contents -->
<div id="popupVid" style="position:absolute;left:0px;top:87px;width:500px;background-color:#D05F27;height:auto;display:none;z-index:200;">
   <iframe width="500" height="315" src="http://www.youtube.com/embed/T39hYJAwR40?enablejsapi=1" frameborder="0" allowfullscreen></iframe>
   <br /><br />
   <a href="javascript:;" onClick="toggleVideo('hide');">close</a>

1
これが機能した場合は、間違いなく緑色のチェックボックスが必要です。私もこのソリューションを採用しています-素晴らしいものです。これらのビデオフレームはjQueryUIアコーディオンにあるので、各トリガーイベントにアタッチする必要があります。
jeffkee 2012

残念ながら、YouTubeのAPIでは、postMessageを介して送信されるメッセージに二重引用符を使用するようになっていることを指摘したいと思います。たとえば、外側の二重引用符と内側の単一引用符に切り替えることはできません。
ヨルダン

1
@JordanメッセージはJSONであることが期待されているため、これは完全に理にかなっています。JSONは、定義上、二重引用符を使用してキーと値を引用します。
ロブW

2
興味のある方は、ブートストラップ3モーダルの[閉じる]ボタンをクリックするとビデオの再生を停止するようにコードを更新しました。$( "#MyModal-close")。click(function(){var div = document.getElementById( "MyModal-videoWrapper"); var iframe = div.getElementsByTagName( "iframe")[0] .contentWindow; iframe.postMessage ( '{"event": "command"、 "func": "' + 'pauseVideo' + '"、 "args": ""}'、 '*');});
ライアンウォルトン

10
次の?enablejsapi=1ようにiframe埋め込みURLにを追加する必要があることに注意してください:そうで<iframe class="embed-responsive-item" src="//www.youtube.com/embed/WIZUeIDFALw?html5=1&enablejsapi=1" allowfullscreen></iframe>ないと機能しません:)
dineth 2014

23

これは、モーダルウィンドウでiframeを非表示/一時停止するためのRobWの回答に対するjQueryの見解です。

    function toggleVideo(state) {
        if(state == 'hide'){
            $('#video-div').modal('hide');
            document.getElementById('video-iframe'+id).contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}', '*');
        }
        else {
            $('#video-div').modal('show');
            document.getElementById('video-iframe'+id).contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}', '*');
        }
    }

参照されるhtml要素は、show / hideメソッドを呼び出すモーダルdiv自体(#video-div)と、src = ""のようにビデオURLを持ち、接尾辞enablejsapi = 1を持つiframe(#video-iframe)です。これにより、プレーヤーのプログラムによる制御が可能になります(例:。

htmlの詳細については、RobWの回答を参照してください。


5
どのような読みやすさの向上が変化しましたか?if / elseを条件としますが、これを始めてくれてありがとう。有効な追加がすべてだと感じました。
DrewT 2013

15

これは、RobWとDrewTの回答に基づいてページ上のすべてのビデオを一時停止するための簡単なjQueryスニペットです。

jQuery("iframe").each(function() {
  jQuery(this)[0].contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}', '*')
});

jQueryを使用したくない場合は、jQueryオブジェクトを参照解除した後、「each」関数内のコードは同じです。つまり、node.contentWindowです。...
mattdlockyer 2016年

ビデオが再び表示されたときにこれを逆にして再度再生するにはどうすればよいですか?
カールパップワース2017年

「pauseVideo」を「playVideo」に置き換えるだけです。例:jsfiddle.net/ora2kqzq/1
クォータ

それはもう機能していません...{"event":"command","func":"playVideo","args":[],"id":1,"channel":"widget"}その後試しても、{"event":"listening","id":1,"channel":"widget"}YT.Player iframeapiがyoutubeembedに投稿しています。
NoBugs 2017

9

簡単な方法は、ビデオのsrcをゼロに設定するだけです。これにより、ビデオが非表示になっている間は消えてしまい、ビデオを開くリンクをクリックしたときにsrcを目的のビデオに戻すことができます。これは、単にYouTube iframeにIDを設定し、次のようにそのIDを使用してsrc関数を呼び出します。

<script type="text/javascript">
function deleteVideo()
{
document.getElementById('VideoPlayer').src='';
}

function LoadVideo()
{
document.getElementById('VideoPlayer').src='http://www.youtube.com/embed/WHAT,EVER,YOUTUBE,VIDEO,YOU,WHANT';
}
</script>

<body>

<p onclick="LoadVideo()">LOAD VIDEO</P>
<p onclick="deleteVideo()">CLOSE</P>

<iframe id="VideoPlayer" width="853" height="480" src="http://www.youtube.com/WHAT,EVER,YOUTUBE,VIDEO,YOU,HAVE" frameborder="0" allowfullscreen></iframe>

</boby>

4
警告:javascriptを使用してiframesrcを変更すると、誤ってにプッシュされwindow.history、戻るボタンの問題が発生します。
ヨルダンアルセノ2014年

ジョーダンありがとう!自分でこの回答を使い始めたばかりで、この動作に気づいていませんでした。後でよりも今知っている方がいいです:)
MMachinegun 2014

この方法を試している人への公正な警告:これを使用してYouTubeのiframe埋め込みを含むdivを切り替えると、非常に顕著な遅延が発生する可能性があります。注意してください。
ムハンマドアブドゥル-ラヒム2015

6

他の回答で言及されて?enablejsapi=trueいるplayVideo/pauseVideoコマンドを使用する前に、iframeのsrcを設定する必要があるため、Javascriptを介してプログラムでこれを追加すると便利な場合があります(特に、この動作を他の人が埋め込んだビデオに適用したい場合など) YouTube埋め込みコードをカットアンドペーストしたばかりのユーザー)。その場合、次のようなものが役立つ可能性があります。

function initVideos() {

  // Find all video iframes on the page:
  var iframes = $(".video").find("iframe");

  // For each of them:
  for (var i = 0; i < iframes.length; i++) {
    // If "enablejsapi" is not set on the iframe's src, set it:
    if (iframes[i].src.indexOf("enablejsapi") === -1) {
      // ...check whether there is already a query string or not:
      // (ie. whether to prefix "enablejsapi" with a "?" or an "&")
      var prefix = (iframes[i].src.indexOf("?") === -1) ? "?" : "&amp;";
      iframes[i].src += prefix + "enablejsapi=true";
    }
  }
}

...これを呼び出すdocument.readyと、「video」のクラスを持つdiv内のすべてのiframeenablejsapi=trueがソースに追加され、playVideo / pauseVideoコマンドがそれらで機能できるようになります。

(nb。この例ではvar iframes、を設定する1行にjQueryを使用していますが、jQueryを使用していない場合は、一般的なアプローチは純粋なJavascriptでも同様に機能するはずです)。


5

stopVideo()divを非表示にする前に、YouTubeプレーヤーインスタンスでメソッドを呼び出すことで、ビデオを停止できます。

player.stopVideo()

詳細については、こちらをご覧ください:http//code.google.com/apis/youtube/js_api_reference.html#Playback_controls


プレイヤーオブジェクトとは何ですか?どのようにアクセスしますか?プレーヤーが未定義で、ビデオがまだ再生されます
Claudiu Creanga 2017

JSAPIを使用してインスタンス化したときに利用できます。
david 2017

4

RobWのやり方は私にとって素晴らしいものでした。jQueryを使用している人のために、私が最終的に使用した簡略版を次に示します。

var iframe = $(video_player_div).find('iframe');

var src = $(iframe).attr('src');      

$(iframe).attr('src', '').attr('src', src);

この例では、「video_player」はiframeを含む親divです。


4

1つのページに複数のYouTube動画が埋め込まれている場合に機能する、jQueryを使用して思いついたソリューションを共有したいと思いました。私の場合、各ビデオのモーダルポップアップを次のように定義しました。

<div id="videoModalXX">
...
    <button onclick="stopVideo(videoID);" type="button" class="close"></button>
    ...
    <iframe width="90%" height="400" src="//www.youtube-nocookie.com/embed/video_id?rel=0&enablejsapi=1&version=3" frameborder="0" allowfullscreen></iframe>
...
</div>

この場合、videoModalXXはビデオの一意のIDを表します。次に、次の関数がビデオを停止します。

function stopVideo(id)
{
    $("#videoModal" + id + " iframe")[0].contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}', '*');
}

私はこのアプローチが好きです。なぜなら、戻って後で見続けたい場合に備えて、中断したところからビデオを一時停止し続けるからです。特定のIDを持つビデオモーダル内のiframeを探しているので、私にとってはうまく機能します。特別なYouTube要素IDは必要ありません。うまくいけば、誰かがこれも役立つと思うでしょう。


これは、大量のコードがなくてもうまく機能しました。ページに複数のYTビデオがあり、YTサムを表示しているだけで、停止/一時停止の解決策が必要でした。そして、pauseVideoをplayVideoに変更することで、列幅全体に拡大したときにビデオを開始することができました
WebDude0482 2017

2

iframeのsrcを削除するだけです

$('button.close').click(function(){
    $('iframe').attr('src','');;
});

しかし、ユーザーが開くをクリックしたときに、彼はプレイを続けたいと思うかもしれません。
Coda Chang

兄弟、onclickもう一度jqueryを介してsrcを追加すると、機能します
rakesh kejriwal 2017

1

Rob Wの回答は、スライダーが非表示になっているときにiframe上でビデオを一時停止する方法を理解するのに役立ちました。それでも、それを機能させるには、いくつかの変更が必要でした。これが私のhtmlのスニペットです:

<div class="flexslider" style="height: 330px;">
  <ul class="slides">
    <li class="post-64"><img src="http://localhost/.../Banner_image.jpg"></li>
    <li class="post-65><img  src="http://localhost/..../banner_image_2.jpg "></li>
    <li class="post-67 ">
        <div class="fluid-width-video-wrapper ">
            <iframe frameborder="0 " allowfullscreen=" " src="//www.youtube.com/embed/video-ID?enablejsapi=1 " id="fitvid831673 "></iframe>
        </div>
    </li>
  </ul>
</div>

これがローカルホストで機能することと、Rob Wが述べたように、ビデオURLの末尾に「enablejsapi = 1」が追加されていることを確認してください。

以下は私のJSファイルです:

jQuery(document).ready(function($){
    jQuery(".flexslider").click(function (e) {
        setTimeout(checkiframe, 1000); //Checking the DOM if iframe is hidden. Timer is used to wait for 1 second before checking the DOM if its updated

    });
});

function checkiframe(){
    var iframe_flag =jQuery("iframe").is(":visible"); //Flagging if iFrame is Visible
    console.log(iframe_flag);
    var tooglePlay=0;
    if (iframe_flag) {                                //If Visible then AutoPlaying the Video
        tooglePlay=1;
        setTimeout(toogleVideo, 1000);                //Also using timeout here
    }
    if (!iframe_flag) {     
        tooglePlay =0;
        setTimeout(toogleVideo('hide'), 1000);  
    }   
}

function toogleVideo(state) {
    var div = document.getElementsByTagName("iframe")[0].contentWindow;
    func = state == 'hide' ? 'pauseVideo' : 'playVideo';
    div.postMessage('{"event":"command","func":"' + func + '","args":""}', '*');
}; 

また、より簡単な例として、JSFiddleでこれをチェックしてください


1

このアプローチにはjQueryが必要です。まず、iframeを選択します。

var yourIframe = $('iframe#yourId');
//yourId or something to select your iframe.

次に、このiframeのボタンの再生/一時停止を選択してクリックします

$('button.ytp-play-button.ytp-button', yourIframe).click();

お役に立てば幸いです。


0

ここや他の場所でのRobWの回答は非常に役に立ちましたが、もっと簡単にする必要があることがわかりました。私は他の場所でこれに答えましたが、おそらくここでも役立つでしょう。

UIWebViewにロードするHTML文字列を作成するメソッドがあります。

NSString *urlString = [NSString stringWithFormat:@"https://www.youtube.com/embed/%@",videoID];

preparedHTML = [NSString stringWithFormat:@"<html><body style='background:none; text-align:center;'><script type='text/javascript' src='http://www.youtube.com/iframe_api'></script><script type='text/javascript'>var player; function onYouTubeIframeAPIReady(){player=new YT.Player('player')}</script><iframe id='player' class='youtube-player' type='text/html' width='%f' height='%f' src='%@?rel=0&showinfo=0&enablejsapi=1' style='text-align:center; border: 6px solid; border-radius:5px; background-color:transparent;' rel=nofollow allowfullscreen></iframe></body></html>", 628.0f, 352.0f, urlString];

prepareHTML文字列のスタイリングは無視してかまいません。重要な側面は次のとおりです。

  • APIを使用して「YT.player」オブジェクトを作成します。ある時点では、iFrameタグにビデオしかなかったため、後でJSで「player」オブジェクトを参照できませんでした。
  • 最初のスクリプトタグ(iframe_api srcタグが付いているもの)が省略されている例をWebでいくつか見ましたが、これを機能させるには間違いなく必要でした。
  • APIスクリプトの先頭に「player」変数を作成します。その行を省略した例もいくつか見ました。
  • APIスクリプトで参照されるiFrameにidタグを追加します。その部分をほとんど忘れてしまいました。
  • iFramesrcタグの最後に「enablejsapi = 1」を追加します。最初はiFrameタグの属性として持っていたので、しばらくの間ハングアップしました。これは機能しない/機能しませんでした。

ビデオを一時停止する必要があるときは、これを実行するだけです。

[webView stringByEvaluatingJavaScriptFromString:@"player.pauseVideo();"];

お役に立てば幸いです。


なぜ賛成票がないのか疑問に思われるかもしれませんが、それはJavaScriptではないため、iOSアプリではなくYouTubeの埋め込みURLを参照するiframeであるOPのユースケースには役立ちません。
Vroo 2015年

@Vrooええ、わかりました。別のiOSの人がここに来て、私と同じようにこの質問を見つけた場合に備えて、この回答をここに残したかっただけです。
ブライアン

0

これはYTプレーヤーでうまく機能しています

 createPlayer(): void {
  return new window['YT'].Player(this.youtube.playerId, {
  height: this.youtube.playerHeight,
  width: this.youtube.playerWidth,
  playerVars: {
    rel: 0,
    showinfo: 0
  }
});
}

this.youtube.player.pauseVideo();


0

より簡潔でエレガント、そして安全な答え:ビデオURLの最後に「?enablejsapi = 1」を追加してから、pauseコマンドを表す通常のオブジェクトを作成して文字列化します。

const YouTube_pause_video_command_JSON = JSON.stringify(Object.create(null, {
    "event": {
        "value": "command",
        "enumerable": true
    },
    "func": {
        "value": "pauseVideo",
        "enumerable": true
    }
}));

このWindow.postMessageメソッドを使用して、結果のJSON文字列を埋め込みビデオドキュメントに送信します。

// |iframe_element| is defined elsewhere.
const video_URL = iframe_element.getAttributeNS(null, "src");
iframe_element.contentWindow.postMessage(YouTube_pause_video_command_JSON, video_URL);

メッセージが意図しない受信者に送信されないように、Window.postMessageメソッドのtargetOrigin引数にビデオURLを指定してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.