无法在'DOMWindow'上执行'postMessage':https://www.youtube.com!== http:// localhost:9000

Ada*_*ner 139 javascript youtube youtube-api angularjs youtube-iframe-api

这是我得到的错误消息:

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').
Run Code Online (Sandbox Code Playgroud)

我已经看到了目标来源http://www.youtube.com和收件人来源的其他类似问题https://www.youtube.com,但没有一个像我的目标所在的地方https://www.youtube.com和原点http://localhost:9000.

  1. 我没有遇到问题.问题是什么?
  2. 我该如何解决?

Chr*_*lin 83

我认为这是目标来源的一个问题https.我怀疑这是因为你的iFrame网址正在使用http而不是https.尝试更改您要嵌入的文件的网址https.

例如:

'//www.youtube.com/embed/' + id + '?showinfo=0&enablejsapi=1&origin=http://localhost:9000';
Run Code Online (Sandbox Code Playgroud)

成为:

'https://www.youtube.com/embed/' + id + '?showinfo=0&enablejsapi=1&origin=http://localhost:9000';
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,https vs http并没有解决我的问题 (67认同)
  • 这个错误有点误导.它实际上与你在`localhost:9000`无关.实际上问题在于你使用youtube-api的方式.当您在代码中将api声明为`tag.src ="https://www.youtube.com/iframe_api";`时,您告诉youtube您想要使用ssl.所以,我建议的更改会改变您使用ssl来请求视频.错误只是说你正在混合ssl和非ssl调用. (26认同)
  • 当我试图在dom中移动iframe时,我遇到了这个问题.`playerEl = document.querySelector('iframe#ytplayer'); anotherEl.appendChild(playerEl); // yt抱怨随后的api电话` (8认同)
  • 这并不能解决问题 (5认同)
  • 同样在这里,它没有解决我的问题...... :-( (4认同)
  • 这似乎奏效了。谢谢!所以问题出在`http`与`https`之间?域名不同(YouTube与本地主机)无关紧要吗?目标原点与接收者原点到底是什么?您说的如何更改收件人的来源(我的URL仍然是localhost:9000)? (2认同)
  • 对于youtube更改为https://,而我的域为https://仍无法解决我的问题。无法在“ DOMWindow”上执行“ postMessage”:提供的目标原点('https://www.youtube.com')与收件人窗口的原点('https://test.dev')不匹配。 (2认同)

小智 19

只需在播放器"origin"paramVars属性中添加带有网站网址的参数,如下所示:

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' },
}
Run Code Online (Sandbox Code Playgroud)

  • origin:window.location,在属性中涵盖开发和生产 (5认同)
  • 所有这些“修复”在 2020 年对我们来说都不起作用。还要补充一点,当错误显示时,每页加载都是随机的。这是我们网站和 YouTube 之间的竞争条件。 (4认同)
  • @JamesBailey`window.location.origin` ..`window.location`是一个对象。 (2认同)
  • `窗口.位置.主机` (2认同)

M.A*_*yed 16

设置这似乎解决了它:

  this$1.player = new YouTube.Player(this$1.elementId, {
    videoId: videoId,
    host: 'https://www.youtube.com',
Run Code Online (Sandbox Code Playgroud)

  • 所有这些“修复”在 2020 年对我们来说都不起作用。还要补充一点,当错误显示时,每页加载都是随机的。这是我们网站和 YouTube 之间的竞争条件。 (8认同)
  • 这也为我解决了。也可以这样做:`host:\`$ {window.location.protocol} // www.youtube.com \``, (4认同)
  • 使它`http`(而不是`https`)解决了我的问题. (3认同)

小智 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])}}());
Run Code Online (Sandbox Code Playgroud)

进入第二个文件,找到代码: this.a.contentWindow.postMessage(a,b[c]);

并替换为:

if(this._skiped){
    this.a.contentWindow.postMessage(a,b[c]); 
}
this._skiped = true;
Run Code Online (Sandbox Code Playgroud)

当然,您可以串联到一个文件中-效率更高。这不是一个完美的解决方案,但是可以!

我的资料来源:yt_api-concat


Hok*_*cha 7

就我而言,这与延迟加载 iframe 有关。删除 iframe HTML 属性loading="lazy"解决了我的问题。


Gre*_*hak 6

确保从 URL 加载,例如:

https://www.youtube.com/embed/HIbAz29L-FA?modestbranding=1&playsinline=0&showinfo=0&enablejsapi=1&origin=https%3A%2F%2Fintercoin.org&widgetid=1

注意“origin”组件,以及“enablejsapi=1”。来源必须与您的域相匹配,然后它将被列入白名单并正常工作。


归档时间:

查看次数:

232423 次

最近记录:

6 年 前