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/ .
/**
* @author Rob W <gwnRob@gmail.com>
* @website https://stackoverflow.com/a/7513356/938089
* @version 20190409
* @description Executes function on a framed YouTube video (see website link)
* For a full list of possible functions, see:
* https://developers.google.com/youtube/js_api_reference
* @param String frame_id The id of (the div containing) the frame
* @param String func Desired function to call, eg. "playVideo"
* (Function) Function to call when the player is ready.
* @param Array args (optional) List of arguments to pass to function func*/
function callPlayer(frame_id, func, args) {
if (window.jQuery && frame_id instanceof jQuery) frame_id = frame_id.get(0).id;
var iframe = document.getElementById(frame_id);
if (iframe && iframe.tagName.toUpperCase() != 'IFRAME') {
iframe = iframe.getElementsByTagName('iframe')[0];
}
// When the player is not ready yet, add the event to a queue
// Each frame_id is associated with an own queue.
// Each queue has three possible states:
// undefined = uninitialised / array = queue / .ready=true = ready
if (!callPlayer.queue) callPlayer.queue = {};
var queue = callPlayer.queue[frame_id],
domReady = document.readyState == 'complete';
if (domReady && !iframe) {
// DOM is ready and iframe does not exist. Log a message
window.console && console.log('callPlayer: Frame not found; id=' + frame_id);
if (queue) clearInterval(queue.poller);
} else if (func === 'listening') {
// Sending the "listener" message to the frame, to request status updates
if (iframe && iframe.contentWindow) {
func = '{"event":"listening","id":' + JSON.stringify(''+frame_id) + '}';
iframe.contentWindow.postMessage(func, '*');
}
} else if ((!queue || !queue.ready) && (
!domReady ||
iframe && !iframe.contentWindow ||
typeof func === 'function')) {
if (!queue) queue = callPlayer.queue[frame_id] = [];
queue.push([func, args]);
if (!('poller' in queue)) {
// keep polling until the document and frame is ready
queue.poller = setInterval(function() {
callPlayer(frame_id, 'listening');
}, 250);
// Add a global "message" event listener, to catch status updates:
messageEvent(1, function runOnceReady(e) {
if (!iframe) {
iframe = document.getElementById(frame_id);
if (!iframe) return;
if (iframe.tagName.toUpperCase() != 'IFRAME') {
iframe = iframe.getElementsByTagName('iframe')[0];
if (!iframe) return;
}
}
if (e.source === iframe.contentWindow) {
// Assume that the player is ready if we receive a
// message from the iframe
clearInterval(queue.poller);
queue.ready = true;
messageEvent(0, runOnceReady);
// .. and release the queue:
while (tmp = queue.shift()) {
callPlayer(frame_id, tmp[0], tmp[1]);
}
}
}, false);
}
} else if (iframe && iframe.contentWindow) {
// When a function is supplied, just call it (like "onYouTubePlayerReady")
if (func.call) return func();
// Frame exists, send message
iframe.contentWindow.postMessage(JSON.stringify({
"event": "command",
"func": func,
"args": args || [],
"id": frame_id
}), "*");
}
/* IE8 does not support addEventListener... */
function messageEvent(add, listener) {
var w3 = add ? window.addEventListener : window.removeEventListener;
w3 ?
w3('message', listener, !1)
:
(add ? window.attachEvent : window.detachEvent)('onmessage', listener);
}
}
Verwendung:
callPlayer("whateverID", function() {
// This function runs once the player is ready ("onYouTubePlayerReady")
callPlayer("whateverID", "playVideo");
});
// When the player is not ready yet, the function will be queued.
// When the iframe cannot be found, a message is logged in the console.
callPlayer("whateverID", "playVideo");
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_guide
F : 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
.
- IE 8+
- Firefox 3.6+ (eigentlich 3.5, wurde aber
document.readyState
in 3.6 implementiert)
- Opera 10.50+
- Safari 4+
- Chrome 3+
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
- 17. Mai 2012
Implementiert onYouTubePlayerReady
: callPlayer('frame_id', function() { ... })
.
Funktionen werden automatisch in die Warteschlange gestellt, wenn der Player noch nicht bereit ist.
- 24. Juli 2012
In den unterstützten Browsern aktualisiert und erfolgreich getestet (siehe vorne).
- 10. Oktober 2013 Wenn eine Funktion als Argument übergeben wird,
callPlayer
wird eine Überprüfung der Bereitschaft erzwungen. Dies ist erforderlich, da beim callPlayer
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 von postMessage
, der ignoriert wurde.
- 12. Dezember 2013, empfohlen,
&origin=*
die URL hinzuzufügen .
- 2. März 2014, zurückgezogene Empfehlung zum Entfernen
&origin=*
zur URL.
- 9. April 2019, Fehler behoben, der zu einer unendlichen Rekursion führte, wenn YouTube geladen wurde, bevor die Seite fertig war. Hinweis zur automatischen Wiedergabe hinzufügen.