我们有以下情况:
Iframe 由一个域 (A) 中的页面嵌入和控制。
我们无权更改域 A 的代码。
Iframe 中的内容是从另一个域 (B) 传递的。
我们正在使用会话存储来处理 iframe 中的所有会话变量。
有一个 Comet 风格的推送正在发生,以向 iframe 提供实时更新,并且为了完成这项工作,我们需要能够唯一地识别每个 iframe。
为此,我们将唯一 ID 存储在 sessionStorage 变量中,当然问题就在这里。
一切都很好,直到域 A 使用“window.open”打开一个子窗口,我们最终得到以下场景。
+----------+ +----------+
| A | | A |
| +------+ | | +------+ |
| | B (1)| | window.open -> | | B (2)| |
| +------+ | | +------+ |
+----------+ +----------+
加载 B(2) 时,会话存储按如下方式处理:
IE 8,9,10: sessionstorage[B1] is copied to sessionstorgage[B2]
Firefox: sessionstorgage[B2] is uninitialized (this is OK)
Chrome: sessionstorage[B1] is copied to sessionstorgage[B2]
Safari: sessionstorage[B1] is copied to sessionstorgage[B2]
Opera: sessionstorage[B1] is shared (ie the same) as sessionstorgage[B2]
(a change in one will appear in the other - is this a bug?)
所以......唯一ID在大多数浏览器中被克隆(或在Opera的情况下共享)
在Opera中,因为它似乎共享会话存储,所以可能没有解决方案。
在Firefox中,我们就像一个全新的窗口,所以没有问题。
在Safari和Chrome中,我们可以执行以下操作
if (window.opener)
{
if (window.opener.frames.THE_IFRAME.sessionstorage.THE_UNIQUE_ID ==
sessionstorage.THE_UNIQUE_ID)
... get a new unique ID ...
}
在IE中,我们无法访问 window.opener.frames.THE_IFRAME,因为由于跨域限制,它根本不允许我们访问 window.opener 中的任何内容。
任何关于如何在 IE 中进行这项工作的建议(我们可以在没有 Opera 支持的情况下生活),或者总体上更好的解决方案,将不胜感激。