'DOMWindow' üzerinde 'postMessage' yürütülemedi: https://www.youtube.com! == http: // localhost: 9000


167

Aldığım hata mesajı:

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

Hedef orijin http://www.youtube.comve alıcı orijin olduğu başka benzer problemler gördüm https://www.youtube.com, ama hiçbiri hedefin https://www.youtube.comve orijin olduğu benimki gibi değil http://localhost:9000.

  1. Sorunu anlamıyorum. Sorun nedir?
  2. Nasıl düzeltebilirim?


4
Aynı sorunu vardı ve @ChrisFranklin tarafından aşağıdaki düzeltme benim için düzeltti; ama garip olan şey, benim sorunumla, sadece yarım saatte hatayı alırdım ve o zaman bile video hala yüklenecekti (diğer şeyler kırılacak olsa da).
dgo

1
@dgo aynı sorun, sayfa yüklenirken rastgele oldu. Başka bir şey bir postMessage yapmaya çalışırken zaman tam olarak hazır olmaması nedeniyle (sanırım) ortaya çıkıyor. Yani bu bir yarış koşulu. Ve postMessage daha sonra gerçekleşirse (kullanıcı eylemi), hatasız olarak iyi çalışır.
IncredibleHat

Google'da bile bu hata var - konsolu açın ve videoyu burada oynatın: developers.google.com/youtube/iframe_api_reference
T.Todua

Yanıtlar:


92

Bunun hedef menşei ile ilgili bir sorun olduğuna inanıyorum https. Bunun iFrame URL'nizin httpyerine kullanmasından kaynaklandığından şüpheleniyorum https. Yerleştirmeye çalıştığınız dosyanın URL'sini değiştirmeyi deneyin https.

Örneğin:

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

olmak:

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

2
Bu işe yaramış gibi görünüyor. Teşekkürler! Yani sorun httpvs https? Alan adlarının farklı olması önemli değil (youtube ve localhost)? Hedef menşe ile alıcı menşei tam olarak nedir? Söylediklerinizi yapmak alıcı kökenini nasıl değiştirdi (url'm hala localhost: 9000)?
Adam Zerner

30
Hata biraz yanıltıcı. Aslında bunun seninle olmanla bir ilgisi yok localhost:9000. Sorun aslında youtube-api'yi kullanma şeklindeydi. API'yi tag.src = "https://www.youtube.com/iframe_api";kodunuzda olduğu gibi bildirdiğinizde, youtube'a ssl kullanmak istediğinizi söylersiniz. Bu nedenle, önerdiğim değişiklik sizi video istemek için ssl kullanmaya değiştirdi. Hata sadece ssl ve ssl olmayan çağrıları karıştırmakta olduğunuzu söylüyordu.
Chris Franklin

9
Iframe'i dom içinde hareket ettirmeye çalıştığımda bu sorunla karşılaştım. playerEl = document.querySelector('iframe#ytplayer'); anotherEl.appendChild(playerEl); // yt complains on subsequent api calls
posit labs

1
YouTube oynatıcısını yüklemek için javascript kullanıyorsam ne olur?
N3R4ZZuRR0

5
youtube için https: // olarak değiştirildi ve alan adım https: // hala sorunumu çözmedi. 'DOMWindow' üzerinde 'postMessage' çalıştırılamadı: Sağlanan hedef başlangıç ​​noktası (' youtube.com ') alıcı penceresinin başlangıç noktasıyla (' test.dev ') eşleşmiyor .
vee

24

Parametreyi oynatıcının özelliğine "origin"sitenizin URL'si ile ekleyin paramVars, örneğin:

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
kökeni: window.location, dev ve üretimi kapsayacak özelliklerde
James Bailey

3
@JamesBailey window.location.origin.. window.locationbir nesnedir.
Acidic9

API belgesinin dediği gibi, orijinal playerVar yalnızca saf iframe uygulamasıyla kullanılır. JS API bir değil.
Damien C

1
Tüm bu 'düzeltmeler' bizim için burada 2020 yılında işe yaramaz. Ayrıca, hata gösterildiğinde sayfa yükü başına rastgele eklenir. Sitemiz ve youtube arasında bir yarış durumu.
IncredibleHat

window.location.host
LeeGee

19

Bunu ayarlamak sorunu çözüyor gibi görünüyor:

  this$1.player = new YouTube.Player(this$1.elementId, {
    videoId: videoId,
    host: 'https://www.youtube.com',

3
bunu yapmak http (yerine https) sorunumu çözdü.
T.Todua

5
Bu benim için de düzeltildi. Ayrıca yapabilir: host: `${window.location.protocol}//www.youtube.com`,
Joel Worsham

2
Tüm bu 'düzeltmeler' bizim için burada 2020 yılında işe yaramaz. Ayrıca, hata gösterildiğinde sayfa yükü başına rastgele eklenir. Sitemiz ve youtube arasında bir yarış durumu.
IncredibleHat

8

JavaScript'i yerel dosyalara kaydedebilirsiniz:

İlk dosyaya player_apişu kodu koyun:

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])}}());

İkinci dosyaya kodu bulun: this.a.contentWindow.postMessage(a,b[c]);

ve aşağıdakilerle değiştirin:

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

Tabii ki, bir dosyada birleştirebilirsiniz - daha verimli olacaktır. Bu mükemmel bir çözüm değil, ama işe yarıyor!

Kaynağım : yt_api-concat


Benim için düzelttim. Dosyaları yerel olarak zaten benim durumumda uygun vardı.
sıkça

