Tautan Fiddle: Kode sumber - Pratinjau -
Pembaruan versi kecil: Fungsi kecil ini hanya akan mengeksekusi kode dalam satu arah. Jika Anda ingin dukungan penuh (misalnya acara pendengar / getter), kita lihat di Listening untuk Youtube acara di jQuery
Sebagai hasil dari analisis kode yang mendalam, saya telah membuat sebuah fungsi: function callPlayer
meminta pemanggilan fungsi pada setiap video YouTube berbingkai. Lihat referensi YouTube Api untuk mendapatkan daftar lengkap kemungkinan panggilan fungsi. Baca komentar di kode sumber untuk penjelasan.
Pada 17 Mei 2012, ukuran kode digandakan untuk menjaga status siap pemain. Jika Anda membutuhkan fungsi ringkas yang tidak berurusan dengan status siap pemain, lihat 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);
}
}
Pemakaian:
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");
Kemungkinan pertanyaan (& jawaban):
T : Tidak berfungsi!
A : "Tidak berfungsi" bukan deskripsi yang jelas. Apakah Anda mendapatkan pesan kesalahan? Tolong tunjukkan kode yang relevan.
T : playVideo
tidak memutar video.
A : Playback membutuhkan interaksi pengguna, dan keberadaan allow="autoplay"
iframe. Lihat https://developers.google.com/web/updates/2017/09/autoplay-policy-changes dan https://developer.mozilla.org/en-US/docs/Web/Media/Autoplay_guide
T : Saya telah menyematkan video YouTube menggunakan <iframe src="http://www.youtube.com/embed/As2rZGPGKDY" />
tetapi fungsinya tidak menjalankan fungsi apa pun!
A : Anda harus menambahkan ?enablejsapi=1
pada akhir URL Anda: /embed/vid_id?enablejsapi=1
.
T : Saya mendapatkan pesan kesalahan "String tidak valid atau ilegal telah ditentukan". Mengapa?
A : API tidak berfungsi dengan baik di host lokal ( file://
). Host halaman Anda (uji) secara online, atau gunakan JSFiddle . Contoh: Lihat tautan di bagian atas jawaban ini.
T : Bagaimana Anda tahu ini?
A : Saya telah menghabiskan beberapa waktu untuk menafsirkan sumber API secara manual. Saya menyimpulkan bahwa saya harus menggunakan postMessage
metode ini. Untuk mengetahui argumen yang harus dilewati, saya membuat ekstensi Chrome yang memotong pesan. Kode sumber untuk ekstensi dapat diunduh di sini .
T : Browser apa yang didukung?
A : Setiap browser yang mendukung JSON dan postMessage
.
- IE 8+
- Firefox 3.6+ (sebenarnya 3.5, tetapi
document.readyState
diterapkan pada 3.6)
- Opera 10.50+
- Safari 4+
- Chrome 3+
Jawaban / implementasi terkait: Memudar dalam video berbingkai menggunakan jQuery
Dukungan API Lengkap: Mendengarkan Acara Youtube di jQuery
API Resmi: https://developers.google.com/youtube/iframe_api_reference
Riwayat revisi
- 17 mungkin 2012
Dilaksanakan onYouTubePlayerReady
: callPlayer('frame_id', function() { ... })
.
Fungsi secara otomatis antri ketika pemain belum siap.
- 24 Juli 2012
Diperbarui dan diuji secara sukses di browser yang didukung (lihat ke depan).
- 10 oktober 2013 Ketika suatu fungsi dilewatkan sebagai argumen,
callPlayer
memaksa pemeriksaan kesiapan. Ini diperlukan, karena ketika callPlayer
dipanggil tepat setelah penyisipan iframe saat dokumen siap, ia tidak dapat mengetahui dengan pasti bahwa iframe sepenuhnya siap. Di Internet Explorer dan Firefox, skenario ini mengakibatkan permohonan yang terlalu dini postMessage
, yang diabaikan.
- 12 Des 2013, disarankan untuk menambahkan
&origin=*
URL.
- 2 Mar 2014, mencabut rekomendasi untuk menghapus
&origin=*
ke URL.
- 9 April 2019, perbaiki bug yang mengakibatkan rekursi tak terbatas saat YouTube dimuat sebelum halaman siap. Tambahkan catatan tentang putar otomatis.