Gagal menjalankan 'postMessage' di 'DOMWindow': https://www.youtube.com! == http: // localhost: 9000

165

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.comdan asal penerima https://www.youtube.com, tetapi tidak ada yang seperti tambang di mana target berada https://www.youtube.comdan asal http://localhost:9000.

  1. Saya tidak mendapatkan masalah. Apa masalahnya?
  2. Bagaimana saya bisa memperbaikinya?
Adam Zerner
sumber
4
Saya memiliki masalah yang sama, dan perbaikan di bawah ini oleh @ChrisFranklin memperbaikinya untuk saya; tapi yang aneh adalah bahwa dengan masalah saya, saya hanya akan mendapatkan kesalahan sekitar separuh waktu, dan bahkan kemudian video akan tetap memuat (meskipun hal-hal lain akan rusak).
Lakukan
1
@ Lakukan masalah yang sama, itu acak pada memuat halaman. Ternyata (saya pikir) itu karena konten iframe yang sebenarnya tidak sepenuhnya siap pada saat ada sesuatu yang mencoba melakukan postMessage. Jadi ini kondisi balapan. Dan jika postMessage terjadi di lain waktu (aksi pengguna), itu berfungsi dengan baik tanpa kesalahan.
IncredibleHat
bahkan Google memiliki kesalahan itu sendiri - buka konsol dan mainkan videonya di sini: developers.google.com/youtube/iframe_api_reference
T.Todua

Jawaban:

92

Saya percaya ini adalah masalah dengan asal target https. Saya menduga itu karena url iFrame Anda yang digunakan httpalih-alih https. Coba ubah url file yang ingin Anda sematkan https.

Misalnya:

'//www.youtube.com/embed/' + id + '?showinfo=0&enablejsapi=1&origin=http://localhost:9000';

menjadi:

'https://www.youtube.com/embed/' + id + '?showinfo=0&enablejsapi=1&origin=http://localhost:9000';
Chris Franklin
sumber
2
Tampaknya berhasil. Terima kasih! Jadi masalahnya adalah httpvs https? 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)?
Adam Zerner
30
Kesalahannya sedikit menyesatkan. Ini sebenarnya tidak ada hubungannya dengan Anda berada di localhost:9000. Masalahnya sebenarnya adalah cara Anda menggunakan youtube-api. Ketika Anda mendeklarasikan api seperti tag.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.
Chris Franklin
9
Saya menemukan masalah ini ketika saya mencoba untuk memindahkan iframe di dom. playerEl = document.querySelector('iframe#ytplayer'); anotherEl.appendChild(playerEl); // yt complains on subsequent api calls
posit lab
1
bagaimana jika saya menggunakan javascript untuk memuat pemutar YouTube?
N3R4ZZuRR0
5
diubah menjadi https: // untuk youtube dan domain saya adalah https: // masih belum menyelesaikan masalah saya. Gagal menjalankan 'postMessage' di 'DOMWindow': Asal target yang disediakan (' youtube.com ') tidak cocok dengan asal jendela penerima (' test.dev ').
vee
23

Cukup tambahkan parameter "origin"dengan URL situs Anda di paramVarsatribut pemain, seperti ini:

