如何在 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;
            }
        }
    }