Я хочу иметь возможность контролировать плееры YouTube на основе iframe. Эти игроки уже будут в HTML, но я хочу контролировать их через JavaScript API.
Я читал документацию по API iframe, в которой объясняется, как добавить новое видео на страницу с помощью API, а затем управлять им с помощью функций проигрывателя YouTube:
var player;
function onYouTubePlayerAPIReady() {
player = new YT.Player('container', {
height: '390',
width: '640',
videoId: 'u1zgFlCw8Aw',
events: {
'onReady': onPlayerReady,
'onStateChange': onPlayerStateChange
}
});
}
Этот код создает новый объект player и назначает его «player», а затем вставляет его в div #container. Тогда я могу работать на «игрок» и вызов playVideo()
, pauseVideo()
и т.д. на нем.
Но я хочу иметь возможность работать с игроками iframe, которые уже есть на странице.
Я мог бы сделать это очень легко с помощью старого метода встраивания, что-то вроде:
player = getElementById('whateverID');
player.playVideo();
Но это не работает с новыми фреймами. Как я могу назначить объект iframe уже на странице и затем использовать функции API на нем?
источник
Ответы:
Скриптовые ссылки: Исходный код - Предварительный просмотр - Маленькая версия
Обновление: эта небольшая функция будет выполнять код только в одном направлении. Если вам нужна полная поддержка (например, прослушиватели / получатели событий), взгляните на Listening for Youtube Event в jQuery
В результате глубокого анализа кода я создал функцию:
function callPlayer
запрашивает вызов функции для любого видео на YouTube с кадрами. См. Ссылку YouTube Api, чтобы получить полный список возможных вызовов функций. Прочитайте комментарии в исходном коде для объяснения.17 мая 2012 года размер кода был удвоен, чтобы позаботиться о состоянии готовности игрока. Если вам нужна компактная функция, которая не связана с состоянием готовности проигрывателя, см. Http://jsfiddle.net/8R5y6/ .
Использование:
Возможные вопросы (и ответы):
Q : это не работает!
A : «Не работает» не является четким описанием. Вы получаете какие-либо сообщения об ошибках? Пожалуйста, покажите соответствующий код.
Q :
playVideo
не воспроизводит видео.A : Воспроизведение требует взаимодействия с пользователем и наличия
allow="autoplay"
на iframe. См. Https://developers.google.com/web/updates/2017/09/autoplay-policy-changes и https://developer.mozilla.org/en-US/docs/Web/Media/Autoplay_guide.Q : Я добавил видео на YouTube,
<iframe src="http://www.youtube.com/embed/As2rZGPGKDY" />
но эта функция не выполняет никаких функций! : Вы должны добавить в конце вашего URL: .?enablejsapi=1
/embed/vid_id?enablejsapi=1
Q : Я получаю сообщение об ошибке «Указана неверная или недопустимая строка». Зачем?
A : API не работает должным образом на локальном хосте (
file://
). Разместите свою (тестовую) страницу в Интернете или используйте JSFiddle . Примеры: см. Ссылки в верхней части этого ответа.Q : Как вы узнали это?
О : Я потратил некоторое время на ручную интерпретацию источника API. Я пришел к выводу, что я должен был использовать
postMessage
метод. Чтобы узнать, какие аргументы передать, я создал расширение Chrome, которое перехватывает сообщения. Исходный код расширения можно скачать здесь .Q : Какие браузеры поддерживаются?
A : Каждый браузер, который поддерживает JSON и
postMessage
.document.readyState
был реализован в 3.6)Соответствующий ответ / реализация: добавление видео в рамке с помощью
полной поддержки jQuery API: прослушивание события Youtube в
официальном API jQuery : https://developers.google.com/youtube/iframe_api_reference
Лист регистраций изменений
Реализовано
onYouTubePlayerReady
:callPlayer('frame_id', function() { ... })
.Функции автоматически ставятся в очередь, когда игрок еще не готов.
Обновлен и успешно протестирован в поддерживаемых браузерах (смотри вперед).
callPlayer
проверку готовности. Это необходимо, потому что когдаcallPlayer
вызывается сразу после вставки iframe, когда документ готов, он не может точно знать, что iframe полностью готов. В Internet Explorer и Firefox этот сценарий приводил к слишком раннему вызовуpostMessage
, который игнорировался.&origin=*
в URL.&origin=*
по URL.источник
PostMessage
Метод основан на API YT JS (?enablejsapi=1
). Без включения JS APIpostMessage
метод не будет ничего делать. См. Связанный ответ для простой реализации прослушивателей событий. Я также создал, но не опубликовал читаемый код для связи с фреймом. Я решил не публиковать его, поскольку его эффект аналогичен стандартному API кадров YouTube.playVideo
, поэтому я рекомендую использовать официальный API для этого. См. Developers.google.com/youtube/iframe_api_reference#Events .Похоже, YouTube обновил свой JS API, поэтому он доступен по умолчанию! Вы можете использовать существующий идентификатор iframe на YouTube ...
... в вашем JS ...
... и конструктор будет использовать ваш существующий iframe вместо его замены новым. Это также означает, что вам не нужно указывать videoId для конструктора.
Смотрите раздел Загрузка видеоплеера
источник
event
илиcommand
отправить в YT iframe, чтобы остановитьlistening
статус?Вы можете сделать это с гораздо меньшим количеством кода:
Рабочий пример: http://jsfiddle.net/kmturley/g6P5H/296/
источник
Моя собственная версия приведенного выше кода Ким Т, которая сочетается с некоторыми jQuery и позволяет нацеливать определенные фреймы.
источник
OnStateChange
: developers.google.com/youtube/iframe_api_reference#EventsСпасибо Rob W за ваш ответ.
Я использую это в приложении Cordova, чтобы избежать необходимости загружать API и чтобы я мог легко контролировать iframes, которые загружаются динамически.
Я всегда хотел иметь возможность извлекать информацию из iframe, такую как состояние (getPlayerState) и время (getCurrentTime).
Роб В помог нам осветить, как работает API с использованием postMessage, но, конечно, это только отправляет информацию в одном направлении с нашей веб-страницы в iframe. Доступ к получателям требует от нас прослушивания сообщений, отправленных нам из iframe.
Мне потребовалось некоторое время, чтобы выяснить, как настроить ответ Роба В., чтобы активировать и прослушать сообщения, возвращаемые iframe. Я в основном искал исходный код в iframe YouTube, пока не нашел код, отвечающий за отправку и получение сообщений.
Ключ изменял «событие» на «прослушивание», это в основном давало доступ ко всем методам, которые были предназначены для возврата значений.
Ниже приведено мое решение, обратите внимание, что я переключился на «прослушивание» только при запросе геттеров, вы можете изменить условие, добавив дополнительные методы.
Также обратите внимание, что вы можете просмотреть все сообщения, отправленные из iframe, добавив console.log (e) в window.onmessage. Вы заметите, что после активации прослушивания вы будете получать постоянные обновления, которые включают текущее время видео. Вызов геттеров, таких как getPlayerState, активирует эти постоянные обновления, но отправит сообщение с состоянием видео, только когда состояние изменилось.
источник