Bu da benim için çalıştı, ama neden olduğundan emin değilim. Bunun neden düzelttiğini açıklayabilir misiniz?
jchavannes

1
teşekkür ederim, ikinci ajax çağrısında sorumu yanıtladı: stackoverflow.com/questions/58232081/…
Diogo Almeida

Benim açımdan, özellikle üçüncü taraf hizmet kitaplığı için kütüphane için yerel dosya kullanmak kodlamanın çok kötü bir yoludur. Hayır ?
Damien C

@DamienC Kesinlikle ideal olandan daha az. Ancak, bu iş parçacığındaki diğer tüm "düzeltmelere" dayanarak, API kodunu elle değiştiren diğer geliştiricilere şaşırmadım (ne de gerçekten yargılamıyorum).
Erutan409


3

window.location.hrefURL'nin pencerenin kaynağına uygun olmasını sağlamayı deneyin .


Güzel, diğer tüm cevapları denedim ve bu benim için çalıştı!
Kloshar4o

3

Aynı hatayı aldım. Benim hatam enablejsapi=1parametre iframesrc mevcut değildi oldu .


0

Hatanın açıklamasının yanıltıcı olduğunu ve aslında oyuncu nesnesinin yanlış kullanımı ile ilgisi olduğunu düşünüyorum.

Bir Slider'daki yeni Videolara geçerken de aynı sorunu yaşadım.

Burada açıklananplayer.destroy() işlevi kullandığınızda sorun ortadan kalkar.


Burada YouTube'da neler yaşadığımı ve bununla ilgili olup olmadığını anlayabilir misiniz? stackoverflow.com/q/57649870/470749 Belki bir cevabınız vardır. Teşekkürler!
Ryan

0

Aynı sorunu yaşadım ve Chrome uzantısının "HTTPS Everywhere" çalıştığı için ortaya çıktı. Uzantıyı devre dışı bırakmak sorunumu çözdü.


0

Bu kesin hata, "belirli sitelerde veya uygulamalarda oynatıldığında" Youtube'daki bir içerik bloğuyla ilgiliydi. Daha spesifik olarak WMG (Warner Music Group) tarafından.

Ancak hata iletisi, http sitesine bir https iframe içe aktarma işleminin bu durumda olmadığı sorunu olduğunu düşündürdü.


0

DNS Prefetch kaldır bu sorunu çözecektir.

WordPress kullanıyorsanız, bu satırı temanızın işlevlerine ekleyin. Php

remove_action( 'wp_head', 'wp_resource_hints', 2 );


0

Aşağıdakilerden herhangi biri olabilir, ancak hepsi javascript tarafından erişilmeden önce yüklü olmayan DOM'a yönlendirir.

Yani aslında JS kodunu aramadan önce sağlamanız gereken şey: * Herhangi bir javascript çağrılmadan önce kabın yüklendiğinden emin olun * Hedef URL'nin sahip olduğu herhangi bir kapta yüklendiğinden emin olun

Ben benzer bir sorunla karşılaştım ama benim Javascript hata iletisine neden olan ana sayfanın onLoad önce daha önce çalıştırmak için çalışıyorum zaman yerel üzerinde geldi. Sadece tüm sayfanın yüklenmesini bekleyip gerekli işlevi çağırarak düzelttim.

Bunu, sayfa yüklendiğinde bir zaman aşımı işlevi ekleyerek ve onload etkinliğinizi aşağıdaki gibi çağırarak yapabilirsiniz:

window.onload = new function () {setTimeout (function () {// bazı onload olayı}, 10); }

denediğiniz şeyin onLoad tetiklendikten sonra iyi bir şekilde yürütülmesini sağlayacaktır.


document.addEventListener("DOMContentLoaded", function () {Maalesef her şeyi içine koymak yardımcı olmadı.
Ryan

0

Bu iletiyi , aramalarında bir targetOrigin belirtmediğinizde de alırsınız window.postMessage().

Bu örnekte, ilk iFrame'e bir mesaj *gönderiyoruz ve herhangi bir targetOrigin ile iletişime izin vermesi gereken hedef olarak kullanıyoruz.

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

0

Benim durumumda en azından bu, API'nın başarılı olana kadar tekrar denediği zararsız bir "hazır değil" koşulu gibi görünüyor.

Bunlardan ikiden dokuza kadar her yere ulaşıyorum (en kötü durum test cihazımda, hücresel etkin nokta aracılığıyla 20 sekmeli açık bir 2009 FossilBook) .... ama sonra video düzgün çalışıyor. Aramak için postMessage tabanlı çağrılarımı çalıştırdıktan sonra Kesinlikle çalışmak için başkalarını test etmedim.


0

Bazı durumlarda (bir yorumcunun bahsettiği gibi), müzikçaları DOM appendvb. Gibi DOM içinde taşıyorsanız buna neden olabilir .


-1

Deneyebilirsin :

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

-1

Ben de aynı sorunla karşı karşıya kaldım sonra resmi Youtube Iframe Api ziyaret burada buldum:

Kullanıcının tarayıcısı HTML5 postMessage özelliğini desteklemelidir. Çoğu modern tarayıcı postMessage'ı destekler

ve resmi sayfanın da bu sorunla karşı karşıya olduğunu görmek için dolaşmak. Sadece resmi Youtube Iframe Api'yi ziyaret edin ve konsol günlüklerini görün. Chrome sürümüm 79.0.3945.88.


-2

benimki:

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

PlayerVars ile çizgiyi yeni kaldırdım ve konsolda hatasız çalıştı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.