SoundCloud播放器具有默认功能,当用户启动播放器时,它会自动暂停当前播放的所有其他播放器。 (例如:http://jsfiddle.net/Vx6hM/)。
我正在尝试使用通过普通嵌入代码动态添加的嵌入式YouTube视频重新创建此内容。
使用此:https://stackoverflow.com/a/7513356/938089 而这:https://stackoverflow.com/a/7988536/1470827
我能够做到这一点:
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 Bin,它有一半工作:http://jsbin.com/oxoyes/2/edit
目前,它唯一一个叫球员。我需要它来暂停除了比赛之外的所有其他球员。
此外,欢迎任何有关如何清理和/或以不同方式/更好方式进行清洁的提示。我对javascript仍然很陌生,所以我甚至不确定我是否会采用正确的方式。
谢谢!
答案 0 :(得分:2)
你最多只能有一名球员在特定时间比赛。不要试图暂停所有正在播放的内容,而是将其视为试图暂停播放的内容。当然,没有人可以参加比赛。鉴于此,请查看以下代码。你保持一个外部范围变量,并在必要时暂停,同时将其设置为之后刚开始播放的播放器。
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;
}
}
}
});
});
}
答案 1 :(得分:1)
我认为这可能会实现您的解决方案
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();
}
}
}
}
你以前的代码的问题在于你使用每个in call函数所以它可能执行3 * 3次,因此创建了9个player的实例。所以我所做的是我将每个实例存储在一个数组中。
答案 2 :(得分:0)
我尝试了cbayram发布的方式,并发现它取得了不小的成功。 我更喜欢fuzionpro的方式,但不得不纠正一些问题,而且我提出了以下内容,它运行良好,包括console.logs,所以你可以看到发生了什么。 可能将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);
});
}