【问题标题】:Retrieve player state with multiple youtube players on a page在一个页面上使用多个 youtube 播放器检索播放器状态
【发布时间】:2011-01-17 22:02:44
【问题描述】:

我有一个包含许多 youtube 播放器的 HTML。

我正在订阅 onStateChange,以便在用户播放视频时收到通知。

function onYouTubePlayerReady(playerid) {
    var player = document.getElementById("playerA");
    player.addEventListener("onStateChange", "callback");
}

现在回调获取 newState 作为参数。

function callback(newState) {
    ...
}

这仅适用于一名玩家。 但是有很多玩家,我怎么知道哪个玩家提出了 StateChange 事件?回调只有一个参数。

有没有办法知道哪个玩家提出了事件表单回调,或者我必须为每个玩家设置不同的回调?

【问题讨论】:

标签: youtube youtube-api youtube-javascript-api


【解决方案1】:

这是我基于其他答案的解决方案:

(1) 将id 参数添加到对象和/或嵌入标签

(2) 视频地址添加playerapiid参数(应该匹配id

<object id="video1" data="http://www.youtube.com/v/AAAAAAAAAAA&version=3&enablejsapi=1&playerapiid=video1" ...>
    <embed ...>
</object>
<object id="video2" data="http://www.youtube.com/v/BBBBBBBBBBB&version=3&enablejsapi=1&playerapiid=video2" ...>
    <embed ...>
</object>

(3) 为每个视频创建命名回调函数,并在onYouTubePlayerReady 事件中将它们分配给播放器。这是一种方法:

function onYouTubePlayerReady(playerApiId) {
  var player = document.getElementById(playerApiId);
  window["onStateChange" + playerApiId] = function(state) {
    console.log("#" + playerApiId + ": new state " + state);
  };
  player.addEventListener("onStateChange", "onStateChange" + playerApiId);
}

我已经发布了demo here

【讨论】:

  • 这对我有用。这几天我一直在寻找这个解决方案!谢谢!
【解决方案2】:

我遇到了同样的问题。这是我的解决方案:

var videos = {};

//store the video player's data in the hash, with the playerapiid as the key
function loadFeaturedVideo(youTubeVideoId) {
    videos["featuredytplayer"] = {
        "yt_id": youTubeVideoId,
        "wrapperSelector": "#featured_player_wrapper",
        "embed": "featuredYtPlayer"
    };
    ...
}

function onYouTubePlayerReady(playerId) {
    var currentVideo = videos[playerId];
    var ytPlayer = document.getElementById(currentVideo["embed"]);
    videos[playerId]["stateChangeListener"] = function(newState) {
        var container = $(currentVideo["wrapperSelector"]);

        ...
    }
    ytPlayer.addEventListener("onStateChange", "videos['" + playerId + "']['stateChangeListener']");
    ...
}

然后你可以通过闭包访问你想要的任何变量。理想情况下,我们可以只在 addEventListener() 中使用匿名函数,但由于 ActionScript/Javascript 桥的限制,这是不可能的。

受此讨论启发:http://groups.google.com/group/youtube-api-gdata/browse_thread/thread/e8a8c85b801b9e25

【讨论】:

    【解决方案3】:

    @allonde 的解决方案不再有效,因为 Adob​​e 对可用于 Flash 事件侦听器的字符施加了额外的限制。您不能再使用 [] 或 (),这使得以前有关此问题的解决方案已过时。这些字符将生成以下 javascript 错误:

    标识符在数字文字之后立即开始

    这是我的解决方案(使用句点字符):

    var players = {}; // global to keep track of all players on the page
    function onYouTubePlayerReady (idPlayer) {
       var ytPlayer = document.getElementById (idPlayer);
       var idPlayerParams = 'yt' + Math.floor (Math.random()*100000); // create random varable name
       players [idPlayerParams] = {
            idPlayer: idPlayer,
            onStateChanged: function (state) {
                alert ('youtube player state changed to: ' + state + ', player id: ' + idPlayer);
            },
            onError: function (err) {
                alert ('youtube player error: ' + err + ', player id: ' + idPlayer);
            }
        };
        ytPlayer.addEventListener ('onStateChange', 'players.' + idPlayerParams + '.onStateChanged');
        ytPlayer.addEventListener ('onError', 'players.' + idPlayerParams + '.onError');
    }
    

    【讨论】:

    • 注意:您需要在视频 URL 中指定 playerapiid 参数才能使此示例生效。对于此示例,playerapiid 应与视频的 object/embed 标记的 id 相同。
    猜你喜欢
    • 2013-02-08
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    相关资源
    最近更新 更多