onYouTubeIframeAPIReady called once but multiple videos needed on a page

前端 未结 3 1075
猫巷女王i
猫巷女王i 2020-12-11 21:04

I am using a server-side method to drop in YouTube videos with playlists and functioning buttons (think of a website widget that can be called anyway on a page, and potentia

相关标签:
3条回答
  • 2020-12-11 21:15

    onYouTubeIframeAPIReady() is executed after YouTube API is ready to be used, that is after API's Javascript file http://www.youtube.com/iframe_api is loaded.

    You can create more players inside onYouTubeIframeAPIReady()

    var ytplayer1 = undef;
    var ytplayer2 = undef;
    
    function onYouTubeIframeAPIReady() {
        ytplayer1 = new YT.Player('player-youtube-1', {
            width: '640',
            height: '480',
            videoId: 'M7lc1UVf-VE'
        });
    
        ytplayer2 = new YT.Player('player-youtube-2', {
            width: '640',
            height: '480',
            videoId: 'smEqnnklfYs'
        });
    }
    

    Note that you need to declare ytplayer1 and ytplayer2 outside of onYouTubeIframeAPIReady() so you can use them later:

    ytplayer1.pauseVideo();
    ytplayer2.playVideo();
    
    0 讨论(0)
  • 2020-12-11 21:28

    I've implemented enqueueOnYoutubeIframeAPIReady function for adding callbacks to queue, so you can add as many callbacks as you want. It will fire the callback immediately if API is ready.

    (function () {
      var isReady = false
      var callbacks = []
    
      window.enqueueOnYoutubeIframeAPIReady = function (callback) {
        if (isReady) {
          callback()
        } else {
          callbacks.push(callback)
        }
      }
    
      window.onYouTubeIframeAPIReady = function () {
        isReady = true
        callbacks.forEach(function (callback) {
          callback()
        })
        callbacks.splice(0)
      }
    })()
    

    Usage:

    enqueueOnYoutubeIframeAPIReady(function () {
      var player = new YT.Player('player1', { ... })
    })
    
    // Second player
    enqueueOnYoutubeIframeAPIReady(function () {
      var player = new YT.Player('player2', { ... })
    })
    
    0 讨论(0)
  • 2020-12-11 21:40

    The way I solved this in the end was by allowing each server side widget included on the page to add the information to a global javascript array. They I used the onYouTubeIframeAPIReady() function to loop over that array to produce instantiate the YT players in turn.

    /* the Global array to hold all my stuff */
    var new_player_attributes = new Array();
    function onYouTubeIframeAPIReady() {
        for(key in new_player_attributes) {
            var player = new YT.Player(key, new_player_attributes[key]);
        }
    }
    

    How one goes about formatting this array is a trivial point. It is populated from javascript output to the document from the server side include. This function above and all the other generic utility functions that control the button etc are included only once. Only the definitions of the video parameters/playlist are the only bits included per interaction of the server side loop.

    0 讨论(0)
提交回复
热议问题