我使用许多YouTube播放器播放了一个HTML。
我正在怀疑onStateChange,以便在用户播放视频时收到通知。
function onYouTubePlayerReady(playerid) {
var player = document.getElementById("playerA");
player.addEventListener("onStateChange", "callback");
}
现在回调将newState作为参数。
function callback(newState) {
...
}
这只适用于一名玩家。 但是对于很多玩家来说,我如何才能知道哪位玩家举起了StateChange赛事呢?回调只有一个参数。
有没有办法知道哪个玩家提出了回调的事件,或者我必须为每个玩家设置不同的回调?
答案 0 :(得分:3)
以下是基于其他答案的解决方案:
(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。
答案 1 :(得分: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
答案 2 :(得分:1)
@ alalonde的解决方案不再起作用,因为Adobe对可用于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');
}