【问题标题】:Capturing Cross-Origin iframe Events捕获跨域 iframe 事件
【发布时间】:2015-05-27 15:30:52
【问题描述】:

我在域 A 有一个网站,其中包含一个用于显示视频的 iframe,该视频托管在 YouTube 上。在 iframe 加载事件中,我试图在 iframe 中注册 keyup 事件,以便在客户端按下退出键时关闭视频。这是我的代码示例:

$(myIFrame).bind('load', function() {
    $(myIFrame.contentWindow.document).keyup(function(event) {
        console.log(event.keyCode);
    });
    alert('Event Registered');
});

我遇到以下异常:

火狐:Error: Permission denied to access property "document"
铬:Uncaught SecurityError: Blocked a frame with origin "A" from accessing a frame with origin "https://www.youtube-nocookie.com". Protocols, domains, and ports must match.

有没有办法在跨域 iframe 中注册事件?

【问题讨论】:

  • 你能从域B更改页面的源代码吗?
  • 不,很遗憾,我完全无法控制域 B。B 是 youtube-nocookie.com。
  • 因此出于安全原因,您不能使用 javascript。

标签: javascript jquery security youtube


【解决方案1】:

Same Origin Policy 阻止您这样做。

源由方案、端口、协议和域组成。如果这些匹配,则可以使用 JavaScript 来注册事件或操作 DOM。

如果您的网站是 http://example.com 并且视频是在 http://example.org 上,那么跨域脚本将不可能,因为域不匹配。

不同的来源可以进行通信,但是它们都需要选择启用此功能。 postMessage 就是这样一种 JavaScript 函数。但是,由于您无法控制运行视频的来源,因此在这里无法为您提供帮助。

您的解决方案可能是在您的页面上显示内嵌视频。这应该使您能够捕获事件。

【讨论】:

  • 我想我希望因为两个端点都使用 SSL,所以有一种方法可以覆盖相同的源策略。 YouTube 确实支持JavaScript API,但该 API 公开的事件比 keyup 更高。
猜你喜欢
  • 2015-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-05
  • 2019-08-27
  • 1970-01-01
  • 2013-10-12
  • 2011-03-09
相关资源
最近更新 更多