6 javascript youtube youtube-api youtube-javascript-api
需要这个用于youtube api // onStateChange回调函数!
我想以编程方式创建将听取几个youtube播放器发出的"onStateChange"事件的函数.添加侦听器已经起作用:
function onYouTubePlayerReady(playerId) {
var ytpStateManager = playerId +"_StateManager";
document.getElementById(playerId).addEventListener("onStateChange", ytpStateManager );
...
Run Code Online (Sandbox Code Playgroud)
我需要根据playerId变量("ytp_1","ytp_2",...)创建的函数是
function ytpStateManager(newState) {
ytpStateHelper(playerId , newState);
}
Run Code Online (Sandbox Code Playgroud)
所以playerId"ytp_1"的结果如下所示:
function ytp_1_StateManager(newState) {
ytpStateHelper("ytp_1", newState);
}
Run Code Online (Sandbox Code Playgroud)
也工作但是现在我需要为每个玩家手动添加它们,这不是我需要的.我想在新玩家发送readyState事件时自动创建它们.
我的问题是,似乎这些函数需要是一个全局函数才能正常工作.我现在几天尝试了几种选择.我的问题是我不知道如何(如果有办法)定义一个全局函数,包括.功能名称,以编程方式,基于另一个变量.
令人失望的是,ytp不会发出包含状态和玩家/目标的事件.会让事情变得更容易.所有这些基本上都是解决方法,因为我需要所有的stateChanges做所有事情.
如果有更好/更简单的方法,请告诉我:)否则非常欢迎这个问题的解决方案.
也许有办法重新举办活动,让它更"易于接近"?
我在规范中读到.addEventListener也接受一个对象,所以我试图将事件绑定到一个专用对象.但同样,它没有被触发.感觉像我测试了一切......
更新 我现在切换到iframe播放器(来自swfobject),因为那个提供了一个包含playerId和state的事件:D Yeahhh !! 在错误的ytplayer度过了一周之后,这感觉就像是一次伟大的进步.似乎也希望我们使用iframe播放器,它可以在支持时动态使用html5.
您创建一个返回函数的函数:
function createStateManager(playerId) {
return function (newState) {
ytpStateHelper(playerId , newState);
}
}
Run Code Online (Sandbox Code Playgroud)
然后在设置事件侦听器时调用函数工厂:
var player = document.getElementById(playerId);
player.addEventListener("onStateChange", createStateManager(playerId));
Run Code Online (Sandbox Code Playgroud)
调试
我不确定为什么这不起作用,但这里有一个调试建议。我怀疑你可能没有得到playerId你的onYouTubePlayerReady处理程序。
function onYouTubePlayerReady(playerId) {
console.log('Player ready. The player id is: ' + playerId);
var ytpStateManager = playerId +"_StateManager";
var player = document.getElementById(playerId);
player.addEventListener("onStateChange", createStateManager(playerId));
}
function createStateManager(playerId) {
return function (newState) {
console.log('State changed for player ' + playerId + '. New state is ' + newState);
ytpStateHelper(playerId , newState);
}
}
Run Code Online (Sandbox Code Playgroud)
你能试试那个,然后发布你从两个console.log电话中得到的信息吗?