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?


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';

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' },
}

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',

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


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.


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.


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.


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.


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.


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 );


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.


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"
                }, '*')

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.


0

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


-1

Anda dapat mencoba :

document.getElementById('your_id_iframe').contentWindow.postMessage('your_message', 'your_domain_iframe')

-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.


-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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.