Impossibile eseguire "postMessage" su "DOMWindow": https://www.youtube.com! == http: // localhost: 9000


168

Questo è il messaggio di errore che ottengo:

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

Ho visto altri problemi simili in cui l'origine del bersaglio è http://www.youtube.come l'origine del destinatario è https://www.youtube.com, ma nessuno come il mio dove si trova il bersaglio https://www.youtube.come l'origine è http://localhost:9000.

  1. Non capisco il problema. Qual è il problema?
  2. Come posso ripararlo?


4
Ho avuto lo stesso problema e la correzione di seguito di @ChrisFranklin l'ha risolto per me; ma la cosa strana è che con il mio problema, otterrei l'errore solo per la metà del tempo, e anche allora il video si caricherebbe comunque (anche se altre cose si romperanno).
Do

1
@dgo stesso problema, è stato casuale al caricamento della pagina. Risulta (penso) dovuto al fatto che i contenuti di iframe non sono completamente pronti quando qualcos'altro sta tentando di fare un postMessage. Quindi è una condizione di gara. E se postMessage si verifica in un secondo momento (azione dell'utente), funziona bene senza errori.
IncredibleHat il

anche Google ha questo stesso errore - apri la console e riproduci il video qui: developers.google.com/youtube/iframe_api_reference
T.Todua

Risposte:


92

Credo che questo sia un problema con l'origine target https. Ho il sospetto che sia perché il tuo URL iFrame sta usando httpinvece di https. Prova a cambiare l'URL del file che stai cercando di incorporare https.

Per esempio:

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

essere:

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

2
Sembra aver funzionato. Grazie! Quindi il problema è httpcontro https? Non importa che i domini differiscano (youtube vs. localhost)? E cos'è esattamente l'origine target rispetto all'origine destinatario? In che modo fare ciò che hai detto ha cambiato l'origine del destinatario (il mio URL è ancora localhost: 9000)?
Adam Zerner,

30
L'errore è un po 'fuorviante. In realtà non ha nulla a che fare con te localhost:9000. Il problema era in realtà il modo in cui stavi usando youtube-api. Quando dichiari l'API come tag.src = "https://www.youtube.com/iframe_api";nel tuo codice, stai dicendo a YouTube che vuoi usare ssl. Quindi, la modifica che ho suggerito ti ha cambiato in usando ssl per richiedere i video. L'errore stava solo dicendo che stavi mescolando chiamate ssl e non ssl.
Chris Franklin,

9
Mi sono imbattuto in questo problema quando ho provato a spostare l'iframe nel dom. playerEl = document.querySelector('iframe#ytplayer'); anotherEl.appendChild(playerEl); // yt complains on subsequent api calls
posit lab

1
cosa succede se sto usando JavaScript per caricare il lettore YouTube?
N3R4ZZuRR0,

5
modificato in https: // per youtube e il mio dominio è https: // non risolve ancora il mio problema. Impossibile eseguire "postMessage" su "DOMWindow": l'origine di destinazione fornita (" youtube.com ") non corrisponde all'origine della finestra del destinatario (" test.dev ").
v

24

Aggiungi il parametro "origin"con l'URL del tuo sito paramVarsnell'attributo del player, in questo modo:

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
origine: window.location, nelle proprietà per coprire lo sviluppo e la produzione
James Bailey

3
@JamesBailey window.location.origin.. window.locationè un oggetto.
Acidico9

Come dice il documento API, origin playerVar viene utilizzato solo con l'implementazione iframe pura. Non una API JS.
Damien C

1
Tutte queste "correzioni" non funzionano per noi qui nel 2020. Inoltre, il caricamento casuale per pagina viene visualizzato quando viene visualizzato l'errore. È una condizione di gara tra il nostro sito e YouTube.
IncredibleHat l'

window.location.host
LeeGee

19

L'impostazione sembra risolverlo:

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

3
farlo http (invece di https) risolto il mio problema.
T.Todua,

5
Questo ha risolto anche per me. Può anche fare: host: `${window.location.protocol}//www.youtube.com`,
Joel Worsham

2
Tutte queste "correzioni" non funzionano per noi qui nel 2020. Inoltre, il caricamento casuale per pagina viene visualizzato quando viene visualizzato l'errore. È una condizione di gara tra il nostro sito e YouTube.
IncredibleHat l'

8

È possibile salvare JavaScript in file locali:

Nel primo file, player_apiinserisci questo codice:

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

Nel secondo file, trova il codice: this.a.contentWindow.postMessage(a,b[c]);

e sostituiscilo con:

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

Certo, puoi concatenare in un file - sarà più efficiente. Questa non è una soluzione perfetta, ma funziona!

La mia fonte: yt_api-concat


Risolto il problema per me. Avevo comunque i file localmente adatti al mio caso d'uso.
frequente