this.player = new window['YT'].Player('player', {
    videoId: this.mediaid,
    width:'100%',
    playerVars: { 'autoplay': 1, 'controls': 0,'autohide':1,'wmode':'opaque','origin':'http://localhost:8100' },
}
Flávio
sumber
7
asal: window.location, di properti untuk menutupi dev dan produksi
James Bailey
3
@JamesBailey window.location.origin.. window.locationadalah sebuah objek.
Acidic9
Seperti kata API doc, origin playerVar hanya digunakan dengan implementasi iframe murni. Bukan JS API satu.
Damien C
1
Semua 'perbaikan' ini tidak berfungsi untuk kami di sini pada tahun 2020. Juga untuk menambahkan, ini memuat per halaman secara acak ketika kesalahan muncul. Ini adalah kondisi balapan antara situs kami dan youtube.
IncredibleHat
window.location.host
LeeGee
19

Pengaturan ini sepertinya memperbaikinya:

  this$1.player = new YouTube.Player(this$1.elementId, {
    videoId: videoId,
    host: 'https://www.youtube.com',
M.Ali El-Sayed
sumber
3
membuatnya http (bukannya https) memecahkan masalah saya.
T.Todua
5
Ini memperbaikinya bagi saya juga. Bisa juga melakukan: host: `${window.location.protocol}//www.youtube.com`,
Joel Worsham
2
Semua 'perbaikan' ini tidak berfungsi untuk kami di sini pada tahun 2020. Juga untuk menambahkan, ini memuat per halaman secara acak ketika kesalahan muncul. Ini adalah kondisi balapan antara situs kami dan youtube.
IncredibleHat
8

Anda dapat menyimpan JavaScript ke file lokal:

Ke dalam file pertama, player_apimasukkan kode ini:

if(!window.YT)var YT={loading:0,loaded:0};if(!window.YTConfig)var YTConfig={host:"https://www.youtube.com"};YT.loading||(YT.loading=1,function(){var o=[];YT.ready=function(n){YT.loaded?n():o.push(n)},window.onYTReady=function(){YT.loaded=1;for(var n=0;n<o.length;n++)try{o[n]()}catch(i){}},YT.setConfig=function(o){for(var n in o)o.hasOwnProperty(n)&&(YTConfig[n]=o[n])}}());

Ke dalam file kedua, cari kode: this.a.contentWindow.postMessage(a,b[c]);

dan ganti dengan:

if(this._skiped){
    this.a.contentWindow.postMessage(a,b[c]); 
}
this._skiped = true;

Tentu saja, Anda dapat menggabungkan menjadi satu file - akan lebih efisien. Ini bukan solusi yang sempurna, tetapi berhasil!

Sumber saya: yt_api-concat

Artur
sumber
Memperbaikinya untukku. Punya file secara lokal sehingga sesuai dengan kasus penggunaan saya.
sering
Ini juga bekerja untuk saya, tetapi saya tidak yakin mengapa. Bisakah Anda jelaskan mengapa ini memperbaikinya?
jchavannes
1
terima kasih, jawab pertanyaan saya pada panggilan ajax kedua: stackoverflow.com/questions/58232081/…
Diogo Almeida
Menurut pandangan saya, menggunakan file lokal untuk perpustakaan, khususnya untuk perpustakaan layanan pihak ketiga, adalah cara yang sangat buruk untuk kode. Tidak ?
Damien C
@DamienC Ini kurang dari ideal pasti. Tetapi, berdasarkan semua "perbaikan" lainnya di utas ini, saya tidak terkejut (saya juga tidak menilai) pengembang lain mengubah kode API secara manual.
Erutan409
3

Coba gunakan window.location.hrefuntuk url agar sesuai dengan asal jendela.

Chaitanya Shah
sumber
Bagus, saya mencoba semua jawaban lain dan ini berhasil untuk saya!
Kloshar4o
3

Saya mendapat kesalahan yang sama. Kesalahan saya adalah bahwa enablejsapi=1parameter tidak ada di iframesrc.

ave
sumber
0

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.

denns
sumber
Bisakah Anda melihat apakah Anda memahami apa yang saya alami di YouTube di sini dan apakah itu terkait? stackoverflow.com/q/57649870/470749 Mungkin Anda akan memiliki jawaban. Terima kasih!
Ryan
0

Saya memiliki masalah yang sama dan ternyata itu karena saya menjalankan ekstensi Chrome "HTTPS Everywhere". Menonaktifkan ekstensi memecahkan masalah saya.

Gavin
sumber
0

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.

TomSjogren
sumber
0

Hapus Prefetch DNS akan mengatasi masalah ini.

Jika Anda menggunakan WordPress, tambahkan baris ini di functions.php tema Anda

remove_action( 'wp_head', 'wp_resource_hints', 2 );
Terry Lin
sumber
0

Anda dapat mengubah iframe Anda menjadi seperti ini dan menambahkan asal menjadi situs web Anda saat ini. Ini mengatasi kesalahan pada browser saya.

<iframe class="test-testimonials-youtube-group"  type="text/html" width="100%" height="100%"
  src="http://www.youtube.com/embed/HiIsKeXN7qg?enablejsapi=1&origin=http://localhost:8000"
  frameborder="0">
</div>

ref: https://developers.google.com/youtube/iframe_api_reference#Loading_a_Video_Player

nhật tài nguyễn
sumber
0

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.

KMX
sumber
document.addEventListener("DOMContentLoaded", function () {Sayangnya, memasukkan semuanya ke dalam tidak membantu.
Ryan
0

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.

window.frames[0].postMessage({
                    message : "Hi there",
                    command :"hi-there-command",
                    data : "Some Data"
                }, '*')
LukeSolar
sumber
0

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.

Roger Krueger
sumber
0

Dalam beberapa kasus (seperti yang disebutkan salah satu komentator) ini mungkin disebabkan jika Anda memindahkan pemain dalam DOM, seperti appendatau dll.

T.Todua
sumber
-1

Anda dapat mencoba :

document.getElementById('your_id_iframe').contentWindow.postMessage('your_message', 'your_domain_iframe')
HoaTong
sumber
-1

Saya juga menghadapi masalah yang sama kemudian saya mengunjungi Youtube Iframe Api resmi di mana saya menemukan ini:

Browser pengguna harus mendukung fitur postMessage HTML5. Sebagian besar browser modern mendukung postMessage

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.

Shahbaz Shoukat
sumber
-2

punyaku adalah:

<youtube-player
  [videoId]="'paxSz8UblDs'"
  [playerVars]="playerVars"
  [width]="291"
  [height]="194">
</youtube-player>

Saya baru saja menghapus baris dengan playerVars, dan itu bekerja tanpa kesalahan di konsol.

Gabriel Alcântara
sumber