框架和iframe是否具有隔离的javascript上下文?

时间:2011-11-21 16:28:11

标签: javascript html

我在Chrome中做了一些实验,但我不确定所以我需要确认:

我是否认为iframe和框架具有单独的JavaScript上下文,这使得它们无法在这些框架/ iframe之间共享变量?

为了简化,我们假设客户端将始终是Chrome的相同版本(这是我的情况)

4 个答案:

答案 0 :(得分:9)

但是,您可以使用frames集合或parent访问其他框架(假设它们来自同一个网域)。

答案 1 :(得分:7)

在帧之间共享值并非“不可能”,但你必须要小心。在Internet Explorer中,以下方案将导致错误:

  1. 在第A帧中创建一个JavaScript对象。
  2. 将JavaScript对象传递给第B帧中的函数,该函数将值保存在某处(在第B帧中)
  3. 框架A重新加载新页面
  4. 框架B中的代码尝试从(前)框架A中引用保存的对象。
  5. 当引用已失效页面中的对象时,Internet Explorer不喜欢它。

答案 2 :(得分:5)

嗯,他们只有不同的全局对象和全局范围。但是,如果它们位于同一个域中,则可以在另一个域中运行代码。但是如果你这样做(在父窗口内):

document.getElementById( "myiframe" ).contentWindow.window.globalArray = [];

在iframe的全局范围内创建全局变量globalArray

然后在iframe内部

console.log( globalArray instanceof Array );

将返回false,因为Array引用了iframe的Array构造函数。你必须要做

console.log( globalArray instanceof top.Array );

其中top指的是容器窗口全局对象。

jsfiddle:http://jsfiddle.net/EFbtN/

答案 3 :(得分:1)

上下文的分离不在帧之间,而是在域之间。这意味着如果您将带有域A的帧A和带有域B的帧B加载,则来自帧A的javascript无法访问域B的上下文。请查看this以获得更长的解释。

编辑:当然,如果他们在同一个域上,SLaks提供的答案完全适用。