YouTube iframe 播放器 API - OnStateChange 未触发

Posted

技术标签:

【中文标题】YouTube iframe 播放器 API - OnStateChange 未触发【英文标题】:YouTube iframe player API - OnStateChange not firing 【发布时间】:2013-06-09 07:24:47 【问题描述】:

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

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

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

alert('State Changed')

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

然而,什么都没有发生...无论我如何看待这个以及我改变了什么,我根本无法让 onStateChange 做任何事情。

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

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 代码问题线程中提到的那样,您设置了一个间隔并轮询播放器的当前状态,而不是监听 onStateChange 事件。这是一个示例代码 sn-p 用于执行此操作:

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

Firefox 和 IE 问题

其他人提到,如果将 YouTube 播放器放置在具有 css 属性 display: none 的容器中,Firefox 将不会实例化它。 Internet Explorer 也不适用于visibility: hidden。如果您发现这是问题所在,请尝试使用 left: -150% 之类的内容将容器置于页面之外。

Steve Meisner 在这里谈到这个:YouTube API does not appear to load in Firefox, IFrame gets loaded , but the onPlayerReady event never fires?

还有另一个相关的 SO 问题:YouTube iframe API - onReady and onStateChanged events not firing in IE9

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

【讨论】:

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

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

【讨论】:

以上是关于YouTube iframe 播放器 API - OnStateChange 未触发的主要内容,如果未能解决你的问题,请参考以下文章

需要使用 iFrame API 隐藏 YouTube 品牌

如何自动播放静音的 Youtube 视频 (IFrame API)?

使用 Youtube API 找到刚刚播放完的 Youtube iframe 的父 div

Safari 移动版 - youtube iframe api - 自动播放

视频取消静音时无法通过 iframe API 播放 YouTube 视频

带有 AJAX 和自动播放/排队的 Youtube iframe API