Chcę mieć możliwość kontrolowania odtwarzaczy YouTube opartych na elementach iframe. Te odtwarzacze będą już w HTML, ale chcę kontrolować je przez JavaScript API.
Czytałem dokumentację dotyczącą iframe API, która wyjaśnia, jak dodać nowy film do strony za pomocą API, a następnie sterować nim za pomocą funkcji odtwarzacza YouTube:
var player;
function onYouTubePlayerAPIReady() {
player = new YT.Player('container', {
height: '390',
width: '640',
videoId: 'u1zgFlCw8Aw',
events: {
'onReady': onPlayerReady,
'onStateChange': onPlayerStateChange
}
});
}
Ten kod tworzy nowy obiekt gracza i przypisuje go do „gracza”, a następnie wstawia go do elementu div #container. Wtedy mogę działać na „gracza” i zaproszenia playVideo()
, pauseVideo()
itp na nim.
Ale chcę mieć możliwość obsługi odtwarzaczy iframe, które są już na stronie.
Mógłbym to bardzo łatwo zrobić za pomocą starej metody osadzania, z czymś takim:
player = getElementById('whateverID');
player.playVideo();
Ale to nie działa z nowymi ramkami iframe. Jak mogę przypisać obiekt iframe już na stronie, a następnie użyć na nim funkcji API?
źródło
Odpowiedzi:
Fiddle Links: Kod źródłowy - Podgląd - Mała wersja
Aktualizacja: Ta mała funkcja wykonuje kod tylko w jednym kierunku. Jeśli chcesz mieć pełne wsparcie (np. Nasłuchujący / pobierający zdarzenia), spójrz na Listening for Youtube Event w jQuery
W wyniku dogłębnej analizy kodu utworzyłem funkcję:
function callPlayer
żąda wywołania funkcji w dowolnym obramowanym filmie YouTube. Zobacz odniesienie do interfejsu API YouTube, aby uzyskać pełną listę możliwych wywołań funkcji. Przeczytaj komentarze w kodzie źródłowym, aby uzyskać wyjaśnienie.17 maja 2012 r. Podwojono rozmiar kodu, aby zadbać o stan gotowości gracza. Jeśli potrzebujesz kompaktowej funkcji, która nie radzi sobie ze stanem gotowości odtwarzacza, zobacz http://jsfiddle.net/8R5y6/ .
Stosowanie:
Możliwe pytania (i odpowiedzi):
P : To nie działa!
Odp . : „Nie działa” nie jest jasnym opisem. Czy otrzymujesz komunikaty o błędach? Proszę pokazać odpowiedni kod.
P :
playVideo
nie odtwarza wideo.O : Odtwarzanie wymaga interakcji użytkownika i obecności
allow="autoplay"
w elemencie iframe. Zobacz https://developers.google.com/web/updates/2017/09/autoplay-policy-changes i https://developer.mozilla.org/en-US/docs/Web/Media/Autoplay_guideP : Osadziłem film z YouTube za pomocą,
<iframe src="http://www.youtube.com/embed/As2rZGPGKDY" />
ale ta funkcja nie wykonuje żadnej funkcji! : Trzeba dodać na końcu adresu URL: .?enablejsapi=1
/embed/vid_id?enablejsapi=1
P : Otrzymuję komunikat o błędzie „Określono nieprawidłowy lub niedozwolony ciąg znaków”. Czemu?
Odp . : API nie działa poprawnie na lokalnym hoście (
file://
). Hostuj swoją (testową) stronę online lub użyj JSFiddle . Przykłady: Zobacz linki u góry tej odpowiedzi.P : Skąd o tym wiedziałeś?
Odp . : Spędziłem trochę czasu, aby ręcznie zinterpretować źródło API. Doszedłem do wniosku, że muszę użyć tej
postMessage
metody. Aby wiedzieć, które argumenty przekazać, stworzyłem rozszerzenie Chrome, które przechwytuje wiadomości. Kod źródłowy rozszerzenia można pobrać tutaj .P : Jakie przeglądarki są obsługiwane?
O : Każda przeglądarka obsługująca JSON i
postMessage
.document.readyState
został zaimplementowany w 3.6)Powiązana odpowiedź / implementacja: Zanikaj oprawione wideo za pomocą jQuery
Pełna obsługa interfejsu API: Słuchanie wydarzenia YouTube w jQuery
Oficjalny interfejs API: https://developers.google.com/youtube/iframe_api_reference
Historia zmian
Zaimplementowane
onYouTubePlayerReady
:callPlayer('frame_id', function() { ... })
.Funkcje są automatycznie umieszczane w kolejce, gdy gracz nie jest jeszcze gotowy.
Zaktualizowano i pomyślnie przetestowano w obsługiwanych przeglądarkach (patrz w przyszłość).
callPlayer
wymusza sprawdzenie gotowości. Jest to potrzebne, ponieważ gdycallPlayer
jest wywoływane zaraz po wstawieniu elementu iframe, gdy dokument jest gotowy, nie może wiedzieć na pewno, że element iframe jest w pełni gotowy. W przeglądarkach Internet Explorer i Firefox ten scenariusz spowodował zbyt wczesne wywołanie programupostMessage
, które zostało zignorowane.&origin=*
adresu URL.&origin=*
do adresu URL.źródło
PostMessage
Metoda oparta jest na YT JS API (?enablejsapi=1
). Bez włączenia JS APIpostMessage
metoda nic nie da. Zobacz połączoną odpowiedź, aby zapoznać się z łatwą implementacją detektorów zdarzeń. Stworzyłem również, ale nie opublikowałem, czytelny kod do komunikacji z ramą. Postanowiłem go nie publikować, ponieważ jego efekt jest podobny do domyślnego YouTube Frame API.playVideo
, więc polecam do tego użyć oficjalnego API. Zobacz developers.google.com/youtube/iframe_api_reference#Events .Wygląda na to, że YouTube zaktualizował swoje API JS, więc jest to domyślnie dostępne! Możesz użyć istniejącego identyfikatora elementu iframe YouTube ...
... w twoim JS ...
... a konstruktor użyje istniejącego elementu iframe zamiast zastępować go nowym. Oznacza to również, że nie musisz określać videoId konstruktorowi.
Zobacz Ładowanie odtwarzacza wideo
źródło
event
lubcommand
wysłać do iframe YT, aby zatrzymaćlistening
się na statusie?Możesz to zrobić przy znacznie mniejszej ilości kodu:
Przykład roboczy: http://jsfiddle.net/kmturley/g6P5H/296/
źródło
Moja własna wersja powyższego kodu Kim T, która łączy się z niektórymi jQuery i umożliwia kierowanie na określone elementy iframe.
źródło
OnStateChange
: developers.google.com/youtube/iframe_api_reference#EventsDziękuję Rob W za odpowiedź.
Używałem tego w aplikacji Cordova, aby uniknąć konieczności ładowania interfejsu API i aby móc łatwo kontrolować elementy iframe, które są ładowane dynamicznie.
Zawsze chciałem mieć możliwość wyodrębnienia informacji z iframe, takich jak stan (getPlayerState) i czas (getCurrentTime).
Rob W pomógł podkreślić, jak działa API przy użyciu postMessage, ale oczywiście wysyła to informacje tylko w jednym kierunku, z naszej strony internetowej do elementu iframe. Dostęp do getterów wymaga od nas nasłuchiwania wiadomości wysyłanych z powrotem do nas z elementu iframe.
Zajęło mi trochę czasu, zanim zrozumiałem, jak zmodyfikować odpowiedź Roba W., aby aktywować i odsłuchać wiadomości zwracane przez element iframe. Zasadniczo przeszukałem kod źródłowy w elemencie iframe YouTube, aż znalazłem kod odpowiedzialny za wysyłanie i odbieranie wiadomości.
Kluczem była zmiana „zdarzenia” na „nasłuchiwanie”, co w zasadzie dało dostęp do wszystkich metod, które zostały zaprojektowane do zwracania wartości.
Poniżej znajduje się moje rozwiązanie. Zwróć uwagę, że przełączyłem się na „słuchanie” tylko wtedy, gdy wymagane są metody pobierające. Możesz dostosować warunek, aby uwzględnić dodatkowe metody.
Zauważ ponadto, że możesz wyświetlić wszystkie wiadomości wysłane z ramki iframe, dodając console.log (e) do window.onmessage. Zauważysz, że po aktywowaniu słuchania będziesz otrzymywać ciągłe aktualizacje, które obejmują aktualny czas filmu. Wywołanie metod pobierających, takich jak getPlayerState, uaktywni te ciągłe aktualizacje, ale wyśle wiadomość zawierającą stan wideo tylko wtedy, gdy stan się zmieni.
źródło