Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何阻止嵌入式Youtube视频同时播放_Javascript_Jquery_Youtube_Youtube Api - Fatal编程技术网

Javascript 如何阻止嵌入式Youtube视频同时播放

Javascript 如何阻止嵌入式Youtube视频同时播放,javascript,jquery,youtube,youtube-api,Javascript,Jquery,Youtube,Youtube Api,SoundCloud播放器有一个默认功能,当用户启动播放器时,它会自动暂停当前正在播放的所有其他播放器。(例如:) 我正在尝试用嵌入的youtube视频重新创建它,这些视频是通过正常的嵌入代码动态添加的 使用此选项: 这是: 我能做到这一点: function chain(){ $('.post').each(function(){ var player_id = $(this).children('iframe').attr("id"); var other_player_i

SoundCloud播放器有一个默认功能,当用户启动播放器时,它会自动暂停当前正在播放的所有其他播放器。(例如:)

我正在尝试用嵌入的youtube视频重新创建它,这些视频是通过正常的嵌入代码动态添加的

使用此选项: 这是:

我能做到这一点:

function chain(){

$('.post').each(function(){
    var player_id = $(this).children('iframe').attr("id");
    var other_player_id = $(this).siblings().children('iframe').attr("id");

    player = new YT.Player( player_id, { 

        events:
            {      
            'onStateChange': function (event) 
                {

                if (event.data == YT.PlayerState.PLAYING) 
                    { callPlayer( other_player_id , 'pauseVideo' );
                     alert('Trying to pause: ' + other_player_id);
                    }            

                }
            }        
    });

});

}
这是一个JS垃圾箱,它有一半工作:

目前,它只给其中一个玩家打电话。我需要它来暂停所有其他玩家,除了正在玩的那个

此外,欢迎提供任何关于如何清理和/或以不同方式/更好地进行操作的提示。我对javascript还是很陌生,所以我甚至不确定我是否正确使用了它


谢谢

我认为这可能实现您的解决方案

var players=[];
 function chain(id){


    var player_id = $('#player'+id).attr('id');


   players[id]=new YT.Player( player_id, { 

        events:
            {      
            'onStateChange': onPlayerStateChange
            }

    });

 }

 function onPlayerStateChange(event){


  var playerid=$(event.target).attr('id');

  if(event.data!=-1 && event.data!=5){

      for(i=1;i<players.length;i++){

       if(playerid!=i){


      players[i].stopVideo();
       }

     }


   }
}
var玩家=[];
功能链(id){
var player_id=$('#player'+id).attr('id');
players[id]=新的YT.Player(Player_id,{
活动:
{      
“onStateChange”:onPlayerStateChange
}
});
}
函数onPlayerStateChange(事件){
var playerid=$(event.target).attr('id');
if(event.data!=-1&&event.data!=5){

对于(i=1;i在给定的时间内,您最多只能有一个玩家在玩。与其尝试暂停所有正在玩的游戏,不如将其视为尝试暂停正在玩的游戏。当然,没有人可以玩。鉴于此,请查看以下代码。您维护一个外部范围变量,并在必要时暂停该变量,同时将其设置为pla你从那以后才开始玩

var playerCurrentlyPlaying = null;
function chain(){       
    $('.post').each(function(){
        var player_id = $(this).children('iframe').attr("id");
        player = new YT.Player( player_id, { 
            events:
                {      
                'onStateChange': function (event) 
                    {

                    if (event.data == YT.PlayerState.PLAYING) 
                        { 
                          if(playerCurrentlyPlaying != null && 
                          playerCurrentlyPlaying != player_id)
                          callPlayer( playerCurrentlyPlaying , 'pauseVideo' );
                          playerCurrentlyPlaying = player_id;

                        }            

                    }
                }        
        });
    });
}

我尝试了cbayram发布的方法,发现它的成功率参差不齐。 我更喜欢fuzionpro的方式,但不得不用它来纠正一些问题,我提出了以下方法,它运行良好,包括console.log,这样您就可以看到发生了什么。 也许结合下面的ytPlayers和ytPlayerStates会使它更有效率

// 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);

var ytPlayers = new Array();
var ytPlayerStates = new Array();

window.onYouTubePlayerAPIReady = function()
{
    jQuery('.video-container>iframe').each(function(index)
    {
        var iframeID = jQuery(this).attr('id');
        ytPlayerStates[iframeID] = -1;

        (function (iframeID) {
            ytPlayers.push(new YT.Player(iframeID, { 
                events:
                {      
                    'onStateChange' : function (event) 
                    {
                        console.log(iframeID+' '+event.data);

                        if (event.data == 1)
                        {
                            ytPlayerStates[iframeID] = 1;
                            for (var key in ytPlayerStates)
                            {
                                if (key != iframeID)
                                {
                                    if (ytPlayerStates[key] == 1 || ytPlayerStates[key] == 3)
                                    {
                                        ytPlayerStates[key] = 2;
                                        callPlayer(key, 'pauseVideo')
                                    }
                                }
                                console.log(key+' : '+ytPlayerStates[key]);
                            };
                        }
                    }
                }
            }));
        })(iframeID); 
    });
}

我写了一篇博客文章,详细介绍了响应各种Youtube播放器API事件的完整工作示例: