Инициализировать API YouTube для целевого iframe, загруженного ajax

#ajax #video #youtube #youtube-api #video-player

#ajax #Видео #YouTube #youtube-api #видеопроигрыватель

Вопрос:

я впервые работаю с API Youtube, и после того, как я выполнил большинство задач, у меня возникла последняя проблема, которую я, похоже, не могу решить, поэтому я был бы признателен, если бы вы уделили несколько минут помощи. Вот это происходит простыми словами:

  • У меня есть слайдер видео (карусель). Под основным видео находятся эскизы других связанных видео (это сайт: kushtube.com )
  • когда я нажимаю на соответствующую миниатюру видео, основной контент проигрывателя загружается через AJAX

Чего я хотел в конечном итоге добиться, так это того, что когда текущее видео заканчивается, автоматически начинает воспроизводиться следующий vicdo. Теперь, после того, как я проделал некоторую работу, мне удалось заставить его работать таким образом, НО он работает только при загрузке страницы…

Если я нажму на одну из связанных миниатюр видео, содержимое проигрывателя загрузится через AJAX, и, похоже, я не могу повторно инициализировать API Youtube для настройки нового проигрывателя с загрузкой ajax.

Это мой текущий код:

 <script>
// global variable for the player
var player;

function ytInit(){
  // create the global player from the specific iframe (#video)
  player = new YT.Player('test', {
    events: {
      // call this function when player is ready to use
      'onReady': onPlayerReady,
      'onStateChange': onPlayerStatusChange
    }
  });
}

// this function gets called when API is ready to use
function onYouTubeIframeAPIReady() { 
    ytInit();
}

jQuery(document).ready( function($){
    jQuery('ul.carousel-list li').click( function(){
        ytInit();
        jQuery('ul.carousel-list li.active').removeClass('active'); 
    });
});

function onPlayerStatusChange(event) {
    /* video status
    ----------------
    -1 (unstarted)
     0 (ended)
     1 (playing)
     2 (paused)
     3 (buffering)
     5 (video cued)
    */
    console.log( event );
    if( event.data == 0 ){

        var thisLI = jQuery('ul.carousel-list li.active');              //get active slider item
        var thisLINext = jQuery('ul.carousel-list li.active').next();   //get next slider item      
        var nextVideoCode = thisLINext.attr('video_code');              //get next video code
        var nextVideoTitle = thisLINext.attr('video_title');                //get next video code
        var nextVideoUrl = thisLINext.attr('video_url');                //get next video code

            thisLINext.addClass('active');                              //activate next slider item
            thisLI.removeClass('active');                               //deactivate current cslider item

            //load next video
            player.loadVideoById(nextVideoCode);

        //update video title in header
        jQuery('.entry-header h1.entry-title a').attr('href', decodeURIComponent(nextVideoUrl)).text(decodeURIComponent(nextVideoTitle)); 

    }
}

function onPlayerReady(event) {

  // bind events
  var playButton = document.getElementById("play-button");
  playButton.addEventListener("click", function() {
    player.playVideo();
  });

  var pauseButton = document.getElementById("pause-button");
  pauseButton.addEventListener("click", function() {
    player.pauseVideo();
  });

}

// Inject YouTube API script
var tag = document.createElement('script');
tag.src = "//www.youtube.com/player_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
</script>
 

У вас есть какие-либо полезные предложения? Я был бы очень признателен.

Комментарии:

1. Вы имеете в виду миниатюры, которые отображаются под любым видеоконтентом, таким как kushtube.com/2014/07/01/people-who-just-had-sex-brian-and-john

2. Если это так, я думаю, вы можете просто заменить URL-адрес в iframe на соответствующий URL-адрес YouTube, который идет вместе с миниатюрой. Я предполагаю, что у вас есть способ получить URL-адреса YouTube на основе ссылки на миниатюру, поэтому используйте это. Пока для параметра autoplay установлено значение 1, я бы ожидал, что он начнет воспроизводиться. Это может не сработать, но, вероятно, стоит попробовать.

Ответ №1:

Вызов ytInit() при нажатии кнопки <li> создает новый объект player. Я думаю, это не совсем то, что вы хотите.

Вы пробовали:

 jQuery('ul.carousel-list li').click( function(){
    // ytInit();
    // just load the video from the "video_code" attr
    player.loadVideoById(this.getAttribute('video_code'));
    jQuery('ul.carousel-list li.active').removeClass('active'); 
});
 

Если это не происходит автозапуск, то вам, возможно, придется дождаться YT.PlayerState.CUED события (т.Е. 5 ) в прослушивателе событий изменения статуса вашего плеера, чтобы запустить проигрыватель.

Комментарии:

1. Я думаю, вы не поняли мой вопрос. Когда я нажимаю на миниатюру, видео загружается и воспроизводится. Теперь я хочу, чтобы после воспроизведения этого видео следующее видео загружалось автоматически. Я пока не смог решить эту проблему.

2. Вы когда-нибудь видели YT.PlayerState.ENDED event ( if( event.data == 0 ){ )? Кроме того, когда вы нажимаете на один из эскизов, он ytInit() снова запускается?

3. Я вижу состояния проигрывателя только в том случае, если пользователь еще не нажал ни на один из эскизов (например, только если страница загружена, и они сразу же загружают основное видео — без нажатия на какие-либо эскизы).

4. кстати, вы можете видеть состояния игроков из консоли разработчика, если вы посещаете kushtube.com