嵌入式YouTube视频结束后如何显示初始视频图像?

如何解决嵌入式YouTube视频结束后如何显示初始视频图像?

我正在使用YouTube嵌入式视频Javascript API暂停并查找刚刚结束的视频的开头,然后显示该视频的默认图像,所有这些都可以使用。但是,尽管我可以单击此默认图像来再次播放倒带的视频,但它不会显示带有向右指向的三角形的YouTube圆形框,该框告诉用户可以通过单击来再次播放视频。

如何使YouTube API用方框/三角形显示初始图像,而不是仅显示默认图像?

这是我当前正在使用的代码,在这里不起作用,但是在CodePen中可以正常工作:

var youTubePlayer;

//
// Hide videos' default imange and play the video
// again.
//

function imgClick( This ) {
  var $image = $( This );

  if( $image.css( 'display' ) !== 'none' ) {

    $image.css( { 'display' : 'none','z-index' : '-1' } );
    youTubePlayer.playVideo();

  }

  return false;
}

//
// YouTube Embedded Video JavaScript API Ready Handler
//
// Create the necessary event handler to capture when
// the video finishes playing to the end.
//

function onYouTubeIframeAPIReady() {
  'use strict';

  const ALLOWS = 'accelerometer; autoplay; ' +
                 'clipboard-write; ' +
                 'encrypted-media; gyroscope;  ' +
                 'picture-in-picture';
  var   iframe = document
                 .querySelector( 'iframe' +
                                 ':first-of-type' );

  var   suggestedQuality = 'tiny';
  var   name             = 'a_blank';

  //
  // Create an array from the URL,delimited by
  // / or ?,so the YouTube Video Id,each parameter
  // switch name and value goes into an erray element.
  //

  var   url_parameters =
            iframe.src
            .split( /\s*(\/embed\/|[?&=])\s*/ );
  
  //
  // Throw away the first element that is the URL
  // address up to,but not /embed/,and then if the
  // new first element is /embed/,then remove it,and
  // assign it to videoid.
  //

  var   videoid = ( ( url_parameters.shift(),url_parameters.shift() ===
                          '/embed/' )
                    ? url_parameters.shift()
                    : '' );

  //
  // Create the YouTube query parameters default
  // settings.
  //

  var   switches = {
                     'autohide' : 1,'autoplay' : 1,'cc_load_policy' : 0,'controls' : 0,'disablekb' : 1,'enablejsapi' : 1,'end' : 5000,'iv_load_policy' : 0,'modestbranding' : 1,'origin' :
                               window.location.origin,'rel': 0,'showinfo' :  0,'start' : 0,'widgetid' : 1
                   };

  var switches_str = '';

  //
  // Remove the ? and & elements from the url
  // parameters from the iframe's src attribute ...
  //

  url_parameters =
    url_parameters
    .filter( function( value ) {
              return ( ( value !== '?' ) &&
                       ( value !== '&' ) &&
                       ( value !== '=' ) );
             } );

  //
  // Update the switches array element values with the
  // values in the url parameters from the iframe src.
  //

  url_parameters
  .forEach( function ( key,index,array ) {
              var value;

              if( ( index % 2 ) == 0 ) {

                // Even: 0,2,4,...

                //
                // Assign the value as a string or
                // integer to the switches array.
                //

                value = array[ index + 1 ];

                switches[ key ] =
                  ( isNaN( value )
                    ? value
                    : parseInt( value ) );

              }

            } );

  iframe.setAttribute( 'allow',ALLOWS );

  //
  // Create a string of url parameter switches from
  // the switches array.
  //

  Object.entries( switches )
        .forEach( function ( entry,array ) {
                    const [ key,value ] = entry;

                    switches_str += ( ( index === 0 )
                                      ? '?'
                                      : '&' ) +
                                    key + '=' + value;

                  } );

  //
  // Assign the switches string to the src address
  // query parameter of the iframe ...
  //

  iframe.src = ( url_parameters.length
                 ? iframe.src.replace( /\?.*/,switches_str )
                 : iframe.src + switches_str );

  //
  // YouTube Error Handler
  //

  function onError( event ) {
    youTubePlayer
    .personalPlayer.errors.push( event.data );
  }

  //
  // YouTube Video Player state change handler ...
  // used to detect that the video has played
  // through to the end.
  //

  function onStateChange( event ) {
    var $image = $( iframe ).parent().find( 'img' );

    if( event.data === YT.PlayerState.ENDED ) {

      youTubePlayer.pauseVideo();
      youTubePlayer.seekTo( 0 );

      $image.css( { 'display' : 'block','z-index' : 100 } )
            .attr( 'src',$( 'img.image.default' )
                   .attr( 'src' ) );

    }
      
  }

  // Create the YouTube Player ...

  youTubePlayer =
    new YT.Player( 'YouTube-Player',{
                     videoId    : videoid,width      : iframe.clientWidth,height     : iframe.clientHeight,name       : name,playerVars : switches,events     : {
                                    'onError' :
                                    onError,'onStateChange' :
                                    onStateChange
                                  }
                   } );

  loadImages( videoid );

  //
  // Add an error tracker,which really isn't used in
  // this demo.
  //

  youTubePlayer.personalPlayer =
    { 'currentTimeSliding': false,'errors': [] };
}

function getImageSize( This ) {
  return This.src + '\r\n' +
         'Height: ' + This.naturalHeight + ' ' +
         'Width: ' + This.naturalWidth + '.';
}

function loadImages( videoid ) {
  var images = document
               .querySelectorAll( 'img.image' );

  images.forEach( function( value,array ) {
                    const YOUTUBE_IMAGE_URL =
                          'https://img.youtube.com' +
                          '/vi/';

                    var   className = value
                                      .classList[ 1 ];

                    switch( className ) {
                      case 'maxresdefault' :
                      case 'hqdefault'     :
                      case 'mqdefault'     :
                      case 'sddefault'     :
                      case 'default'       :
                      case '0'             :
                      case '1'             :
                      case '2'             :
                      case '3'             :

                        value.src =
                            YOUTUBE_IMAGE_URL +
                            videoid +
                            '/' + className + '.jpg';
                        break;
                      default              :
                        break;
                    }
                  } );
}

// Load the YouTube Embedded Video JavaScript API code

( function () {
    'use strict';

    function init() {  // Load YouTube library
      var tag = document.createElement( 'script' );

      tag.src = 'https://www.youtube.com/iframe_api';

      var first_script_tag =
            document
            .getElementsByTagName( 'script' )[ 0 ];

      first_script_tag
      .parentNode
      .insertBefore( tag,first_script_tag );

      // Set timer to display infos

    }

    if( window.addEventListener ) {

      window.addEventListener( 'load',init );

    }
    else if( window. attachEvent ) {

      window.attachEvent( 'onload',init );

    }
  } )();
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script>
<div style="position: relative;">
  <iframe id="YouTube-Player" width="400" height="300"
          src="https://www.youtube.com/embed/yG0oBPtyNb0"

          frameborder="0"></iframe>
  <img style="display: none;
              position: absolute;
              top: 0; left: 0; z-index: -1;
              width: 400px; height: 300px;
              background-color: transparent;"
       onclick="return imgClick( this );" />
</div>
<img class="image default" style="display: none;"
     onmouseover="this.title = getImageSize( this );" />

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res