我曾经从目标参数中提取视频,如下所示:
function onPlayerReady(event) {
var videoid = event.target.d.d.videoId;
var playerid = event.target.d.d.playerid;
// more stuff
}
不幸的是,这些似乎经常发生变化。我也用过
event.target.d.id
在改变之前。
我似乎无法找到如何持续获取这些信息。另外, d 代表什么?这是一种不考虑公众使用的调试变量吗?
目前我似乎在
下找到它event.target.B.videoData.video_id
编辑:根据建议的解决方案,我无法解决自定义属性。
当我用
实例化播放器时new YT.Player(playerid, {
videoId: videoid,
events: {
'onReady': onPlayerReady,
'onStateChange': onPlayerStateChange
},
playerid : playerid
});
我给它一些我需要的属性,这里是 playerid 属性。由于这不是本机属性,因此它不会出现在getVideoData()中。任何想法如何在对象中存储自定义数据并在以后一致地解决它?不过,我可以用缩小的临时信件来解决这个问题。
答案 0 :(得分:3)
你是对的,单个字母代表视频对象,但字母是根据最近在图书馆上运行的缩小来分配的。但是,有一种方法可以将对象放入自己的变量中;试试这个:
var videodata = event.target.getVideoData();
然后,您可以通过以下方式获取ID:
videodata.video_id
当涉及到您自己添加的其他属性时,很多都取决于您所包含的自定义数据。如果它只是创建的播放器元素的id,您可以使用event.target.getVideoEmbedCode()
返回一个iframe元素,该元素的ID是用于创建对象的playerID。但是其他任意数据都不会通过任何直接API方法公开。你总是可以循环遍历每个对象属性...... for (att in event.target)
...但是如果你需要的对象是多层深度的话,这将需要大量的递归。
如果是我,我不会将自定义数据存储在播放器对象中;我创建了一个包装器对象,它被键入视频ID,允许您添加尽可能多的对象参数:
var myplayers={};
function onYouTubeIframeAPIReady() {
myplayers["M7lc1UVf-VE"] = {"player":new YT.Player('player', {
height: '390',
width: '640',
videoId: 'M7lc1UVf-VE',
playerVars: {
'html5':'1',
'controls': '0'
},
events: {
'onReady': onPlayerReady,
'onStateChange': onPlayerStateChange
}
}),
"playerid":"player",
"otherdata":"whatever"
};
}
function onPlayerReady(event) {
console.log(myplayers[event.target.getVideoData().video_id]);
}
答案 1 :(得分:0)
如果可以帮助任何人,这就是我最终要解决的问题:
document.onPlayerReady = function(event) {
for( var item in event.target) {
if(event.target[item].id) {
var iFrameID = event.target[item].id;
...
break;
}
}
}