YouTube iframe 播放器 API - OnStateChange 未触发

IT技术 javascript youtube-api
2021-01-28 03:31:50

我实际上只是从 YouTube 开发人员页面YouTube Player API Reference for iframe Embeds 中复制并粘贴了代码(从标题“入门”下方)。唯一的区别是我在状态改变时添加了一个警报来触发,因为我认为我在 onPlayerStateChange 函数中做错了。

你可以在http://jsfiddle.net/jesMv/看到 jsFiddle

如前所述,它只是 YouTube 开发者页面中代码的精确副本,并添加了

alert('State Changed')

作为在 onPlayerStateChange 函数中触发的第一件事。

然而,什么也没有发生……无论我如何看待这个和我改变了什么,我都无法让 onStateChange 做任何事情。

我该如何解决这个问题?

2个回答

iFrame Player API 有一个临时问题(已于 2013 年 6 月修复),您可以在此处阅读:https : //code.google.com/p/gdata-issues/issues/detail?id=4706

Jeff Posnick 在此处发布了一个临时解决方法:http : //jsfiddle.net/jeffposnick/yhWsG/3/

作为临时修复,您只需要在 onReady 事件中添加事件侦听器:

function onReady() {
    player.addEventListener('onStateChange', function(e) {
        console.log('State is:', e.data);
    });
}

确保从 YT.PLAYER 构造函数中删除 onStateChange 事件(请参阅 jsfiddle)。

此外,正如有人在 Google Code Issue Thread 上提到的,您设置了一个时间间隔并轮询播放器的当前状态,而不是侦听 onStateChange 事件。这是用于执行此操作的示例代码片段:

setInterval( function() {
  var state = player.getPlayerState();
  if ( playerState !== state ) {
    onPlayerStateChange( {
      data: state
    });
  }
}, 10);

Firefox 和 IE 问题

其他人提到如果将 YouTube 播放器放置在具有 css 属性的容器中,Firefox 将不会实例化display: noneInternet Explorer 也不能与visibility: hidden. 如果您发现这是问题所在,请尝试使用类似left: -150%.

Steve Meisner 在这里谈到了这一点:YouTube API 似乎没有在 Firefox 中加载, IFrame 被加载,但是 onPlayerReady 事件从不触发?

另一个相关的 SO 问题:YouTube iframe API - onReady 和 onStateChanged 事件未在 IE9 中触发

编辑:我已经编辑了这个答案更彻底,因为在 2013 年修复原始错误后人们仍然看到这个错误。

2014 年,我看到了这个中断,并在大约 30 分钟后神秘地重新开始工作。此答案中给出的修复在损坏时对我不起作用。
2021-03-23 03:31:50
谢谢!我需要轮询解决方法来使这个工作......轮询函数的两个更新(为了完整起见): - 添加var playerState为第一行,以初始化变量 - 添加该行playerState = state,以跟踪新状态事件已触发。
2021-03-24 03:31:50
现在看来,我写的问题还没有解决(PT 时间 00.44)。
2021-04-09 03:31:50
就我而言,这不是解决方案(现在应该解决这个错误?)。display:none在视频的容器上,但 API 没有触发。更多信息:stackoverflow.com/a/22199021/406171
2021-04-11 03:31:50
如果您使用的是 iframe 而不是在 api 加载后被替换的 div,则可能无法正常工作
2021-04-12 03:31:50

onStateChange 不适用于任何版本的 Internet Explorer 或 Edge。我认为一旦 Microsoft 将 Edge 转移到基于 Chromium 的位置,它就会开始工作。但是无论是 IE9、11 还是 Edge,我都无法触发此事件,即使它在 Chrome 中完全触发,代码相同。