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 次 |
| 最近记录: |