Jim*_*uls 26 javascript internet-explorer dom cross-browser
有一个复杂的背景故事涉及我是如何遇到这个,但为什么该self
属性不完全等于窗口本身?
在Safari和Firefox以及朋友中,结果如我所料:
> window == window.self
true
> window === window.self
true
Run Code Online (Sandbox Code Playgroud)
但在Internet Explorer中却不是这样:
>> window == window.self
true
>> window === window.self
false
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释这种不一致吗?究竟是什么是self
窗口对象指向的属性?它投射到平等的东西,这更令人烦恼.
bob*_*nce 16
那还不是全部,window!==window.window
!
我相信我们在这里看到的是"内部窗口"和"外部窗口"对象之间的区别.当然其他浏览器也有这些(例如Moz); 它们通常用于呈现window
自己代码内部和外部的不同视图.
内部窗口包含全局变量和特定于文档的成员.外窗是通过像窗口引用访问[跨帧- ]脚本frames[n]
,parent
,opener
,显然self
.它绑定到所有者视口(浏览器窗口/框架),例如.当您将iframe导航到新文档时,父文档仍会window
在其iframe中看到相同的标识对象.
在一个明智的浏览器对象模型设计中,会有单独的对象,但是当最初由Netscape抛出JavaScript时,很少考虑优雅,导致这个和许多其他接口有太多的重载(form
带有一个名为submit
, 任何人?).
因此,为了兼容性,拆分窗口必须继续显示为脚本的单个对象,即使它不在下面.在IE浏览器中,有时掩码会滑落:看起来好像是window
在说明内部窗口,并且没有任何黑客可以将它===
对准外窗.
ETA:实际上是想到这一点,甚至还有一些(差)理由.ECMAScript规范不是用多个全局上下文编写的,它定义window
了未绑定版本this
,作为检索全局变量作用域对象,它将是内部窗口.
作为DOM/BOM的一部分的其他属性不在ECMA规范的范围内,因此它们可以返回不同的东西(并且必须为了跨框架脚本).
归档时间: |
|
查看次数: |
2352 次 |
最近记录: |