我们有以下情况:
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 中,我们就像一个全新的窗口,所以没有问题。
在 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中访问任何内容。< / p>
任何关于如何在IE中工作的建议(我们可以在没有Opera支持的情况下生活),或者为了更好的解决方案,我们将不胜感激。