javascript - 检测 JavaScript 是否在沙盒 Iframe 中执行?

标签 javascript html iframe

我有一个产品在 Flash 中播放视频(如果可用),如果 Flash 不可用则回退到 HTML5。

我无法找到一种方法来确定 JavaScript 是否在具有“沙盒”属性的 iframe 中执行,这对我的解决方案来说是必需的,因为沙盒 iframe 会禁用所有插件。沙盒 iframe 可以像这样简单:

<iframe src="http://www.cross-domain.com/" sandbox="allow-scripts">

为了确定是否启用了 Flash,我使用了 swfobject 的检查 navigator.plugins["Shockwave Flash"].description 的方法,即使在沙盒 iframe 中也会设置该方法。我可以加载 swf 对象,但它不播放。

要重现此问题,请访问 http://jsfiddle.net/max_winderbaum/9cqkjo45/ ,打开你的 chrome inspector 并点击“运行”。跨域站点上的脚本将在沙盒 iframe 的上下文中暂停。

根据 W3 规范 http://dev.w3.org/html5/spec-preview/browsers.html#sandboxing-flag-set ,在 JavaScript 可以访问的文档上应该有一个“事件沙盒标志集”(至少我是这样阅读规范的)。 iframe 的文档上似乎没有设置任何标志。

对于如何检测 JavaScript 是否在沙盒 iframe 中执行,有没有人有任何想法/解决方案?

最佳答案

我会考虑不同类型的 iframe(选择第一种适用的情况):

注意:Firefox 将数据 URI 视为同源,所以没关系。但是,Chrome 将它们视为跨源。然后 frameElement 不起作用并且 document.domain 是空字符串,无论 iframe 是否被沙盒化。您可以检查 location.protocol 是否为 'data:' 字符串以检测数据 URI。

一般,您可以尝试类似的方法

function isSandboxedIframe() {
  if (window.parent === window) return 'no-iframe';
  try { var f = window.frameElement; } catch(err) { f = null; }
  if(f === null) {
    if(document.domain !== '') return 'unkown'; // Probably 'non-sandboxed'
    if(location.protocol !== 'data:') return 'sandboxed';
    return 'unkown'; // Can be 'sandboxed' on Firefox
  }
  return f.hasAttribute('sandbox') ? 'sandboxed' : 'non-sandboxed';
}

关于javascript - 检测 JavaScript 是否在沙盒 Iframe 中执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29435076/

相关文章:

javascript - 使用 PHP 和 Javascript 的多个提交按钮

javascript - 错误 : done() invoked with non-Error: {}

css - iframe 内部 div 高度固定

html - 自动开始延迟加载图像,无需等待用户向下滚动页面

html - 不能在页脚中 float 链接吗?

javascript - 在 iframe 中克隆的网站(并且禁用 JavaScript)

Javascript:无法访问 iframe 文档

javascript - 定义的函数是 "Not defined"

javascript - 在循环下的现有对象上添加额外的键值

html - 扩展两个 div,类似于 wordpress 仪表板中的 div