javascript - YouTube 嵌入式视频 JavaScript API 无法在 DOMWindow 上执行 postMessage 提供的目标来源不匹配
问题描述
当我使用 YouTube 嵌入式视频 JavaScript API 在 Chrome 浏览器中运行嵌入式 YouTube 视频时iframe
,我的控制台中出现以下错误:
www-widgetapi.js:581 Failed to execute 'postMessage' on 'DOMWindow': The target origin provided ('https://www.youtube.com') does not match the recipient window's origin ('https://symfony.XXXXXX.com')
.
我提供的网页包含iframe
who'ssrc
属性设置为 YouTube 视频的 URL,以及 URL 搜索参数中的几个设置,包括origin
设置为我的网页 URL 的参数。这是iframe
:
"<iframe width="480" height="390" frameborder="0"
src="https://www.youtube.com/embed/rs50Ie1dHXg?autohide=1&autoplay=1&cc_load_policy=0&controls=0&disablekb=1&enablejsapi=1&fs=0&iv_load_policy=3&modestbranding=1&rel=0&showinfo=0&start=0&widgetid=1&origin=https://symfony.XXXXXX.com"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"></iframe>"
在执行以下语句后,我已经针对 YouTube 对象内容验证了上述内容,并且 YouTube API 对象正确具有上述值。以下是我用来创建 YouTube API 对象的语句:
const IFRAME = document.querySelector( 'iframe#YouTube-Player.YouTube-iframe' );
const $IFRAME = $( IFRAME );
var switches = { 'autohide' : 1, 'autoplay' : 1,
'cc_load_policy' : 0, 'controls' : 0,
'disablekb' : 1, 'enablejsapi' : 1,
'fs' : 0, 'iv_load_policy' : 3,
'modestbranding' : 1, 'rel' : 0,
'showinfo' : 0, 'start' : 0,
'widgetid' : 1,
'origin' : window.location.origin };
//
// In my code I have a function that reads the switches object and assigns its
// contents them as a string to the iframe's src attribute, but for simplicity,
// I'm assigning that content directly to the end of the YouTube Video URL that
// I'm setting the iframe's src attribute to.
//
var str_switches = '?autohide=1&autoplay=1' +
'&cc_load_policy=0&controls=0' +
'&disablekb=1&enablejsapi=1' +
'&fs=0&iv_load_policy=3' +
'&modestbranding=1&rel=0' +
'&showinfo=0&start=0' +
'&widgetid=1' +
'&origin=https://symfony.######.com";
IFRAME.src = 'https://www.youtube.com/embed/rs50Ie1dHXg' +
'?autohide=1&autoplay=1' +
'&cc_load_policy=0&controls=0' +
'&disablekb=1&enablejsapi=1' +
'&fs=0&iv_load_policy=3' +
'&modestbranding=1&rel=0' +
'&showinfo=0&start=0' +
'&widgetid=1' +
'&origin=https://symfony.######.com";
var youtubePlayer = new YT.Player( 'YouTube-Player',
{ videoId : 'rs50Ie1dHXg',
width : Math.max( IFRAME.clientWidth,
$IFRAME.width() ),
height : Math.max( IFRAME.clientHeight,
$IFRAME.height() ),
name : 'a_blank',
playerVars : switches,
events : { 'onError' : onError,
'onReady' : onPlayerReady,
'onStateChange' : onPlayerStateChange }
} );
我没有显示onError
、onPlayerReady
和onStateChange
事件处理程序,但它们可以工作,视频播放,并且onPlayerReady
和onStateChange
事件处理程序函数被正确调用,允许我在视频播放、暂停和结束时监控视频的进度。
正如其他人已经说过的那样,此消息具有误导性。是的,除非我从 YouTube 网站运行我的网站,否则我的网站origin
不会与目标匹配origin
。很明显,YouTube API 抱怨的是别的东西。
我查看了有关此主题的所有 Stack Overflow 问题,以及我在 Internet 上可以找到的内容,但要么没有任何答案,要么给出的答案不适用,要么尝试了一些似乎有帮助的方法,没有解决我遇到的错误,包括我需要使用 HTTPS URL 运行我的网站,而只是省略了origin
参数。
为什么会发生Failed to execute postMessage...错误以及它对我监控和控制视频播放的能力有什么影响。
谢谢你。
解决方案
推荐阅读
- node.js - 使用 jenkins 将节点应用程序部署到 docker 容器
- java - 为什么 EJB 注入在拦截器上不起作用?
- android - Android Studio - 无法启动守护进程
- haskell - 递归函数:没有由文字产生的实例(Num)
- python-3.x - Slack 上未显示交互式响应
- flutter - 如何仅在调用 onPressed 时更改 CupertinoButton 背景颜色
- javascript - Google Apps 脚本失败:基于时间的触发器
- android - android或flutter应用程序中的AndroidManifest错误
- java - 比较 arraylist 项并获取每个公共对象的最后一个索引
- amazon-web-services - Hive/Presto 中是否有一个伪列来获取给定文件的“最后修改”时间戳?