2

我们有以下情况:

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中,我们就像一个全新的窗口,所以没有问题。

SafariChrome中,我们可以执行以下操作

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 支持的情况下生活),或者总体上更好的解决方案,将不胜感激。

4

0 回答 0