You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在无API情况下检测嵌入Iframe的YouTube视频播放结束?

检测嵌入YouTube视频播放完毕的实现方案

要搞定这个需求,得用到YouTube官方的Iframe Player API,这是最稳定可靠的方式,我给你一步步说清楚怎么做:

第一步:修改iframe的src,启用JS API支持

你原来的PHP输出代码里,iframe的src需要加上?enablejsapi=1参数,这样YouTube才允许JavaScript控制这个播放器。修改后的代码如下:

echo "<iframe width='50%' height='60%' id='cc' src='https://www.youtube.com/embed/" . $data_song[0] . "?enablejsapi=1' frameborder='1' allowfullscreen></iframe><br>";

如果之后需要加其他参数(比如自动播放、隐藏控制栏),用&连接就行,比如?enablejsapi=1&autoplay=1&controls=0

第二步:加载YouTube Iframe API脚本

在你的页面中(推荐放在<body>标签末尾,不阻塞页面加载)添加这个脚本,用来加载官方的API:

<script src="https://www.youtube.com/iframe_api"></script>

第三步:编写JS代码监听播放结束事件

YouTube API加载完成后,会自动调用名为onYouTubeIframeAPIReady的函数,我们就在这个函数里初始化播放器并绑定状态监听事件:

let player;

// API加载完成后自动触发这个函数
function onYouTubeIframeAPIReady() {
  // 通过你给iframe设置的id(cc)初始化播放器实例
  player = new YT.Player('cc', {
    events: {
      // 监听播放器状态变化
      'onStateChange': handlePlayerStateChange
    }
  });
}

// 状态变化时触发的回调函数
function handlePlayerStateChange(event) {
  // YT.PlayerState.ENDED 对应的数值是0,代表视频播放完毕
  if (event.data === YT.PlayerState.ENDED) {
    // 这里写视频播放完成后你要执行的逻辑,比如:
    alert('视频已经播放完啦!');
    // 示例:如果要通知后端,可以用fetch发送请求
    // fetch('/your-backend-endpoint', {
    //   method: 'POST',
    //   headers: { 'Content-Type': 'application/json' },
    //   body: JSON.stringify({ videoId: '" . $data_song[0] . "' })
    // });
  }
}

一些注意事项

  • 函数名onYouTubeIframeAPIReady不能随便改,这是API约定好的触发函数,改了就没法正常初始化了。
  • 不需要额外申请YouTube API密钥,只要启用了enablejsapi=1参数,监听状态变化这种基础功能就能正常使用。
  • 如果你的页面是通过AJAX动态加载这个iframe的,那需要手动调用初始化逻辑,而不是依赖自动触发的函数,但你现在是PHP直接输出的,所以不用操心这个。

内容的提问来源于stack exchange,提问作者Adam Šulc

火山引擎 最新活动