Ich möchte in der Lage sein, iframe-basierte YouTube-Player zu steuern. Diese Player befinden sich bereits im HTML-Code, ich möchte sie jedoch über die JavaScript-API steuern.
Ich habe die Dokumentation zur iframe-API gelesen, in der erklärt wird, wie Sie der Seite mit der API ein neues Video hinzufügen und es dann mit den Funktionen des YouTube-Players steuern können:
var player;
function onYouTubePlayerAPIReady() {
player = new YT.Player('container', {
height: '390',
width: '640',
videoId: 'u1zgFlCw8Aw',
events: {
'onReady': onPlayerReady,
'onStateChange': onPlayerStateChange
}
});
}
Dieser Code erstellt ein neues Player-Objekt, weist es 'player' zu und fügt es dann in das #container div ein. Dann kann ich arbeite auf ‚Player‘ und Anruf playVideo()
, pauseVideo()
usw. darauf.
Aber ich möchte in der Lage sein, mit Iframe-Spielern zu arbeiten, die bereits auf der Seite sind.
Ich könnte dies sehr einfach mit der alten Einbettungsmethode tun, mit so etwas wie:
player = getElementById('whateverID');
player.playVideo();
Dies funktioniert jedoch nicht mit den neuen Iframes. Wie kann ich ein Iframe-Objekt zuweisen, das sich bereits auf der Seite befindet, und dann die API-Funktionen darauf verwenden?
quelle
Antworten:
Fiddle Links: Quellcode - Vorschau - Kleine Version
Update: Diese kleine Funktion führt Code nur in einer einzigen Richtung aus. Wenn Sievolle Unterstützung möchten (zB EventListener / Getter), haben einen Blick auf Listening für Youtube Ereignis in jQuery
Als Ergebnis einer umfassenden Code-Analyse habe ich eine Funktion erstellt:
function callPlayer
Fordert einen Funktionsaufruf für jedes gerahmte YouTube-Video an. In der YouTube-API-Referenz finden Sie eine vollständige Liste möglicher Funktionsaufrufe. Lesen Sie die Kommentare im Quellcode, um eine Erklärung zu erhalten.Am 17. Mai 2012 wurde die Codegröße verdoppelt, um den Bereitschaftszustand des Spielers zu gewährleisten. Wenn Sie eine kompakte Funktion benötigen, die den Bereitschaftsstatus des Players nicht berücksichtigt, lesen Sie http://jsfiddle.net/8R5y6/ .
Verwendung:
Mögliche Fragen (& Antworten):
F : Es funktioniert nicht!
A : "Funktioniert nicht" ist keine klare Beschreibung. Erhalten Sie Fehlermeldungen? Bitte zeigen Sie den entsprechenden Code.
F :
playVideo
Das Video wird nicht abgespielt.A : Die Wiedergabe erfordert Benutzerinteraktion und das Vorhandensein von
allow="autoplay"
auf dem Iframe. Siehe https://developers.google.com/web/updates/2017/09/autoplay-policy-changes und https://developer.mozilla.org/en-US/docs/Web/Media/Autoplay_guideF : Ich habe ein YouTube-Video mit eingebettet,
<iframe src="http://www.youtube.com/embed/As2rZGPGKDY" />
aber die Funktion führt keine Funktion aus!A : Sie müssen
?enablejsapi=1
am Ende Ihrer URL hinzufügen :/embed/vid_id?enablejsapi=1
.F : Ich erhalte die Fehlermeldung "Es wurde eine ungültige oder unzulässige Zeichenfolge angegeben". Warum?
A : Die API funktioniert auf einem lokalen Host nicht ordnungsgemäß (
file://
). Hosten Sie Ihre (Test-) Seite online oder verwenden Sie JSFiddle . Beispiele: Siehe die Links oben in dieser Antwort.F : Woher wusstest du das?
A : Ich habe einige Zeit damit verbracht, die Quelle der API manuell zu interpretieren. Ich kam zu dem Schluss, dass ich die
postMessage
Methode anwenden musste. Um zu wissen, welche Argumente übergeben werden müssen, habe ich eine Chrome-Erweiterung erstellt, die Nachrichten abfängt. Der Quellcode für die Erweiterung kann hier heruntergeladen werden .F : Welche Browser werden unterstützt?
A : Jeder Browser, der JSON und unterstützt
postMessage
.document.readyState
in 3.6 implementiert)Verwandte Antwort / Implementierung: Einblenden eines gerahmten Videos mit jQuery
Vollständige API-Unterstützung: Abhören von Youtube-Ereignissen in der
offiziellen jQuery- API: https://developers.google.com/youtube/iframe_api_reference
Versionsgeschichte
Implementiert
onYouTubePlayerReady
:callPlayer('frame_id', function() { ... })
.Funktionen werden automatisch in die Warteschlange gestellt, wenn der Player noch nicht bereit ist.
In den unterstützten Browsern aktualisiert und erfolgreich getestet (siehe vorne).
callPlayer
wird eine Überprüfung der Bereitschaft erzwungen. Dies ist erforderlich, da beimcallPlayer
Aufrufen direkt nach dem Einfügen des Iframes, während das Dokument bereit ist, nicht sicher ist, ob der Iframe vollständig bereit ist. In Internet Explorer und Firefox führte dieses Szenario zu einem zu frühen Aufruf vonpostMessage
, der ignoriert wurde.&origin=*
die URL hinzuzufügen .&origin=*
zur URL.quelle
PostMessage
Methode basiert auf der YT JS API (?enablejsapi=1
). Ohne Aktivierung der JS-API führt diepostMessage
Methode nichts aus. Eine einfache Implementierung der Ereignis-Listener finden Sie in der verknüpften Antwort . Ich habe auch lesbaren Code erstellt, aber nicht veröffentlicht, um mit dem Frame zu kommunizieren. Ich habe beschlossen, es nicht zu veröffentlichen, da seine Wirkung der Standard-YouTube-Frame-API ähnelt.playVideo
, daher empfehle ich, dafür die offizielle API zu verwenden. Siehe developer.google.com/youtube/iframe_api_reference#Events .YouTube hat anscheinend die JS-API aktualisiert, sodass diese standardmäßig verfügbar ist! Du kannst die ID eines vorhandenen YouTube-Iframes verwenden ...
... in Ihrem JS ...
... und der Konstruktor verwendet Ihren vorhandenen Iframe, anstatt ihn durch einen neuen zu ersetzen. Dies bedeutet auch, dass Sie die Video-ID nicht für den Konstruktor angeben müssen.
Siehe Laden eines Videoplayers
quelle
event
odercommand
an den YT-Iframe zu senden,listening
um den Status zu beenden ?Sie können dies mit weitaus weniger Code tun:
Arbeitsbeispiel: http://jsfiddle.net/kmturley/g6P5H/296/
quelle
Meine eigene Version des obigen Codes von Kim T, die mit etwas jQuery kombiniert wird und das Targeting bestimmter Iframes ermöglicht.
quelle
OnStateChange
: developer.google.com/youtube/iframe_api_reference#EventsVielen Dank, Rob W, für Ihre Antwort.
Ich habe dies in einer Cordova-Anwendung verwendet, um zu vermeiden, dass die API geladen werden muss, und um Iframes, die dynamisch geladen werden, einfach steuern zu können.
Ich wollte immer die Möglichkeit haben, Informationen aus dem Iframe zu extrahieren, wie z. B. den Status (getPlayerState) und die Zeit (getCurrentTime).
Rob W half dabei, die Funktionsweise der API mit postMessage hervorzuheben, aber dies sendet natürlich nur Informationen in eine Richtung, von unserer Webseite in den Iframe. Um auf die Getter zugreifen zu können, müssen wir auf Nachrichten warten, die vom Iframe an uns zurückgesendet wurden.
Ich brauchte einige Zeit, um herauszufinden, wie ich Rob Ws Antwort optimieren konnte, um die vom Iframe zurückgegebenen Nachrichten zu aktivieren und abzuhören. Grundsätzlich habe ich den Quellcode im YouTube-Iframe durchsucht, bis ich den Code gefunden habe, der für das Senden und Empfangen von Nachrichten verantwortlich ist.
Der Schlüssel bestand darin, das 'Ereignis' in 'Abhören' zu ändern. Dies ermöglichte im Grunde den Zugriff auf alle Methoden, die zur Rückgabe von Werten entwickelt wurden.
Im Folgenden ist meine Lösung aufgeführt. Bitte beachten Sie, dass ich nur dann auf "Zuhören" umgeschaltet habe, wenn Getter angefordert werden. Sie können die Bedingung so anpassen, dass zusätzliche Methoden hinzugefügt werden.
Beachten Sie außerdem, dass Sie alle vom iframe gesendeten Nachrichten anzeigen können, indem Sie der window.onmessage eine console.log (e) hinzufügen. Sie werden feststellen, dass Sie nach Aktivierung des Hörens ständig Updates erhalten, die die aktuelle Uhrzeit des Videos enthalten. Wenn Sie Getter wie getPlayerState aufrufen, werden diese ständigen Aktualisierungen aktiviert, es wird jedoch nur dann eine Nachricht gesendet, die den Videostatus betrifft, wenn sich der Status geändert hat.
quelle