Questo ha funzionato anche per me, ma non sono sicuro del perché. Puoi spiegare perché questo lo risolve?
jchavannes,

1
grazie, ho risposto alla mia domanda sulla seconda chiamata ajax: stackoverflow.com/questions/58232081/…
Diogo Almeida

Dal mio punto di vista, usare il file locale per la libreria, in particolare per la libreria di servizi di terze parti, è un pessimo modo di codificare. No ?
Damien C

@DamienC Di sicuro è meno che ideale. Ma, sulla base di tutte le altre "correzioni" su questo thread, non sono sorpreso (né giudico davvero) altri sviluppatori che modificano manualmente il codice API.
Erutan409


3

Prova a utilizzare window.location.hrefl'URL in modo che corrisponda all'origine della finestra.


Bene, ho provato tutte le altre risposte e questo ha funzionato per me!
Kloshar4o

3

Ho avuto lo stesso errore. Il mio errore è stato che il enablejsapi=1parametro non era presente in iframesrc.


0

Penso che la descrizione dell'errore sia fuorviante e abbia originariamente a che fare con un uso errato dell'oggetto giocatore.

Ho avuto lo stesso problema quando sono passato a nuovi video in uno slider.

Quando si utilizza semplicemente la player.destroy()funzione qui descritta, il problema scompare.


Potresti vedere se hai capito cosa sto vivendo su YouTube qui e se è correlato? stackoverflow.com/q/57649870/470749 Forse avrai una risposta. Grazie!
Ryan,

0

Ho avuto lo stesso problema e risulta che avevo l'estensione Chrome "HTTPS Everywhere" in esecuzione. Disabilitare l'estensione ha risolto il mio problema.


0

Questo errore esatto era correlato a un blocco di contenuti di Youtube quando "riprodotto su determinati siti o applicazioni". Più specificamente da WMG (Warner Music Group).

Il messaggio di errore suggeriva tuttavia che il problema era l'importazione di iframe https in un sito http, cosa che non avveniva in questo caso.


0

Rimuovi DNS Prefetch risolverà questo problema.

Se stai usando WordPress, aggiungi questa riga nelle funzioni.php del tuo tema

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


0

Potrebbero esserci le seguenti, ma tutte portano a DOM non caricate prima del suo accesso da javascript.

Quindi ecco cosa devi assicurarti prima di chiamare effettivamente il codice JS: * Assicurati che il contenitore sia stato caricato prima che venga chiamato qualsiasi javascript * Assicurati che l'URL di destinazione sia caricato in qualunque contenitore debba

Mi sono imbattuto nel problema simile ma sul mio locale quando sto cercando di far funzionare il mio Javascript molto prima di caricare la pagina principale che causa il messaggio di errore. L'ho risolto semplicemente aspettando il caricamento dell'intera pagina e quindi chiamando la funzione richiesta.

Puoi semplicemente farlo aggiungendo una funzione di timeout quando la pagina è stata caricata e chiama il tuo evento onload come:

window.onload = new function () {setTimeout (function () {// alcuni eventi onload}, 10); }

ciò assicurerà che ciò che stai provando verrà eseguito bene dopo l'attivazione di onLoad.


Mettere tutto dentro document.addEventListener("DOMContentLoaded", function () {purtroppo non ha aiutato.
Ryan,

0

Questo messaggio viene visualizzato anche quando non si specifica un targetOrigin nelle chiamate a window.postMessage().

In questo esempio *pubblichiamo un messaggio sul primo iFrame e lo utilizziamo come target, che dovrebbe consentire la comunicazione con qualsiasi targetOrigin.

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

0

Nel mio caso almeno questa sembra essere una condizione "non pronta" innocua che l'API riprova finché non riesce.

Ottengo ovunque da due a nove di questi (sul mio peggior tester, un FossilBook del 2009 con 20 schede aperte tramite hotspot cellulare) .... ma poi il video funziona correttamente. Una volta che eseguo le mie chiamate basate su postMessage per cercare, per funzionare sicuramente, non ne ho testati altri.


0

In alcuni casi (come menzionato da un commentatore), ciò potrebbe essere causato dallo spostamento del lettore in DOM, ad esempio appendo ecc.


-1

Puoi provare :

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

-1

Stavo anche affrontando lo stesso problema, quindi visito Youtube Iframe Api ufficiale dove ho trovato questo:

Il browser dell'utente deve supportare la funzione postMessage HTML5. I browser più moderni supportano postMessage

e vagare per vedere che anche la pagina ufficiale stava affrontando questo problema. Basta visitare Youtube ufficiale di Iframe Api e vedere i registri della console. La mia versione di Chrome è 79.0.3945.88.


-2

il mio era:

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

Ho appena rimosso la linea con playerVars e ha funzionato senza errori sulla console.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.