「DOMWindow」で「postMessage」を実行できませんでした:https://www.youtube.com!== http:// localhost:9000


165

これは私が得るエラーメッセージです:

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

ターゲットの起点がhttp://www.youtube.comあり、受信者の起点が他にもある他の同様の問題を見たことがありますhttps://www.youtube.comが、ターゲットがhttps://www.youtube.comあり、起点がどこにあるのかはわかりませんhttp://localhost:9000

  1. 問題はありません。何が問題ですか?
  2. どうすれば修正できますか?


4
同じ問題があり、@ ChrisFranklinによる以下の修正で修正されました。しかし、奇妙なのは、私の問題では、エラーが約半分の時間しか発生せず、それでもビデオが読み込まれることです(他のものが壊れます)。
dgo

1
@dgo同じ問題、ページの読み込み時にランダムでした。他の何かがpostMessageを実行しようとしているときには、実際のiframeコンテンツが完全に準備されていないことが原因だと思います(私はそう思います)。したがって、それは競合状態です。また、postMessageが後で発生した場合(ユーザーアクション)、エラーなしで正常に動作します。
IncredibleHat

Googleにもエラーがあります -コンソールを開いて、ここでビデオを再生してください:developer.google.com/youtube/iframe_api_reference
T.Todua

回答:


92

これは、ターゲットの起点がである問題だと思いますhttps。iFrameのURLがのhttp代わりに使用されているためと思われますhttps。埋め込もうとしているファイルのURLを変更してみてくださいhttps

例えば:

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

することが:

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

2
それはうまくいったようです。ありがとう!だから問題はhttphttpsですか?ドメインが異なっていても問題ありません(youtubeとlocalhostの違い)?そして、正確にはターゲットオリジンと受信者オリジンは何ですか?あなたが言ったことをどのようにして受信者の起点を変更しましたか(私のURLはまだlocalhost:9000です)?
Adam Zerner、2014

30
エラーは少し誤解を招くものです。それは実際にあなたがいることとは何の関係もありませんlocalhost:9000。問題は、実際にはyoutube-apiの使用方法にありました。tag.src = "https://www.youtube.com/iframe_api";コードのようにapiを宣言すると、sslを使用することをYouTubeに伝えます。したがって、私が提案した変更により、sslを使用してビデオを要求するように変更されました。エラーは、ssl呼び出しと非ssl呼び出しが混在しているというだけでした。
クリスフランクリン14

9
この問題は、iframeをdom内で動かそうとしたときに発生しました。 playerEl = document.querySelector('iframe#ytplayer'); anotherEl.appendChild(playerEl); // yt complains on subsequent api calls
ラボ

1
JavaScriptを使用してYouTubeプレーヤーをロードしている場合はどうなりますか?
N3R4ZZuRR0 2017年

5
YouTubeのhttps://に変更しましたが、私のドメインはhttps://ですが、まだ問題は解決しません。'DOMWindow'で 'postMessage'を実行できませんでした:提供されたターゲットの起点( ' youtube.com ')が受信者ウィンドウの起点( ' test.dev ')と一致しません。
2017

23

次のように、プレーヤー"origin"paramVars属性にサイトのURLを含むパラメーターを追加するだけです。

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
origin:window.location、devおよびproductionをカバーするプロパティ
James Bailey

3
@JamesBailey window.location.origin.. window.locationはオブジェクトです。
Acidic9

APIドキュメントが言うように、origin playerVarは純粋なiframe実装でのみ使用されます。JS APIではありません。
ダミアンC

1
これらの「修正」はすべて、2020年には機能しません。また、エラーが表示されたときにページごとにランダムに読み込まれます。私たちのサイトとYouTubeの間の競合状態です。
IncredibleHat

window.location.host
LeeGee

19

これを設定するとそれを修正するようです:

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

3
http (の代わりにhttps)それを作ることは私の問題を解決しました。
T.Todua

5
これで修正されました。次も実行できます:host: `${window.location.protocol}//www.youtube.com`
Joel Worsham

2
これらの「修正」はすべて、2020年には機能しません。また、エラーが表示されたときにページごとにランダムに読み込まれます。私たちのサイトとYouTubeの間の競合状態です。
IncredibleHat

8

JavaScriptをローカルファイルに保存できます。

最初のファイルに、player_api次のコードを挿入します。

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

2番目のファイルに、コードを見つけます。 this.a.contentWindow.postMessage(a,b[c]);

そしてそれを次のものに置き換えます:

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

もちろん、1つのファイルに連結することもできます-より効率的です。これは完璧な解決策ではありませんが、うまくいきます!

