【问题标题】:Define a Cross-origin Property定义跨域属性
【发布时间】:2018-11-14 03:19:28
【问题描述】:

TL;DR:是否可以在父窗口上定义一个跨域属性来充当子窗口可访问的标志?

我有一个可以在 iframe 或顶级浏览上下文中运行的 JavaScript 应用程序。在 iframe 中时,应用程序将尝试使用 window.postMessage 查询父窗口中的功能。这个特性可能不存在,所以我封装了window.postMessage,实现了超时。但是,超时时间必须很长,当该功能不存在时,这会对加载时间产生负面影响。是否可以在父窗口上定义一个跨域属性作为标志来代替超时?

var parent = window.parent;
if (parent && parent.hasFeature) {
    window.postMessage(...);
    return;
}
...

我没有看到Object.defineProperty 的访问描述符提供任何支持,看起来cross-origin property descriptor map 是内部的。

【问题讨论】:

  • 你不能只发一条消息,看看你是否得到回报吗?需要父母监听它并发送响应。
  • 为什么要使用长超时?回复postMessage 应该很快。
  • 应用程序需要知道该功能在用户可用之前是否可用,并且存在父级不会响应的情况。最初,超时时间为 100 毫秒。但是,在测试中,我不得不将其增加到 ~400 毫秒,这是在不存在该功能时明显且有保证的加载时间延迟。

标签: javascript same-origin-policy


【解决方案1】:

我找不到在窗口上定义跨域属性的方法。我不认为这是可能的。但是,我确实发现了三种无需使用 Web 请求或 postMessage 即可在不同来源的窗口之间传递数据的方法。

  1. 如果父母可以控制孩子的位置,则包含数据作为查询 孩子将检查的参数。注意,参数 也将传递给服务器。请参阅以下示例。

    http://host/index.html?flag=1

  2. 如果父母可以控制孩子的位置,请将数据包含为 孩子将检查的哈希片段。这更 比查询参数更合适,因为哈希片段是 旨在用于客户端数据。但是,它可能不是一个选项 如果客户端使用哈希片段进行导航。

    http://host/index.html#flag=1

  3. 将数据包含为name of the iframe。的初始名称 iframe 定义了嵌入式浏览上下文的名称,它可以 孩子可以通过window.name 访问。然而,这并不是 window.name 的预期用途,可能会被其他人破坏或破坏 功能。

    <iframe name="flag=1" src="http://host"></iframe>
    

【讨论】:

    猜你喜欢
    • 2013-08-22
    • 2016-04-05
    • 2014-11-11
    • 2015-11-09
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    相关资源
    最近更新 更多