youtube - 无法在“DOMWindow”上执行“postMessage”:提供的目标来源(“') 不匹配收件人窗口的来源 ('')
问题描述
我收到此错误:Failed to execute 'postMessage' on 'DOMWindow': The target origin provided ('<URL>') does not match the recipient window's origin ('<URL>').
我的页面按我希望的方式运行(我没有注意到任何不需要的行为),但我从不喜欢忽略控制台中的错误,尤其是如果我什至不了解根本原因。
我的问题不是重复的,因为我已经研究了所有这些问题,但没有一个答案有效:
- 无法在“DOMWindow”上执行“postMessage”:https://www.youtube.com !== http://localhost:9000
- 无法在“DOMWindow”上执行“postMessage”:提供的目标原点与接收窗口的原点不匹配(“null”)
- Youtube API - 无法在“DOMWindow”上执行“postMessage”
- YouTube API 和跨源请求
- YouTube iFrame Player API 无法在 DOMWindow 上执行 postMessage
- 无法在“DOMWindow”上执行“postMessage”:目标/来源不匹配 http 与 https
我已经在使用https
.
我已经尝试设置playerVars
为{origin: window.location.origin}
.
我已经尝试过设置host
。
我已经尝试过更改 iframe 的可见性。
等等。
var playerVars = {origin: window.location.origin};//https://stackoverflow.com/a/50518247/470749
window.onYouTubeIframeAPIReady = function () {
for (var i = 0; i < youtube.length; i++) {
var youtubeLazyEl = youtube[i];
var videoId = youtubeLazyEl.dataset.v;
players[videoId] = new YT.Player(videoId, {
videoId: videoId,
//host: 'https://www.youtube.com', //https://stackoverflow.com/a/47914456/470749
//playerVars: playerVars,
});
}
};
想法?
解决方案
我认为我们可以自定义 YT.Player 的 sendMessage
playerOptions.playerVars.origin = window.location.origin or your domain.
this.youtubePlayer = new YT.Player(element,playerOptions);
this.youtubePlayer.sendMessage = function (a) {
a.id = this.id, a.channel = "widget", a = JSON.stringify(a);
var url = new URL(this.h.src), origin = url.searchParams.get("origin");
if (origin && this.h.contentWindow) {
this.h.contentWindow.postMessage(a, origin)
}
}
我在我的项目中使用此功能来解决。
推荐阅读
- aws-cdk - 如何检索 AWS ServiceCatalog 产品组合 ID 和产品 ID
- c - 发现为什么这些循环被标记为“无效的语句”的问题(警告:无效的语句 [-Wunused-value])
- javascript - Axios CORS 仅适用于无效请求
- django - 列表到字典并以所需格式打印
- javascript - NodeJS 中将产生的线程数
- python - vb.net 代码在 python 中转换。.net for 循环到 python for 循环
- html - 删除嵌套表之间的空间
- javascript - 录音未上传到服务器文件夹
- go - path.IsAbs 为 Windows 路径返回不正确的结果
- xamarin.forms - 视频播放时相机源丢失