私のソース:yt_api-concat


私のために修正しました。とにかくファイルをローカルに持っていたので、私のユースケースに適合しました。
頻繁

これもうまくいきましたが、理由はわかりません。これがなぜそれを修正するのか説明できますか?
jchavannes

1
ありがとう、二AJAX呼び出しの私の質問答え:stackoverflow.com/questions/58232081/...
ディオゴ・アルメイダ

私の見解では、ライブラリ、特にサードパーティのサービスライブラリにローカルファイルを使用することは、コーディングの方法としては非常に悪い方法です。番号 ?
ダミアンC

@DamienCそれは確かに理想的ではありません。しかし、このスレッドの他のすべての「修正」に基づいて、APIコードを手動で変更している他の開発者に驚いてはいない(実際には判断していません)。
Erutan409


3

window.location.hrefウィンドウの原点と一致するURLを使用してみてください。


いいですね、他のすべての答えを試してみましたが、これでうまくいきました!
Kloshar4o

3

同じエラーが発生しました。私の間違いは、enablejsapi=1パラメーターがiframesrcに存在しないことでした。


0

エラーの説明は誤解を招くものであり、元々はプレイヤーオブジェクトの誤った使用に関係していると思います。

スライダーで新しい動画に切り替えると、同じ問題が発生しました。

ここで説明するplayer.destroy()関数を単純に使用すると、問題はなくなります。


ここでYouTubeで私が経験していることを理解しているかどうか、またそれが関連しているかどうかを確認してください。stackoverflow.com/q/57649870/470749多分あなたは答えを持っているでしょう。ありがとう!
ライアン

0

同じ問題がありましたが、それはChrome拡張機能「HTTPS Everywhere」を実行していることが原因であることがわかりました。拡張機能を無効にすると、問題が解決しました。


0

この正確なエラーは、「特定のサイトまたはアプリケーションで再生された」ときのYouTubeによるコンテンツブロックに関連していました。より具体的には、WMG(Warner Music Group)によるものです。

ただし、エラーメッセージは、httpサイトへのhttps iframeインポートが問題であることを示唆しており、この場合は問題ではありませんでした。


0

DNS Prefetchを削除すると、この問題が解決します。

WordPressを使用している場合は、この行をテーマのfunctions.phpに追加します

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


0

次のいずれかが考えられますが、それらはすべて、JavaScriptでアクセスされる前にロードされないDOMにつながります。

したがって、実際にJSコードを呼び出す前に確認する必要があるのは次のとおりです。

私は同様の問題に遭遇しましたが、メインページのonLoadの前にJavascriptを実行しようとすると、ローカルでエラーメッセージが表示されます。ページ全体が読み込まれるのを待って、必要な関数を呼び出すだけで修正しました。

これは、ページが読み込まれたときにタイムアウト関数を追加して、次のようにonloadイベントを呼び出すだけで実行できます。

window.onload = new function(){setTimeout(function(){//いくつかのonloadイベント}、10); }

これにより、onLoadがトリガーされた後も、実行しようとしているものが確実に実行されます。


document.addEventListener("DOMContentLoaded", function () {残念ながらすべてを中に入れても助けにはなりませんでした。
ライアン

0

への呼び出しでtargetOriginを指定しない場合にも、このメッセージが表示されますwindow.postMessage()

この例では、最初のiFrameにメッセージを投稿*し、targetOriginとの通信を許可するターゲットとして使用します。

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

0

私の場合、少なくとも、これは無害な「準備ができていない」状態のようで、APIが成功するまでAPIが再試行します。

私はこれらの2つから9つまでを取得します(私の最悪のケースのテスターでは、20のタブがセルラーホットスポットを介して開いている2009 FossilBook)...。しかし、ビデオは正しく機能します。それが実行されたら、seekToへの私のpostMessageベースの呼び出しは確実に機能し、他のテストは行っていません。


0

場合によっては(1人のコメンターが述べたように)、プレーヤーをDOM内appendなどでDOM内で移動した場合などに発生することがあります。


-1

あなたが試すことができます :

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

-1

私も同じ問題に直面していたので、公式のYouTube iframe Apiにアクセスしました。

ユーザーのブラウザーは、HTML5 postMessage機能をサポートしている必要があります。最新のブラウザのほとんどはpostMessageをサポートしています

そして、公式ページもこの問題に直面しているのを見てさまよう。ただ、訪問公式YouTubeのインラインフレームアピとコンソールログを参照してください。Chromeのバージョンは79.0.3945.88です。


-2

私のものは:

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

playerVarsで行を削除したところ、コンソールでエラーが発生することなく動作しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.