API iframe проигрывателя YouTube: playVideo не работает в Firefox 9.0.1 - PullRequest
7 голосов
/ 15 февраля 2012

У меня есть код для встраивания YouTube (я буду вставлять только тот код, который доставляет мне неприятности, и вырезать вещи, которые не являются общедоступными):

console.log(ytplayer);
ytplayer.playVideo();

Console.log в Chrome и FFпоказывает хорошие объекты с правильными методами, и метод playVideo () существует там.И это работает для всех других браузеров, которые я проверял, но это не работает на FF !?Что еще более интересно, когда я воспроизводю видео с помощью обычной кнопки воспроизведения YouTube, я могу использовать метод pauseVideo () (и все остальные: поиск, управление громкостью), но я не могу использовать метод playVideo () ...

Я использую новый способ встраивания видео:

ytplayer = new YT.Player(player, {
        height: height,
        width: width,
        videoId: videoid,
        allowfullscreen: 'true',
        playerVars: {
            controls: 0,
            showinfo: 0,
            wmode: 'opaque',
            autoplay: (autoplay ? 1 : 0)
        },
        events: {
            'onReady': function () {
                console.log('I am ready');
            }
        }
    });

Конечно, «Я готов» находится в консольном выводе.Я понятия не имею, что я делаю неправильно и почему не работает только FF ... Нет ошибки JS, и нет никакой подсказки ... Надеюсь, у кого-то была эта проблема раньше и она была решена! :))

Ответы [ 4 ]

11 голосов
/ 13 марта 2012

У меня была очень похожая проблема, и я боролся с ответом.Мои вызовы playVideo (), похоже, не работали.

ORIGINAL:

$('#play_movie').click(function(){
    $('#video').show();
    if(player)
    {
        if(typeof player.playVideo == 'function')
        {
            player.playVideo();
        }
    }

Проблема заключалась в том, что плеер еще не был доступен - если я просто уделил ему немного временичтобы появиться, значит, звонок сработал

9 голосов
/ 28 августа 2014

Более надежный способ сделать это - проверить, готов ли игрок.Если проигрыватель не готов, поставьте в очередь player.playVideo () и выполните его, когда он будет готов, используя событие onReady. Гист

var playerConfig = {},                 // Define the player config here
    queue = {                          // To queue a function and invoke when player is ready
      content: null,
      push: function(fn) {
        this.content = fn;
      },
      pop: function() {
        this.content.call();
        this.content = null;
      }
    },
    player;

window.onYouTubeIframeAPIReady = function() {
  player = new YT.Player('player', {
    videoId: 'player',
    playerVars: playerConfig,
    events: {
      onReady: onPlayerReady
    }
  });
};

// API event: when the player is ready, call the function in the queue
function onPlayerReady() {
  if (queue.content) queue.pop();
}

// Helper function to check if the player is ready
function isPlayerReady(player) {
  return player && typeof player.playVideo === 'function';
}

// Instead of calling player.playVideo() directly, 
// using this function to play the video. 
// If the player is not ready, queue player.playVideo() and invoke it when the player is ready
function playVideo(player) {
  isPlayerReady(player) ? player.playVideo() : queue.push(function() {
                                               player.playVideo();
                                             });
} 
1 голос
/ 16 октября 2014

Я наткнулся на этот пост в поисках чего-то похожего. Я нашел свой ответ здесь, по relic180:

YouTube API - Firefox / IE возвращает ошибку «X не является функцией» для любого «игрока». запрос

По сути, Chrome может инициализировать встраивание YouTube, даже если div скрыты (т.е. display:none), но FF и IE не могут. Мое решение было вариантом relic180's:

Я перемещаю свой проигрыватель на left:200% или что-то еще, когда я хочу, чтобы он был невидимым, но инициализируется (и доступен для других вызовов на player), а затем возвращаю его обратно на экран, когда мне это нужно.

0 голосов
/ 16 апреля 2015

Я лично обнаружил в предустановленных IFrames, что API не будет работать должным образом, если вы не используете https://www.youtube.com в качестве домена. Так что будьте осторожны, чтобы не пропустить "www". В противном случае API создаст объект player, но не сможет выполнить методы.

...