在 jQuery 中加载 YouTube API

Posted

技术标签:

【中文标题】在 jQuery 中加载 YouTube API【英文标题】:Loading YouTube API in jQuery 【发布时间】:2013-08-10 22:45:21 【问题描述】:

我正在尝试加载 YouTube 的 iframe API。到目前为止,我要做的就是制作和加载播放器。它似乎加载了 API,但随后无法将“YT.Player()”识别为构造函数。在 chrome js 控制台中,我在该行遇到的确切错误是:

    Uncaught TypeError: undefined is not a function 

那么...我到底做错了什么?我已经在这件事上抛出了 console.log 语句,并尝试用几种方式重写它。我尝试将 api 复制到本地文件中。我试过用常规脚本标签加载它。我尝试使用他们在https://developers.google.com/youtube/iframe_api_reference 的 api 参考中使用的古怪 DOM 修改来加载它。我很确定下面的代码应该可以工作:

    function youtubeAPIReady(script, textStatus, jqXHR)
    
        player = new YT.Player('player', 
            height: '390',
            width: '640',
            videoId: 'CxTtN0dCDaY'
        );
    

    function readyFunction()
    
        $.getScript("https://www.youtube.com/iframe_api", youtubeAPIReady);
    

    jQuery(document).ready(readyFunction);

有什么帮助吗?

【问题讨论】:

【参考方案1】:

我不能代表 jQuery 解决方案,但请尝试使用标准的 javascript。在任何情况下,您都不必等待加载文档(此代码应位于 $(document).ready() 之外)

// Load the YouTube API 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);

// Create the player object when API is ready
var player;
window.onYouTubeIframeAPIReady = function () 
    player = new YT.Player('player', 
        height: '390',
        width: '640',
        videoId: 'CxYyN0dCDaY'
    );
;

【讨论】:

引用api.jquery.com/jQuery.getScript: The callback is fired once the script has been loaded but not necessarily executed. 在您调用YT.Player() 时,API 可能尚未运行 所以,我真正需要做的就是使用 onYouTubeAPIFrameReady 函数。我仍然想使用 getScript 来加载数据,因为那个 DOM 修改是愚蠢的,但是如果您将该评论作为单独的答案提交,我会将其标记为正确。 另外,我现在得到:“”“阻止了原点为“youtube.com”的帧访问原点为“danhakimi.com”的帧。请求访问的帧的协议为“ https",被访问的帧的协议是"http"。协议必须匹配。"""那是什么意思? 这是一个已知的铬问题,请参阅code.google.com/p/chromium/issues/detail?id=17325【参考方案2】:

您可以借用used in YouTube Direct Lite 的技术来延迟加载 JavaScript,直到明确需要它:

var player = 
  playVideo: function(container, videoId) 
    if (typeof(YT) == 'undefined' || typeof(YT.Player) == 'undefined') 
      window.onYouTubeIframeAPIReady = function() 
        player.loadPlayer(container, videoId);
      ;

      $.getScript('//www.youtube.com/iframe_api');
     else 
      player.loadPlayer(container, videoId);
    
  ,

  loadPlayer: function(container, videoId) 
    new YT.Player(container, 
      videoId: videoId,
      width: 356,
      height: 200,
      playerVars: 
        autoplay: 1,
        controls: 0,
        modestbranding: 1,
        rel: 0,
        showInfo: 0
      
    );
  
;

【讨论】:

我觉得这可能会导致调用 getScript 的次数过多。 但根据源代码控制存储库,这是一个 google 拥有的项目。他们不知道自己在做什么吗?【参考方案3】:

引用http://api.jquery.com/jQuery.getScript/

脚本加载后触发回调,但未加载 必须执行。

在您调用 YT.Player() 时,API 可能尚未运行

【讨论】:

iframe_api JS 已加载并执行,但它可能只是播放器本身的异步加载器。播放器没有立即准备好,您必须使用其他答案之一的代码来延迟您对YT.Player 的使用。【参考方案4】:

穷人的解决办法,但是……

function readyYoutube()
    if((typeof YT !== "undefined") && YT && YT.Player)
        player = new YT.Player('player', 
            ...
        );
    else
        setTimeout(readyYoutube, 100);
    

【讨论】:

这是一个很好的解决方案。但是没有为我定义 YT,所以我这样做了: if(typeof YT !== "undefined" && YT && YT.Player)【参考方案5】:

我通过结合 Simon 和 user151496 的方法解决了这个问题。

代码:

<script>
    // load 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);

    // define player
    var player;
    function onYouTubeIframeAPIReady() 
        player = new YT.Player('player', 
            height: '360',
            width: '640'
        );
    

    $(function () 

       // load video and add event listeners
       function loadVideo(id, start, end) 
          // check if player is defined
          if ((typeof player !== "undefined")) 
            // listener for player state change
            player.addEventListener('onStateChange', function (event) 
                if (event.data == YT.PlayerState.ENDED) 
                    // do something
                
            );
            // listener if player is ready (including methods, like loadVideoById
            player.addEventListener('onReady', function(event)
                event.target.loadVideoById(
                    videoId: id,
                    startSeconds: start,
                    endSeconds: end
                );
                // pause player (my specific needs)
                event.target.pauseVideo();
            );
        
        // if player is not defined, wait and try again
        else 
            setTimeout(loadVideo, 100, id, start, end);
        
      

      // somewhere in the code
      loadVideo('xxxxxxxx', 0, 3);
      player.playVideo();
   );
</script>

【讨论】:

【参考方案6】:

从浏览器中删除添加块,然后重试。它对我有用。

【讨论】:

以上是关于在 jQuery 中加载 YouTube API的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Youtube API 在 RecyclerView 中加载 Youtube 缩略图

让 youtube.com 在 iF​​rame 中加载

在 WebView 中加载 YouTube 视频时,全屏选项不可用

在 Elementor 中加载 youtube 视频时暂停音频播放器

Chrome 扩展程序未在 YouTube 的浏览器导航中加载

在Wordpress中加载jQuery