Ini adalah pesan kesalahan yang saya dapatkan:
Failed to execute 'postMessage' on 'DOMWindow': The target origin provided
('https://www.youtube.com') does not match the recipient window's origin
('http://localhost:9000').
Saya telah melihat masalah serupa lainnya di mana asal target http://www.youtube.com
dan asal penerima https://www.youtube.com
, tetapi tidak ada yang seperti tambang di mana target berada https://www.youtube.com
dan asal http://localhost:9000
.
- Saya tidak mendapatkan masalah. Apa masalahnya?
- Bagaimana saya bisa memperbaikinya?
javascript
angularjs
youtube
youtube-api
youtube-iframe-api
Adam Zerner
sumber
sumber
Jawaban:
Saya percaya ini adalah masalah dengan asal target
https
. Saya menduga itu karena url iFrame Anda yang digunakanhttp
alih-alihhttps
. Coba ubah url file yang ingin Anda sematkanhttps
.Misalnya:
menjadi:
sumber
http
vshttps
? Tidak masalah bahwa domainnya berbeda (youtube vs localhost)? Dan apa sebenarnya asal usul target vs asal penerima? Bagaimana melakukan apa yang Anda katakan mengubah asal penerima (url saya masih localhost: 9000)?localhost:9000
. Masalahnya sebenarnya adalah cara Anda menggunakan youtube-api. Ketika Anda mendeklarasikan api sepertitag.src = "https://www.youtube.com/iframe_api";
dalam kode Anda, Anda memberi tahu youtube bahwa Anda ingin menggunakan ssl. Jadi, perubahan yang saya sarankan mengubah Anda untuk menggunakan ssl untuk meminta video. Kesalahannya hanya mengatakan Anda sedang mencampur panggilan ssl dan non-ssl.playerEl = document.querySelector('iframe#ytplayer'); anotherEl.appendChild(playerEl); // yt complains on subsequent api calls
Cukup tambahkan parameter
"origin"
dengan URL situs Anda diparamVars
atribut pemain, seperti ini:sumber
window.location.origin
..window.location
adalah sebuah objek.window.location.host
Pengaturan ini sepertinya memperbaikinya:
sumber
http
(bukannyahttps
) memecahkan masalah saya.host: `${window.location.protocol}//www.youtube.com`
,Anda dapat menyimpan JavaScript ke file lokal:
Ke dalam file pertama,
player_api
masukkan kode ini:Ke dalam file kedua, cari kode:
this.a.contentWindow.postMessage(a,b[c]);
dan ganti dengan:
Tentu saja, Anda dapat menggabungkan menjadi satu file - akan lebih efisien. Ini bukan solusi yang sempurna, tetapi berhasil!
Sumber saya: yt_api-concat
sumber
Pastikan Anda memuat dari URL seperti:
https://www.youtube.com/embed/HIbAz29L-FA?modestbranding=1&playsinline=0&showinfo=0&enablejsapi=1&origin=https%3A%2F%2Fintercoin.org&widgetid=1
Perhatikan komponen "asal", serta "enablejsapi = 1". Asal harus cocok dengan apa domain Anda, dan kemudian akan masuk daftar putih dan berfungsi.
sumber
Coba gunakan
window.location.href
untuk url agar sesuai dengan asal jendela.sumber
Saya mendapat kesalahan yang sama. Kesalahan saya adalah bahwa
enablejsapi=1
parameter tidak ada diiframe
src.sumber
Saya pikir deskripsi kesalahan itu menyesatkan dan awalnya berkaitan dengan penggunaan objek pemain yang salah.
Saya memiliki masalah yang sama ketika beralih ke Video baru di Slider.
Ketika hanya menggunakan
player.destroy()
fungsi yang dijelaskan di sini masalahnya hilang.sumber
Saya memiliki masalah yang sama dan ternyata itu karena saya menjalankan ekstensi Chrome "HTTPS Everywhere". Menonaktifkan ekstensi memecahkan masalah saya.
sumber
Kesalahan persis ini terkait dengan blok konten oleh Youtube ketika "diputar di situs atau aplikasi tertentu". Lebih khusus lagi oleh WMG (Warner Music Group).
Namun pesan kesalahan tidak menyarankan bahwa https iframe mengimpor ke situs http adalah masalah, yang tidak ada dalam kasus ini.
sumber
Hapus Prefetch DNS akan mengatasi masalah ini.
Jika Anda menggunakan WordPress, tambahkan baris ini di functions.php tema Anda
sumber
Anda dapat mengubah iframe Anda menjadi seperti ini dan menambahkan asal menjadi situs web Anda saat ini. Ini mengatasi kesalahan pada browser saya.
ref: https://developers.google.com/youtube/iframe_api_reference#Loading_a_Video_Player
sumber
Mungkin ada yang berikut ini, tetapi semuanya mengarah ke DOM yang tidak dimuat sebelum diakses oleh javascript.
Jadi di sini adalah apa yang Anda harus memastikan sebelum benar-benar memanggil kode JS: * Pastikan wadah telah dimuat sebelum javascript disebut * Pastikan URL target dimuat dalam wadah apa pun yang harus
Saya menemukan masalah serupa tetapi pada lokal saya ketika saya mencoba untuk menjalankan Javascript saya dengan baik sebelum onLoad dari halaman utama yang menyebabkan pesan kesalahan. Saya telah memperbaikinya dengan hanya menunggu seluruh halaman dimuat dan kemudian memanggil fungsi yang diperlukan.
Anda bisa melakukan ini dengan menambahkan fungsi batas waktu ketika halaman telah dimuat dan memanggil acara onload Anda seperti:
window.onload = fungsi baru () {setTimeout (function () {// some onload event}, 10); }
yang akan memastikan apa yang Anda coba akan dijalankan dengan baik setelah onLoad dipicu.
sumber
document.addEventListener("DOMContentLoaded", function () {
Sayangnya, memasukkan semuanya ke dalam tidak membantu.Anda juga mendapatkan pesan ini ketika Anda tidak menentukan targetOrigin dalam panggilan ke
window.postMessage()
.Dalam contoh ini kami memposting pesan ke iFrame pertama dan menggunakan
*
sebagai target, yang seharusnya memungkinkan komunikasi ke targetOrigin apa pun.sumber
Dalam contoh saya setidaknya ini tampaknya menjadi kondisi "tidak siap" yang tidak berbahaya yang API coba lagi sampai berhasil.
Saya mendapatkan dari dua hingga sembilan ini (pada case-tester terburuk saya, FossilBook 2009 dengan 20 tab terbuka melalui hotspot seluler) .... tapi kemudian videonya berfungsi dengan baik. Setelah menjalankan panggilan berbasis postMessage saya untuk seekTo pasti berfungsi, belum menguji orang lain.
sumber
Dalam beberapa kasus (seperti yang disebutkan salah satu komentator) ini mungkin disebabkan jika Anda memindahkan pemain dalam DOM, seperti
append
atau dll.sumber
Anda dapat mencoba :
sumber
Saya juga menghadapi masalah yang sama kemudian saya mengunjungi Youtube Iframe Api resmi di mana saya menemukan ini:
dan berkeliaran untuk melihat bahwa halaman resmi juga menghadapi masalah ini. Cukup Kunjungi Youtube Iframe Api resmi dan lihat log konsol. Versi Chrome saya adalah 79.0.3945.88.
sumber
punyaku adalah:
Saya baru saja menghapus baris dengan playerVars, dan itu bekerja tanpa kesalahan di konsol.
sumber