Html 如何在子窗口中唯一标识iFrame?

Html 如何在子窗口中唯一标识iFrame?,html,internet-explorer,opera,session-storage,sessionstorage,Html,Internet Explorer,Opera,Session Storage,Sessionstorage,我们有以下情况: Iframe由一个域(a)中的页面嵌入和控制 我们无权更改域A的代码 Iframe中的内容是从另一个域(B)交付的 我们使用sessionstorage来处理Iframe中的所有会话变量 有一个Comet风格的推送正在发生,以提供对Iframe的实时更新,为了实现这一点,我们需要能够唯一地识别每个Iframe 为此,我们在sessionStorage变量中存储一个唯一的ID,当然问题就出在这里 在域A使用“window.open”打开子窗口之前,一切正常 我们将以下面的场景结束

我们有以下情况:

Iframe由一个域(a)中的页面嵌入和控制

我们无权更改域A的代码

Iframe中的内容是从另一个域(B)交付的

我们使用sessionstorage来处理Iframe中的所有会话变量

有一个Comet风格的推送正在发生,以提供对Iframe的实时更新,为了实现这一点,我们需要能够唯一地识别每个Iframe

为此,我们在sessionStorage变量中存储一个唯一的ID,当然问题就出在这里

在域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.IFRAME,因为它不允许我们访问window.opener中的任何内容


任何关于如何在IE中实现这一点的建议(我们可以在没有Opera支持的情况下生存),或者对于一个更好的解决方案,我们都将不胜感激。

Opera的行为是规范最初的预期行为,但逐渐转向多进程浏览器基本上已经在其他地方扼杀了它。该行为是故意未定义的。
有一个Comet风格的推送,用于向Iframe提供实时更新,为了实现这一点,我们需要能够唯一地识别每个Iframe。
为什么不使用WebSocket作为传输层?”毕竟,2013年已经过去了;)对于IE来说,还有其他丑陋的彗星技术。请看:@c69 WebSockets会很好,就像HTML5服务器发送的一样。不幸的是,需要IE 8,9支持。在遇到如何唯一标识每个Iframe实例的问题之前,我们的HTTP流实现工作得非常好。