【问题标题】:Youtube iFrame API 'YT is undefined'Youtube iFrame API 'YT 未定义'
【发布时间】:2015-03-24 20:21:04
【问题描述】:

我正在尝试将此代码放入模块函数中:

$(document).ready(function()
    {
        VIDEO.onYouTubeIframeAPIReady();
}


        var VIDEO = (function (my, $){
var tag = document.createElement('script');
var onPlayerStateChange;
  tag.src = "https://www.youtube.com/iframe_api";
  var firstScriptTag = document.getElementsByTagName('script')[0];
  firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

  var player;


   my.onYouTubeIframeAPIReady =function() {
    player = new YT.Player('player', {
      height: '490',
      width: '880',
      videoId: SONG.getArtistId(),
      playerVars: { controls:1, showinfo: 0, rel: 0, showsearch: 0, iv_load_policy: 3 },
      events: {
        'onReady': onPlayerReady,
        'onStateChange': onPlayerStateChange,
        'onError': catchError
      }
    });
  }

  function onPlayerReady(event) {


  if(typeof(SONG.getArtistId()) == undefined)
  {
    console.log("undefineeeed"); 
  } 


    event.target.playVideo();   
  }

  var done = false;
  function onPlayerStateChange(event) {
    if (event.data == YT.PlayerState.PLAYING && !done) {
      // setTimeout(stopVideo, 6000);
      done = true;
    }
    if(event.data == YT.PlayerState.ENDED)
    {
      location.reload();
    }
  }

  function catchError(event)
  {
    if(event.data == 100) console.log("De video bestaat niet meer");
  }

  function stopVideo() {
    player.stopVideo();
  }

  return my;

}(VIDEO || {}, jQuery));

问题是:即使它是自动执行的,也没有任何反应,并且 iFrame 也没有显示。 我正在尝试这样做,因为它是作业的一部分。我们必须在模块中工作。

【问题讨论】:

  • 1.您没有将onYouTubeIframeAPIReady 函数连接到任何事件。 2. var VIDEOscript 标记之外声明 3. 您正在使用 Jquery 而没有在您的页面上引用它。
  • @avrahamcool 对不起,我粘贴了错误的代码。我编辑了我的帖子。 (我有一个使用 jQuery 的参考,这不是问题)我得到:'Uncaught ReferenceError: YT is not defined'
  • 创建一个演示问题的小提琴,它会更容易提供帮助。

标签: javascript iframe module youtube-api youtube-javascript-api


【解决方案1】:

你需要简化代码:

HTML

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

Javascript

$(document).ready( function() {
  console.log( "ready!" );
  loadPlayer();
});

function getArtistId() {
  return 'l-gQLqv9f4o';
}

function loadPlayer() { 
  if (typeof(YT) == 'undefined' || typeof(YT.Player) == 'undefined') {

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

    window.onYouTubePlayerAPIReady = function() {
      onYouTubePlayer();
    };

  } else {

    onYouTubePlayer();

  }
}

var player;

function onYouTubePlayer() {
  player = new YT.Player('player', {
    height: '490',
    width: '880',
    videoId: getArtistId(),
    playerVars: { controls:1, showinfo: 0, rel: 0, showsearch: 0, iv_load_policy: 3 },
    events: {
      'onStateChange': onPlayerStateChange,
      'onError': catchError
    }
  });
}

  var done = false;
  function onPlayerStateChange(event) {
    if (event.data == YT.PlayerState.PLAYING && !done) {
      // setTimeout(stopVideo, 6000);
      done = true;
    } else if (event.data == YT.PlayerState.ENDED) {
      location.reload();
    }
  }

  function onPlayerReady(event) {

    //if(typeof(SONG.getArtistId()) == undefined)
    //{
    //  console.log("undefineeeed"); 
    //} 
    //event.target.playVideo();   
  }
  function catchError(event)
  {
    if(event.data == 100) console.log("De video bestaat niet meer");
  }

  function stopVideo() {
    player.stopVideo();
  }

还有一个活生生的例子: http://jsbin.com/maweqahuhi/1/ http://jsbin.com/nipogicide/2/

编辑

关于您的评论,我对代码进行了一些更改。 稍后您需要使用onYouTubePlayerAPIReady() 调用播放器。我编辑了之前的所有代码。

【讨论】:

  • 是的,但是现在您没有将它放入模块中。这正是我需要的。
  • @RW24 从我在你的代码中看到的,你不需要模块,$(document).ready(function() 没用
  • document.ready 只是为了表明我从某个地方调用了该函数.. :)
  • 当文档准备好时,您调用一个函数来创建播放器。为什么要在文档准备好时调用函数来创建播放器?您可以默认加载播放器。这对我来说不是很清楚。
  • 我使用其他 API 来获取音乐台的播放歌曲。所以我需要确保 youtube 的 API 等到我得到那首歌。这就是为什么我想稍后调用该函数。你明白我的意思吗?
猜你喜欢
  • 2021-07-24
  • 1970-01-01
  • 2012-06-15
  • 2015-09-12
  • 1970-01-01
  • 2013-12-22
  • 2016-12-21
  • 2011-07-14
  • 1970-01-01
相关资源
最近更新 更多