为什么窗口与Internet Explorer中的window.self不同?

时间:2010-04-27 21:13:05

标签: javascript internet-explorer dom cross-browser

有一个复杂的背景故事涉及我如何遇到这个,但为什么self属性不完全等于窗口本身?

在Safari和Firefox以及朋友中,结果如我所料:

> window == window.self
  true
> window === window.self
  true

但在Internet Explorer中却不是这样:

>> window == window.self
   true
>> window === window.self
   false

任何人都可以说明不一致吗?究竟是什么是窗口对象指向的self属性?它投射到平等的东西,这更令人烦恼。

2 个答案:

答案 0 :(得分:15)

这不是全部,window!==window.window

我相信我们在这里看到的是“内部窗口”和“外部窗口”对象之间的区别。当然其他浏览器也有这些(例如Moz);它们通常用于从自己代码的内部和外部呈现window的不同视图。

内部窗口包含全局变量和特定于文档的成员。外部窗口可通过[{1}},frames[n]parent和显然opener等窗口引用访问[cross-frame-]脚本。它绑定到所有者视口(浏览器窗口/框架),例如。当您将iframe导航到新文档时,父文档仍会在其iframe中看到同一个身份self对象。

在一个合理的浏览器对象模型设计中,会有单独的对象,但是当最初由Netscape抛出JavaScript时,很少考虑优雅,导致这个和许多其他接口存在过多的重载({ {1}}有一个名为window的元素,有人吗?)。

因此,为了兼容性,拆分窗口必须继续显示作为脚本的单个对象,即使它不在下面。在IE浏览器中,有时掩码会滑落:似乎说form会让你看到内部窗口,并且没有任何黑客可以使它submit对着外窗。

ETA:实际上要想到这一点,甚至还有一些(差)理由。 ECMAScript规范不是用多个全局上下文编写的,它定义window===的未绑定版本,作为检索全局变量范围对象,它将是内部窗口。

作为DOM / BOM一部分的其他属性不在ECMA规范的范围内,因此它们可以返回不同的东西(并且必须为了跨框架脚本)。

答案 1 :(得分:4)

好问题。它也是documentdocument.parentWindow

window == document; // true
window === document; // false

window == document.parentWindow; // true
window === document.parentWindow; // false

对我而言,最重要的是:

window == document; // true
document == window; // false

您可以在上述任何示例(并保留在全局范围内)中将window替换为this,并获得相同的结果。它使==运营商更加怀疑。

为什么它的表现方式超出了我的范围。