如何在 onPlayerReady 的参数中获取 videoid
How to get the videoid in onPlayerReady's argument
我曾经从 target 参数中提取 videoid 如下:
function onPlayerReady(event) {
var videoid = event.target.d.d.videoId;
var playerid = event.target.d.d.playerid;
// more stuff
}
不幸的是,这些似乎经常更改。我也用过
event.target.d.id
更改前。
我似乎找不到如何始终如一地获取此信息的方法。另外,d 代表什么? public 不考虑使用那种调试变量吗?
目前我好像在
下找到了
event.target.B.videoData.video_id
编辑:尽管使用建议的解决方案我无法解决自定义属性问题。
当我用
实例化播放器时
new YT.Player(playerid, {
videoId: videoid,
events: {
'onReady': onPlayerReady,
'onStateChange': onPlayerStateChange
},
playerid : playerid
});
我给它一些我需要的属性,这里是 playerid 属性。由于这不是原生 属性,因此它不会出现在 getVideoData() 中。知道如何在对象中存储自定义数据并在以后一致地处理它吗?不过,我可以用缩小版的临时字母来解决这个问题 属性。
你是对的,单个字母代表视频对象,但这些字母是根据库中最近 运行 可能进行的任何缩小分配的。但是,您可以执行一种方法,将对象放入您自己的变量之一;试试这个:
var videodata = event.target.getVideoData();
然后,您可以通过以下方式获取 ID:
videodata.video_id
当涉及到您自己添加的其他属性时,很大程度上取决于您包含的自定义数据。如果它只是创建的播放器的元素 pf 的 ID,您可以使用 event.target.getVideoEmbedCode()
到 return 一个 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]);
}
如果它对任何人有帮助,这就是我最终采用的方法:
document.onPlayerReady = function(event) {
for( var item in event.target) {
if(event.target[item].id) {
var iFrameID = event.target[item].id;
...
break;
}
}
}
我曾经从 target 参数中提取 videoid 如下:
function onPlayerReady(event) {
var videoid = event.target.d.d.videoId;
var playerid = event.target.d.d.playerid;
// more stuff
}
不幸的是,这些似乎经常更改。我也用过
event.target.d.id
更改前。
我似乎找不到如何始终如一地获取此信息的方法。另外,d 代表什么? public 不考虑使用那种调试变量吗?
目前我好像在
下找到了event.target.B.videoData.video_id
编辑:尽管使用建议的解决方案我无法解决自定义属性问题。
当我用
实例化播放器时new YT.Player(playerid, {
videoId: videoid,
events: {
'onReady': onPlayerReady,
'onStateChange': onPlayerStateChange
},
playerid : playerid
});
我给它一些我需要的属性,这里是 playerid 属性。由于这不是原生 属性,因此它不会出现在 getVideoData() 中。知道如何在对象中存储自定义数据并在以后一致地处理它吗?不过,我可以用缩小版的临时字母来解决这个问题 属性。
你是对的,单个字母代表视频对象,但这些字母是根据库中最近 运行 可能进行的任何缩小分配的。但是,您可以执行一种方法,将对象放入您自己的变量之一;试试这个:
var videodata = event.target.getVideoData();
然后,您可以通过以下方式获取 ID:
videodata.video_id
当涉及到您自己添加的其他属性时,很大程度上取决于您包含的自定义数据。如果它只是创建的播放器的元素 pf 的 ID,您可以使用 event.target.getVideoEmbedCode()
到 return 一个 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]);
}
如果它对任何人有帮助,这就是我最终采用的方法:
document.onPlayerReady = function(event) {
for( var item in event.target) {
if(event.target[item].id) {
var iFrameID = event.target[item].id;
...
break;
}
}
}