【问题标题】:JavaScript to listen for URL changes in YouTube HTML5 Player用于侦听 YouTube HTML5 播放器中 URL 更改的 JavaScript
【发布时间】:2014-08-09 11:30:46
【问题描述】:

我正在编写一个 Chrome 扩展程序,因此我需要能够监听 YouTube URL 中的变化(即,看到您切换了视频)。 YouTube 很难做到这一点,因为它的 HTML5 视频播放器没有完整的页面重新加载,没有 URL 片段更改(无法监听 hashchange 事件as other answers have suggested)。收听pushState 也不起作用。我花了很多时间在这里寻找关于 SO 的答案,到目前为止我看到的所有答案(除了一个——我真的不想使用)都不起作用。

我看到的唯一可行的答案是设置超时以每秒运行一次以查看 URL 是否更改(丑陋!)。

编辑:The possible duplicate question 是一个完全不同的问题——一个处理监听 URL 的问题,另一个处理加载扩展。

问题:如何在不进行轮询的情况下检测 YouTube 的 HTML5 视频播放器中的 URL 更改?

【问题讨论】:

标签: javascript html youtube


【解决方案1】:

我的解决方案是简单地检查 #progress 元素上的 transitionend 事件(这是显示在顶部的红色进度条)。

document.addEventListener('transitionend', function(e) {
    if (e.target.id === 'progress')
        // do stuff
});


更新:

更简洁的解决方案是只监听由spfjs 触发的spfdone 事件,YouTube 使用该框架来操纵推送状态。 Credit to Rob for the answer.

document.addEventListener('spfdone', function() {
    // do stuff
});

【讨论】:

  • 赞成,因为 'spfdone' 事件已被触发,但不幸的是,YouTube 的 new material design 上没有@
  • 我很好奇@Drazen,你开发了什么扩展?是否与新材料设计兼容?
  • 有趣。我还没有用新的材料设计测试它,所以不确定。 Here's the userscript I needed this for.
【解决方案2】:

我偶然发现了这个问题,所以也许这会对某人有所帮助。 我的诀窍是监听yt-page-data-updated 事件,该事件检测到视频开关。

我能够在页面更新时使用monitorEvents(document.body)getEventListeners(document.body) Chrome DevTools 命令对其进行检查。但请记住,它不适用于整页重新加载(通过直接访问 URL),因此我必须协调 load 事件,如下所示:

window.addEventListener('load', function () {
    console.log('load');
});

window.addEventListener('yt-page-data-updated', function () {
    console.log('url change');
});

【讨论】:

  • 我找到了yt-navigate-finish 事件,这似乎更合适,并且它也适用于整页重新加载,因此您不再需要load 事件!
【解决方案3】:

我不完全确定 Chrome 扩展如何实现这一点,但如果可行,onStateChange event 可能对您大有裨益。我对 YouTube API 很陌生,但这对我有用:

var player = document.getElementById('youtubeVideo');
player.addEventListener('onStateChange', function(e) {
  if (e.data === 1) {
    // Video started playing.
    // Should work for when the video changes as well.
    // As long as it's within the same element.
    console.log(player.getVideoUrl());
  }
  // Watch for other events?
});

【讨论】:

  • 这看起来很有希望。你能解释一下我将如何使用它吗?我是否需要在我的扩展程序中包含 YouTube JS API 脚本?看起来这段代码不能按原样放在 YouTube.com 页面中。
  • 在 YT 页面上运行,我看到 movie_player 而不是 youtubeVideoe.data 不存在,应该是 e === -1... 需要进一步测试,我只是在评论记录
猜你喜欢
  • 2015-08-11
  • 1970-01-01
  • 2020-12-05
  • 1970-01-01
  • 1970-01-01
  • 2013-04-22
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多