【问题标题】:Why is window not identical to window.self in Internet Explorer?为什么 window 与 Internet Explorer 中的 window.self 不同?
【发布时间】:2010-04-27 21:13:05
【问题描述】:

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

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

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

但在 Internet Explorer 中并非如此:

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

任何人都可以解释这种不一致吗?窗口对象指向的self 属性到底是什么?它投射到一个平等的东西上,这更令人烦恼。

【问题讨论】:

  • 有趣的是,它们显然不是同一类型。 window.self.self === window.self 等于真正的想法。显然 IE 将 window 视为一种特殊类型。
  • 因为 IE 什么都做错了。 :-)

标签: javascript internet-explorer dom cross-browser


【解决方案1】:

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

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

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

在一个明智的浏览器对象模型设计中,会有单独的对象来处理这个问题,但是当 Netscape 最初将 JavaScript 放在一起时,很少考虑优雅,导致这个接口和许多其他接口过载过多(@ 987654329@ 带有一个名为 submit 的元素,有人知道吗?)。

因此,为了兼容性,拆分窗口必须继续显示作为脚本的单个对象,即使它不在下方。在 IE 中,有时掩码会滑落:似乎是在说 window 让您进入内部窗口,而没有任何技巧可以使其 === 针对外部窗口。

ETA:实际上想想看,这甚至有一些(糟糕的)理由。 ECMAScript 规范在编写时并未考虑到多个全局上下文,它将windowthis 的未绑定版本定义为检索全局变量范围对象,这将是内部窗口。

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

【讨论】:

  • 哇,我不确定我是否可以要求更好的答案。
  • 您在哪里以及在什么 ECMAScript 规范中看到了 window 全局对象的定义?此外,这整个内外窗的东西都是废话。根据 DOM,它们都是相同的 AbstractViews(尽管显然不在 IE 中)。正如 JavaScript 尖锐变量所表达的那样,window#1={window:#1#}.
  • @EliGray:ECMA262-3 s10.1.5,ECMA262-5 s15.1:“在 HTML 文档对象模型中,全局对象的 window 属性就是全局对象本身”。您可能认为拆分窗口是 BS,但这是大多数浏览器所做的事情,如果它们要保持长期存在的跨框架脚本行为(*),当您将视图导航到新文档时,参考您必须将其window 现在指向新文档视图的window。 (*:IMO:行为不端,但现在试图改变它是没有好处的。)
【解决方案2】:

好问题。它也可以使用 documentdocument.parentWindow

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

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

对我来说最重要的是:

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

您可以在上述任何示例中将window 替换为this(并保留在全局上下文中),结果相同。这让== 运算符更加可疑。

为什么它会以这种方式运行,这让我无法理解。

【讨论】:

  • 作为评论会更好,因为它不能回答问题。
  • 虽然不太适合评论,嗯。它与document.parentWindow===window.self 中的情况有关。在我的假设中(鉴于它是血腥的 IE,谁能说出真正发生的事情),像 window.windowparentselfopenerframe.contentWindowdocument.parentWindow 这样的显式属性获取外部窗口,而隐式语言级构造 windowthis 为您提供内部窗口。
  • [虽然有趣的非传递窗口/文档 == 比较发生了什么,但我没有最模糊的!]
猜你喜欢
  • 1970-01-01
  • 2010-11-12
  • 1970-01-01
  • 2017-08-27
  • 1970-01-01
  • 2014-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多