Youtube API - 无法在“DOMWindow”上执行“postMessage”

Posted

技术标签:

【中文标题】Youtube API - 无法在“DOMWindow”上执行“postMessage”【英文标题】:Youtube API - Failed to execute 'postMessage' on 'DOMWindow' 【发布时间】:2018-05-29 17:50:12 【问题描述】:

我正在尝试在打开模式时开始播放 youtube 视频,并且在完成之前不会进入下一页。

我下面的脚本在 Chrome 中工作,但在 Firefox 和 Edge 中产生此错误。

在“DOMWindow”上执行“postMessage”失败:目标来源 提供的 ('https://www.youtube.com') 与收件人不匹配 窗口的原点 ('http://example.com')。

Javascript

<script src="http://www.youtube.com/player_api"></script>

<script>

    // autoplay video
    function onPlayerReady(event) 
        event.target.playVideo();
    

    // when video ends
    function onPlayerStateChange(event)         
        if(event.data === 0)           
            alert('Thank you for watching - Click OK to see your results');
        
    

</script>

<script language="javascript">
    $(document).ready(function() 
        $('#post_form').submit(function()  // catch the form's submit event
            $("#adModal").modal("show");
            var time = $('#adtime').val();
            //startCountdownTimer(time) ;

            // create youtube player
            var player;
            player = new YT.Player('player', 
                width: '640',
                height: '390',
                videoId: 'EF-jwIv1w68',
                host: 'http://www.youtube.com',
                events: 
                    onReady: onPlayerReady,
                    onStateChange: onPlayerStateChange
                
            );

        );
    );
</script>

我已查看 this question/answer,但似乎无法通过修改 http / https 使其与我的代码一起使用。

【问题讨论】:

你可能想读这个问题:***.com/questions/10636611/… @Adelin 抱歉,我不明白这有什么帮助 什么是“模态”库? 这对我有帮助 ***.com/questions/50857499/… 【参考方案1】:

我认为该错误消息有点误导,因为它与您的实际主机无关,而是更多关于如何在页面上引用来自 youtube.com 的资源。

为了摆脱这个错误信息,我建议做两件事。 (至少这些对我来说是有效的。)

首先,您应该通过https 引用IFrame Player API 脚本。当使用 http 调用时,YouTube 会自动将该脚本请求重定向到其对应的 https,因此如果您直接从 https 引用该脚本,则可以消除这种情况额外的重定向。但最重要的是,如果您的生产环境曾经转到 https,它不会通过 http 加载该脚本,而是会抛出“Blocked loading mixed active content”错误。

根据我的测试,仅此一项更改就可以神奇地解决问题。但是,如果您希望将其保留在 http 上,还有另一件事:

阅读 API 文档的 Loading a Video Player 和 Supported Parameters 部分,根本没有提到 host 参数。事实上,当我从 Player 参数中删除该行时,我不再收到错误消息。另外,有趣的是,当我将host 逐字设置为http://www.example.com 时,错误消息显示为:The target origin provided (‘http://www.example.com’) does not match the recipient window’s origin …。)因此我认为host 参数不应由客户端设置。

旁注:如果您查看https://www.youtube.com/player_api 的内容,您会看到以下语句:var YTConfig = 'host': 'http://www.youtube.com';。对我来说,这意味着http://www.youtube.com 无论如何都是host 的某种默认值,所以即使你在客户端代码中设置它,你也可以尝试将它设置为https://www.youtube.com

长话短说,尝试使用&lt;script src="https://www.youtube.com/player_api"&gt;&lt;/script&gt; 并注释掉host。这是我的 2 美分。

【讨论】:

遗憾的是,对我们来说,删除 YT 定义的 host 部分并没有解决来自 youtube 的错误。这甚至是在 2020 年,现在哈哈。此外,这里的一切都是 https,因此问题没有任何断开。这只是那些恼人的错误之一,似乎对 youtube 视频的功能的实际影响为零。 @TheDeadMan 否。在测试它的数百次页面刷新后,它似乎是由 youtube iframe api 中的种族问题(异步)引起的良性错误(有时会发生,有时不会)。由于这完全是他们的结局,我们无能为力。【参考方案2】:

解决方案很简单,虽然我不知道为什么。通过从模态中删除 api 它工作正常。在模态中它不会。

【讨论】:

【参考方案3】:

我的网站配置为没有www,而 youtube 链接使用www,这就是我收到此错误的原因。 试着让它相似,我从我的 youtube 中删除了www,它可以工作。

【讨论】:

【参考方案4】:

在我的情况下(类似于此处选择的答案Youtube API error - Failed to execute 'postMessage' on 'DOMWindow':)归结为在播放器实例化时视频在页面上不可见。

【讨论】:

我对此充满希望,但我仍然收到Failed to execute 'postMessage' on 'DOMWindow': The target origin provided ('&lt;URL&gt;') does not match the recipient window's origin ('&lt;URL&gt;').【参考方案5】:

在我的案例中,“widget_referrer”丢失了。如果没有什么对你有用,试试 widget_referrer :window.location.href

其他可能会错过的属性是

来源:window.location.href, 启用jsapi:1,

【讨论】:

以上是关于Youtube API - 无法在“DOMWindow”上执行“postMessage”的主要内容,如果未能解决你的问题,请参考以下文章

Youtube API - 无法在“DOMWindow”上执行“postMessage”

Youtube API 错误 - 无法在“DOMWindow”上执行“postMessage”:

Youtube iframe API 无法发布消息

无法使用 Youtube 数据 API 删除视频

无法使用 Youtube API 将我的 Youtube 广播转换为直播

我无法让Youtube API在Squarespace中运行