Youtube API 在重播时触发 onplayerstatechange 两次?

问题描述 投票:0回答:1

我注意到我正在处理的项目有一些奇怪的行为,所以我决定隔离我的变量并直接从 youtube iframe API 文档中获取基本代码,我仍然看到同样的事情。 当我的视频第一次播放时,一切都按预期进行。但是,如果我点击“重播”按钮,onPlayerStateChange(使用 event.data==1 /“播放”)将触发两次,一次又一次。 知道为什么会发生这种情况,以及如何让“播放”的“playerstatechange”在重播时只触发一次?

    <!DOCTYPE html>
<html>
  <body>
    <!-- 1. The <iframe> (and video player) will replace this <div> tag. -->
        <div id="player"></div>

    <script>
      // 2. This code loads the IFrame Player API code asynchronously.
      var tag = document.createElement('script');

      tag.src = "https://www.youtube.com/iframe_api";
      var firstScriptTag = document.getElementsByTagName('script')[0];
      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

      // 3. This function creates an <iframe> (and YouTube player)
      //    after the API code downloads.
      var player;
      function onYouTubeIframeAPIReady() {
        player = new YT.Player('player', {
          height: '390',
          width: '640',
          videoId: 'cOgj_5lYijo',
          events: {
            'onStateChange': onPlayerStateChange
          }
        });
      }

      // 5. The API calls this function when the player's state changes.
      function onPlayerStateChange(event) {
        if(event.data==1){
        console.log("onplayerstate change happening: ",event)}
      }

    </script>
  </body>
</html>

youtube-api youtube-iframe-api
1个回答
0
投票

我遇到了同样的问题,当我重播视频时,onPlay 触发了两次。 我尝试了不同的修复,要解决的主要问题是 iFrame 中的视频看不到组件的状态变化。

不过,视频本身是有状态可以使用的。 请注意,这是伪代码,这不是嵌入 YouTube 视频的方式,您需要添加 iFrame 等等,但我只想关注这里的解决方案。此外,它是一个 React 组件,但逻辑可以转换为其他框架。

我需要添加效果挂钩,因为触发我想要的功能在开关盒中不起作用。

您可以在这里找到 YouTube 视频的可能状态: https://developers.google.com/youtube/iframe_api_reference#onStateChange

我希望这可以帮助其他人节省我解决这个问题的时间 :) 非常欢迎对可能的改进发表评论!

import { useEffect, useState } from 'react'

const MyComponent = () => {
  const [isPlaying, setIsPlaying] = useState(false)

  const handleYouTubeStateChange = (youTubeState) => {
    switch (youTubeState) {
      case 1:
        if (isPlaying === false) {
          setIsPlaying(true)
        }
        break

      case 0:
      case 2:
        setIsPlaying(false)
        break

      default:
        break
    }
  }

  useEffect(() => {
    if (isPlaying) {
      console.log('trigger the desired functionality here')
    }
  }, [isPlaying])

  return
    <YouTube
      onStateChange={(state) => { handleYouTubeStateChange(state.data) }}
    />
}

export default MyComponent
© www.soinside.com 2019 - 2024. All rights reserved.