Saya ingin dapat mengontrol pemutar YouTube berbasis iframe. Pemain ini sudah ada dalam HTML, tapi saya ingin mengendalikan mereka melalui JavaScript API.
Saya telah membaca dokumentasi untuk API iframe yang menjelaskan cara menambahkan video baru ke halaman dengan API, dan kemudian mengontrolnya dengan fungsi pemutar YouTube:
var player;
function onYouTubePlayerAPIReady() {
player = new YT.Player('container', {
height: '390',
width: '640',
videoId: 'u1zgFlCw8Aw',
events: {
'onReady': onPlayerReady,
'onStateChange': onPlayerStateChange
}
});
}
Kode itu menciptakan objek pemain baru dan menugaskannya ke 'pemain', lalu memasukkannya ke dalam #container div. Lalu aku dapat beroperasi pada 'pemain' dan panggilan playVideo()
, pauseVideo()
dll di atasnya.
Tapi saya ingin dapat beroperasi pada pemain iframe yang sudah ada di halaman.
Saya bisa melakukan ini dengan sangat mudah dengan metode sematan lama, dengan sesuatu seperti:
player = getElementById('whateverID');
player.playVideo();
Tetapi ini tidak bekerja dengan iframe baru. Bagaimana saya bisa menetapkan objek iframe sudah di halaman dan kemudian menggunakan fungsi API di atasnya?
sumber
Jawaban:
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/ .
Pemakaian:
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_guideT : 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
.document.readyState
diterapkan pada 3.6)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
Dilaksanakan
onYouTubePlayerReady
:callPlayer('frame_id', function() { ... })
.Fungsi secara otomatis antri ketika pemain belum siap.
Diperbarui dan diuji secara sukses di browser yang didukung (lihat ke depan).
callPlayer
memaksa pemeriksaan kesiapan. Ini diperlukan, karena ketikacallPlayer
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 dinipostMessage
, yang diabaikan.&origin=*
URL.&origin=*
ke URL.sumber
PostMessage
Metode ini didasarkan pada API JS YT (?enablejsapi=1
). Tanpa mengaktifkan API JS,postMessage
metode ini tidak akan melakukan apa pun, Lihat jawaban tertaut untuk implementasi pendengar acara yang mudah. Saya juga telah membuat, tetapi tidak menerbitkan, kode yang dapat dibaca untuk berkomunikasi dengan bingkai. Saya memutuskan untuk tidak menerbitkannya, karena efeknya mirip dengan YouTube Frame API default.playVideo
, jadi saya sarankan untuk menggunakan API resmi untuk itu. Lihat developers.google.com/youtube/iframe_api_reference#Events .Sepertinya YouTube telah memperbarui JS API mereka sehingga ini tersedia secara default! Anda dapat menggunakan ID iframe YouTube yang ada ...
... di JS Anda ...
... dan konstruktor akan menggunakan iframe Anda yang sudah ada alih-alih menggantinya dengan yang baru. Ini juga berarti Anda tidak harus menentukan videoID ke konstruktor.
Lihat Memuat pemutar video
sumber
event
ataucommand
mengirim ke iframe YT untuk berhentilistening
ke status?Anda dapat melakukan ini dengan kode yang jauh lebih sedikit:
Contoh kerja: http://jsfiddle.net/kmturley/g6P5H/296/
sumber
Versi saya sendiri dari kode Kim T di atas yang menggabungkan dengan beberapa jQuery dan memungkinkan untuk penargetan iframe tertentu.
sumber
OnStateChange
: developers.google.com/youtube/iframe_api_reference#EventsTerima kasih Rob W atas jawaban Anda.
Saya telah menggunakan ini dalam aplikasi Cordova untuk menghindari keharusan memuat API dan agar saya dapat dengan mudah mengontrol iframe yang dimuat secara dinamis.
Saya selalu menginginkan kemampuan untuk dapat mengekstrak informasi dari iframe, seperti status (getPlayerState) dan waktu (getCurrentTime).
Rob W membantu menyoroti bagaimana API bekerja menggunakan postMessage, tetapi tentu saja ini hanya mengirimkan informasi dalam satu arah, dari halaman web kami ke iframe. Mengakses getter mengharuskan kita untuk mendengarkan pesan yang dikirim kembali kepada kita dari iframe.
Butuh beberapa waktu untuk memikirkan cara mengubah jawaban Rob W untuk mengaktifkan dan mendengarkan pesan yang dikembalikan oleh iframe. Saya pada dasarnya mencari melalui kode sumber dalam iframe YouTube sampai saya menemukan kode yang bertanggung jawab untuk mengirim dan menerima pesan.
Kuncinya adalah mengubah 'acara' menjadi 'mendengarkan', ini pada dasarnya memberi akses ke semua metode yang dirancang untuk mengembalikan nilai.
Di bawah ini adalah solusi saya, harap dicatat bahwa saya telah beralih ke 'mendengarkan' hanya ketika getter diminta, Anda dapat mengubah kondisi untuk memasukkan metode tambahan.
Perhatikan lebih lanjut bahwa Anda dapat melihat semua pesan yang dikirim dari iframe dengan menambahkan console.log (e) ke window.onmessage. Anda akan melihat bahwa setelah mendengarkan diaktifkan, Anda akan menerima pembaruan konstan yang mencakup waktu video saat ini. Getter panggilan seperti getPlayerState akan mengaktifkan pembaruan konstan ini tetapi hanya akan mengirim pesan yang melibatkan status video saat status telah berubah.
sumber