【问题标题】:Stop embedded youtube iframe?停止嵌入 youtube iframe?
【发布时间】:2013-02-16 09:06:52
【问题描述】:

我正在使用 YouTube iframe 在我的网站上嵌入视频。

<iframe width="100%" height="443" class="yvideo" id="p1QgNF6J1h0"
              src="http://www.youtube.com/embed/p1QgNF6J1h0?rel=0&controls=0&hd=1&showinfo=0&enablejsapi=1"
              frameborder="0" allowfullscreen>
</iframe>

我在同一页面上有多个视频。

我想使用 javascript 左右单击一个按钮来停止所有这些或其中一个。

有可能吗?

更新:

我尝试了 Talvi Watia 所说和使用的方法:

$('#myStopClickButton').click(function(){
  $('.yvideo').each(function(){
    $(this).stopVideo();
  });
});

我明白了:

Uncaught TypeError: Object [object Object] has no method 'stopVideo' 

【问题讨论】:

    标签: javascript html iframe youtube-api


    【解决方案1】:

    您可能需要查看Youtube JavaScript API 参考文档。

    当您在页面上嵌入视频时,您需要传递此参数:

    http://www.youtube.com/v/VIDEO_ID?version=3&enablejsapi=1
    

    如果您想要停止所有视频按钮,您可以设置一个 javascript 例程来循环播放视频并停止它们:

    player.stopVideo()
    

    这确实涉及跟踪页面上每个视频的所有页面 ID。更简单的可能是创建一个类,然后使用 jQuery.each。

    $('#myStopClickButton').click(function(){
      $('.myVideoClass').each(function(){
        $(this).stopVideo();
      });
    });
    

    【讨论】:

    • 但是我需要为每个玩家创建一个对象吗? stopVideo() 会在没有任何事先设置的情况下正常工作吗?
    • 如果您将 enablejsapi=1 添加到嵌入中,您应该能够引用 API。需要为每个视频添加它。
    • 我收到:Uncaught TypeError: Object [object Object] has no method 'stopVideo'
    • stackoverflow.com/questions/9310112/… 包含有关跨站点保护错误的信息。 (通常是 chrome 中的一个大问题。)至于第二个,您需要更改 .myVideoClass 并将类附加到您的嵌入。即.yvideo
    • @Danpe 似乎可以在此处找到完整的工作示例:stackoverflow.com/questions/7443578/…
    【解决方案2】:

    Talvi 的回答可能仍然有效,但 Youtube Javascript API 已被标记为已弃用。您现在应该使用较新的Youtube IFrame API

    文档提供了几种完成视频嵌入的方法,但为了您的目标,您应该包括以下内容:

    //load 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);
    
    //will be youtube player references once API is loaded
    var players = [];
    
    //gets called once the player API has loaded
    function onYouTubeIframeAPIReady() {
        $('.myiframeclass').each(function() {
            var frame = $(this);
    
            //create each instance using the individual iframe id
            var player = new YT.Player(frame.attr('id'));
    
            players.push(player);
        });
    }
    
    //global stop button click handler
    $('#mybutton').click(function(){
    
        //loop through each Youtube player instance and call stopVideo()
        for (var i in players) {
            var player = players[i];
            player.stopVideo();
        }
    });
    

    【讨论】:

      【解决方案3】:

      不幸的是,这些 API 的发展速度非常快。截至 2015 年 5 月,建议的解决方案不再有效,因为播放器对象没有 stopVideo 方法。

      可以在此页面 (1) 中找到可靠的解决方案,它适用于:

      <iframe id="youtube_player" class="yt_player_iframe" width="640" height="360" src="http://www.youtube.com/embed/aHUBlv5_K8Y?enablejsapi=1&version=3&playerapiid=ytplayer"  allowfullscreen="true" allowscriptaccess="always" frameborder="0"></iframe>
      

      以及以下 JS/jQuery 代码:

      $('.yt_player_iframe').each(function(){
        this.contentWindow.postMessage('{"event":"command","func":"stopVideo","args":""}', '*')
      });
      

      【讨论】:

      • 我想强调你的嵌入网址必须有enablejsapi=1,否则这不起作用。这里有详细信息developers.google.com/youtube/player_parameters#enablejsapi我花了一些时间才意识到为什么这个答案不起作用。
      • 截至 2018 年 5 月,这仍然有效。修复了 js 代码中的一个装饰性拼写错误。
      • @MarcoFaustinell 我找到了命令,它是:取消静音。它区分大小写,因此请注意大小写。
      • 2020-05-25,这个解决方案仍然有效,添加?enablejsapi=1iframeElement.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}', '*')(注意我使用的是pauseVideo,因为即使视频没有开始,stopVideo也会隐藏标题)。跨度>
      • 我知道这篇文章已经过时了,但我只想说这个解决方案在 2020 年 7 月仍然有效。
      【解决方案4】:

      另见How to pause or stop an iframe youtube video when you leave a tab view or minimise your Ionic App

      $scope.stopVideo = function() {
       var iframe = document.getElementsByTagName("iframe")[0].contentWindow;
       iframe.postMessage('{"event":"command","func":"'+'stopVideo'+   '","args":""}', '*');
       }
      

      【讨论】:

        【解决方案5】:

        如果有人还在寻找答案,我已经解决了:

        $("#photos").on("hide",function(){
            var leg=$('.videoPlayer').attr("src");
            $('.videoPlayer').attr("src",leg);
        });
        

        #photos 是模态框的 ID,.videoPlayer 是 iframe 的类。 基本上它会刷新 src 属性(并停止播放视频)。 所以,

            $('#myStopClickButton').click(function(){
              $('.yvideo').each(function(){
                var el_src = $(this).attr("src");
                $(this).attr("src",el_src);
              });
            });
        

        应该可以解决问题。

        【讨论】:

        • 我认为这是动态加载 iframe 的最佳选择。
        • 好提示,谢谢。我将:visible 合并到其中,因此我没有重置页面上的所有内容,而是重置当前页面。翻阅标签或画廊时,这意味着新标签将显示已加载的视频。
        • 可能在 YouTube 端发生了一些变化,但对我来说,这只是重新启动视频而不是停止它(编辑:没关系,其他地方的 javascript 正在将 '&autoplay=1' 添加到 url)
        • 哈!拿那个YouTube!聪明人得分!
        • 是的!谢谢。这个选项在 2019 年仍然有效。此外,它不依赖于 YouTube API。
        【解决方案6】:

        API 很混乱,因为它们不断变化。这种纯 javascript 方式对我有用:

         <div id="divScope" class="boom-lightbox" style="display: none;">
            <iframe id="ytplayer" width="720" height="405"   src="https://www.youtube.com/embed/M7lc1UVf-VE" frameborder="0" allowfullscreen>    </iframe>
          </div>  
        
        //if I want i can set scope to a specific region
        var myScope = document.getElementById('divScope');      
        //otherwise set scope as the entire document
        //var myScope = document;
        
        //if there is an iframe inside maybe embedded multimedia video/audio, we should reload so it stops playing
        var iframes = myScope.getElementsByTagName("iframe");
        if (iframes != null) {
            for (var i = 0; i < iframes.length; i++) {
                iframes[i].src = iframes[i].src; //causes a reload so it stops playing, music, video, etc.
            }
        }
        

        【讨论】:

        • 这是一个非常接近的解决方案。现在在我尝试重置之前检测它是否正在播放。它会导致视频闪烁。
        【解决方案7】:

        最简单的方法是

        var frame = document.getElementById("iframeid");
        frame.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}', '*');
        

        【讨论】:

          【解决方案8】:

          不能简单地高估这篇文章并回答 thx OP 和 helpers。 我的解决方案只有 video_id 交换:

          <div style="pointer-events: none;">
              <iframe id="myVideo" src="https://www.youtube.com/embed/video_id?rel=0&modestbranding=1&fs=0&controls=0&autoplay=1&showinfo=0&version=3&enablejsapi=1" width="560" height="315" frameborder="0"></iframe> </div>
          
              <button id="play">PLAY</button>
          
              <button id="pause">PAUSE</button>
          
          
              <script>
                  $('#play').click(function() {
                      $('#myVideo').each(function(){ 
                          var frame = document.getElementById("myVideo");
                          frame.contentWindow.postMessage(
                              '{"event":"command","func":"playVideo","args":""}', 
                              '*'); 
                      });
                  });
          
                  $('#pause').click(function() {
                      $('#myVideo').each(function(){ 
                          var frame = document.getElementById("myVideo");
                          frame.contentWindow.postMessage(
                            '{"event":"command","func":"pauseVideo","args":""}',
                            '*'); 
                      });
                  });
              </script>
          

          【讨论】:

          • 目前完美
          • 嘿伙计们,这个解决方案很棒,除了它使视频失去了所有的原生交互性,我怎么还能使用原生 youtube 视频按钮?谢谢
          【解决方案9】:

          $('#aboutVideo .close').on('click',function(){
          			var reSrc = $('.aboutPlayer').attr("src");
          			$('.aboutPlayer').attr("src",reSrc)
          		})
          #aboutVideo{
          	width: 100%;
          	height: 100%;
          }
          #aboutVideo .modal-dialog, #aboutVideo .modal-dialog .modal-content, #aboutVideo .modal-dialog .modal-content .modal-body{
          	width: 100%;
          	height: 100%;
          	margin: 0 !important;
          	padding: 0 !important;
          }
          #aboutVideo .modal-header{
          	padding: 0px; 
          	border-bottom: 0px solid #e5e5e5; 
          	position: absolute;
          	right: 4%;
          	top: 4%;
          }
          #aboutVideo .modal-header .close{
          	opacity: 1;
          	position: absolute;
          	z-index: 99;
          	color: #fff;
          }
          #aboutVideo .modal-header button.close{
                border-radius: 50%;
              width: 7vw;
              height: 7vw;
              position: absolute;
              right: 4%;
              top: 7%;
              background: aliceblue;
          }
          #aboutVideo .modal-header button.close:hover{
          	background-color: rgba(255, 255, 255, 0.28);
          }
          #aboutVideo .modal-header button.close img{
          	width: 20px;
          	margin-top: -0.2vw;
          }
          <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
          <!-- Latest compiled and minified CSS -->
          <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
          
          <!-- Optional theme -->
          <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">
          
          <!-- Latest compiled and minified JavaScript -->
          <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
          <li class="see-video fa" type="button" data-toggle="modal" data-target="#aboutVideo">
          			<label>SEE VIDEO</label>
          		</li>
          <div class="modal fade" id="aboutVideo" tabindex="-1" role="dialog" aria-labelledby="aboutVideoLabel">
          		<div class="modal-dialog" role="document">
          			<div class="modal-content">
          				<div class="modal-header">
          					<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true"><img src="http://www.freeiconspng.com/uploads/white-close-button-png-16.png"></span></button>
          				</div>
          				<div class="modal-body">
          				<iframe class="aboutPlayer" width="100%" height="100%" src="https://www.youtube.com/embed/fju9ii8YsGs?autoplay=0&showinfo=0&controls=2&rel=0" frameborder="0" allowfullscreen poster="https://www.google.co.in/url?sa=i&rct=j&q=&esrc=s&source=images&cd=&cad=rja&uact=8&ved=0ahUKEwiOvaagmqfWAhUHMY8KHUuJCnkQjRwIBw&url=http%3A%2F%2Fnodeframework.com%2F&psig=AFQjCNEaHveDtZ81veNPSvQDx4IqaE_Tzw&ust=1505565378467268"></iframe>
          				</div>
          			</div>
          		</div>
          	</div>

          【讨论】:

            【解决方案10】:

            这是codepen,它对我有用。

            我正在寻找将 YT 视频嵌入 iframe 的最简单解决方案,我觉得就是这样。

            我需要的是让视频出现在模态窗口中并在关闭时停止播放

            这里是代码:(来自:https://codepen.io/anon/pen/GBjqQr

                <div><a href="#" class="play-video">Play Video</a></div>
                <div><a href="#" class="stop-video">Stop Video</a></div>
                <div><a href="#" class="pause-video">Pause Video</a></div>
            
                <iframe class="youtube-video" width="560" height="315" src="https://www.youtube.com/embed/glEiPXAYE-U?enablejsapi=1&version=3&playerapiid=ytplayer" frameborder="0" allowfullscreen></iframe>
            
            $('a.play-video').click(function(){
                $('.youtube-video')[0].contentWindow.postMessage('{"event":"command","func":"' + 'playVideo' + '","args":""}', '*');
            });
            
            $('a.stop-video').click(function(){
                $('.youtube-video')[0].contentWindow.postMessage('{"event":"command","func":"' + 'stopVideo' + '","args":""}', '*');
            });
            
            $('a.pause-video').click(function(){
                $('.youtube-video')[0].contentWindow.postMessage('{"event":"command","func":"' + 'pauseVideo' + '","args":""}', '*');
            });
            

            另外,if 如果我使用相同的按钮播放,您希望它在尚不可见的 DOM 对象(例如模式窗口)中 自动播放我用来显示模态的视频不起作用,所以我使用了这个:

            https://www.youtube.com/embed/EzAGZCPSOfg?autoplay=1&enablejsapi=1&version=3&playerapiid=ytplayer
            

            注意:放置它的?autoplay=1&amp; 并在下一个属性之前使用“&”以允许暂停继续工作。

            【讨论】:

            • 所以对于autoplay=1,1 表示它应该 暂停(并自动播放),你是说如果你把&amp; 放在它之后它会自动播放和暂停视频?
            • 在没有来自 youtube 的所有这些 JS 和 API 的情况下停止播放器的最简单方法,谢谢!
            • 我认为它不再工作了,至少在 Chrome 96 上,我还检查了 Firefox 89.0.2 并且它可以工作,但在 Chrome 中不能工作:(
            • 刚刚也试过了,好像不行。可能有什么新变化。大声笑。
            【解决方案11】:

            这是一个纯 JavaScript 解决方案,

            <iframe 
            width="100%" 
            height="443" 
            class="yvideo" 
            id="p1QgNF6J1h0"
            src="http://www.youtube.com/embed/p1QgNF6J1h0?rel=0&controls=0&hd=1&showinfo=0&enablejsapi=1"
            frameborder="0" 
            allowfullscreen>
            </iframe>
            <button id="myStopClickButton">Stop</button>
            
            
            <script>
            document.getElementById("myStopClickButton").addEventListener("click",    function(evt){
            var video = document.getElementsByClassName("yvideo");
            for (var i=0; i<video.length; i++) {
               video.item(i).contentWindow.postMessage('{"event":"command","func":"stopVideo","args":""}', '*');
            }
            
            });
            

            【讨论】:

              【解决方案12】:

              对于带有视频的 Twitter Bootstrap 模式/弹出窗口,这对我有用:

              $('.modal.stop-video-on-close').on('hidden.bs.modal', function(e) {
                $('.video-to-stop', this).each(function() {
                  this.contentWindow.postMessage('{"event":"command","func":"stopVideo","args":""}', '*');
                });
              });
              <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
              <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
              <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
              
              <div id="vid" class="modal stop-video-on-close"
                tabindex="-1" role="dialog" aria-labelledby="Title">
                <div class="modal-dialog" role="document">
                  <div class="modal-content">
                    <div class="modal-header">
                      <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                        <span aria-hidden="true">&times;</span>
                      </button>
                      <h4 class="modal-title">Title</h4>
                    </div>
                    <div class="modal-body">
                     <iframe class="video-to-stop center-block"
                      src="https://www.youtube.com/embed/3q4LzDPK6ps?enablejsapi=1&rel=0"
                      allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
                      frameborder="0" allowfullscreen>
                     </iframe>
                    </div>
                    <div class="modal-footer">
                      <button class="btn btn-danger waves-effect waves-light"
                        data-dismiss="modal" type="button">Close</button>
                    </div>
                  </div>
                </div>
              </div>
              
              <button class="btn btn-success" data-toggle="modal"
               data-target="#vid" type="button">Open video modal</button>

              基于Marco's answer,注意我只需要在视频URL中添加enablejsapi=1参数(rel=0只是为了不显示最后的相关视频)。 JS postMessage 函数完成了所有繁重的工作,它实际上停止了视频。

              由于请求权限,sn-p 可能无法显示视频,但在常规浏览器中,这应该在 2018 年 11 月开始工作。

              【讨论】:

                【解决方案13】:

                当我们在 modalpopup 中使用嵌入视频时,我们如何暂停/停止 YouTube iframe

                 $('#close_one').click(function (e) {
                         
                         
                         let link = document.querySelector('.divclass');// get iframe class 
                         let link = document.querySelector('#divid');// get iframe id
                         let video_src = link.getAttribute('src');
                
                         $('.youtube-video').children('iframe').attr('src', ''); // set iframe parent div value null 
                         $('.youtube-video').children('iframe').attr('src', video_src);// set iframe src again it works perfect
                
                     });
                

                【讨论】:

                  【解决方案14】:

                  这是我使用更新的 youtube API 的解决方案。包括开始、停止、暂停。

                  https://codesandbox.io/s/youtube-video-player-73x4b

                  【讨论】:

                    猜你喜欢
                    • 2011-07-27
                    • 2017-05-15
                    • 2017-06-28
                    • 2012-05-08
                    • 1970-01-01
                    • 2012-11-19
                    • 2012-08-22
                    • 2013-02-03
                    • 2016-01-25
                    相关资源
                    最近更新 更多