【问题标题】:YouTube API loadVideoById startSeconds not workingYouTube API loadVideoById startSeconds 不起作用
【发布时间】:2013-08-16 20:45:50
【问题描述】:

我为我嵌入的一些 youtube 视频创建了一个章节选择器。这种方法曾经有效,但最近停止了。我不知道发生了什么事。

我使用他们推荐的格式,但使用 loadVideoById 来显示每一章

<div class="wrapper">

<div id="player"></div>

<script type="text/javascript">
  var tag = document.createElement('script');

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

  var player;
  function onYouTubeIframeAPIReady() {
    player = new YT.Player('player', {
      width: '625',
      videoId: 'FE5jN0rqMtM',
      events: {
        'onStateChange': onPlayerStateChange    
      },
      playerVars:{
        rel: 0,
        wmode: "opaque"
      }         
    });
  }

  function onPlayerStateChange(evt) {
    if (evt.data == 0) {
          $('#video_popup').removeClass('hide_pop');
          $('#video_popup').addClass('display_pop');
    }
    else if (evt.data == -1) {
          $('#video_popup').removeClass('display_pop');
          $('#video_popup').addClass('hide_pop');
    }
    else {
          $('#video_popup').removeClass('display_pop');
          $('#video_popup').addClass('hide_pop');
    }
  }

  function chapter1() {
       player.loadVideoById({'videoId': 'FE5jN0rqMtM', 'startSeconds': 0});
  }

  function chapter2() {
       player.loadVideoById({'videoId': 'FE5jN0rqMtM', 'startSeconds': 63});
  }

  function chapter3() {
      player.loadVideoById({'videoId': 'FE5jN0rqMtM', 'startSeconds': 135});
  }

</script>

<div id="video_popup" class="hide_pop">
    <div class="video_layover">
        <div class="promo">Thank you for watching!<br /><br /></div>
        <div class="link"><a href="javascript: chapter1();">Replay Video</a></div>
    </div>
</div>  


    <div style="margin: 0 auto 20px auto; width:625px; height:98px; text-align:center;">
    <ul class="player">

            <a href="javascript: chapter1();"><li>Chapter 1</li></a>


            <a href="javascript: chapter2();"><li>Chapter 2</li></a>


            <a href="javascript: chapter3();"><li>Chapter 3</li></a>

    </ul>
    </div>

【问题讨论】:

  • 当我点击每一章时,它对我来说都很好。它没有重新开始。
  • 您是在什么浏览器中查看的?我在家用计算机上再次尝试,但它在 Chrome 28.0.1500.95、FF 22.0 或 FF 23.0 中不起作用
  • 我在 Mac 上使用的是 28.0.1500.95 版,它可以工作。我在 Firefox 中尝试过,遇到了与您上面描述的相同的问题。奇怪。
  • 此错误已修复
  • 仍然不适合我..传递对象参数或列表参数...任何线索?

标签: iframe youtube youtube-api


【解决方案1】:

我猜这是一个错误,尽管我无法找到它的文档。如果你愿意,你可以report the bug

无论如何,我认为cueVideoById 是一种更好的方法,适用于所有浏览器: 示例:JS Bin

function chapter2() {      
  player.cueVideoById('FE5jN0rqMtM', 63); // BETTER WAY
  player.playVideo();
}

【讨论】:

  • 谜团加深。我将您的修复复制并应用到我的测试页面,但它不起作用,但是当我将 HTML 复制到 jsbin 时,它确实有效。那么jsbin和我的测试页有什么区别呢?代码完全相同。 jsbin.com/enedug/5/edit 有效,exceptionalsheet.com/examp.html 无效
  • 我会报告 API 错误:code.google.com/p/gdata-issues/issues/…
  • 我周五报告了。希望我能从他们那里听到一些关于它的消息,但很可能我不会。
  • 该错误的任何结果-您可以发布错误链接吗?
【解决方案2】:

如果您遇到类似“TypeError: ytPlayer.loadVideoById is not a function”的错误, 那么我相信你必须等待 onReady 事件触发。

这是我使用的示例代码(部分):

    var ytPlayer;
    var ytPlayerIsReady = false;


    // this methods only works if defined in the global scope !! 
    window.onYouTubeIframeAPIReady = function () {
        ytPlayer = new YT.Player('ytplayer', {
            playerVars: {
                enablejsapi: 1,
                controls: 0,
                fs: 1,
                autoplay: 1,
                rel: 0,
                showinfo: 0,
                modestbranding: 1
            },
            events: {
                onReady: onReady,
                onError: onError,
                onStateChange: onStateChange
            }
        });
    };


    // youtube code for calling the iframe api
    var tag = document.createElement('script');
    tag.src = "https://www.youtube.com/iframe_api";
    var firstScriptTag = document.getElementsByTagName('script')[0];
    firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);



    function onError(event) {
        console.log("error with code" + event.data);
    }

    function onStateChange(event) {
        console.log("change state to " + event.data);
    }

    function onReady(event) {
        ytPlayerIsReady = true;
        console.log("I'm ready");
    }


    window.myVideoPlayer = {
        init: function (options) {


            // some arbitrary code...
            // the trick is to fire options.callback,
            // which contains all the logic needed



            function timeout() {
                setTimeout(function () {
                    if (false === ytPlayerIsReady) {
                        timeout();
                    }
                    else {
                        if (options.callback) {
                            options.callback();
                        }
                    }
                }, 1000);
            }
            timeout();
        }
    };


    myVideoPlayer.init({
        callback: function(){
            // now the youtube api is ready, you should be able to call
            // loadVideoById without problems (at least it worked for me)



            // ytPlayer.removeEventListener('onStateChange');
            // ytPlayer.addEventListener('onStateChange', '_myYtPlayerOnChange');
            // ytPlayer.loadVideoById({
            //        videoId: 'xxxx',
            //        startSeconds: 12
            //    });

        }
    });

【讨论】:

  • 我的现在可以工作了,我已经发布了一条消息说这个错误已经解决但是一个mod删除了它......
【解决方案3】:

在调用 loadVideoById 之前,你需要确保 var player 已经准备好

If(player != null)

{ loadVideoById .. }

【讨论】:

    猜你喜欢
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 2016-08-07
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    相关资源
    最近更新 更多