IE Bug(窗口===顶部)=== false

时间:2011-01-31 12:41:22

标签: javascript internet-explorer

在IE中。

window === top; // false
window === window.window // false
window == top; // true
window == window.window // true

在FF3.6& Chrome稳定不会发生这种情况。

在IE typeof中,.toStringObject.prototype.toString.calltopwindow都返回相同的内容。 o = {}; o.o = o; o === o.o; // true

这与this

有关

谁能告诉我为什么IE不能做严格的平等?

请注意,循环引用不会导致IE和&铬。

window.window === window.top; // true
window.window === window.self; // true

结果

window

因此,将for (var i in window) { if (window.window[i] !== window[i]) { console.log(i); // external, frames, clipboardData } } 置于其自身是一个问题。

 window.frames === window.frames; // false
 window.frames == window.frames; // false
 window.external == window.external; // true
 window.external === window.external; // false
 window.clipboardData === window.clipboardData; // false
 window.clipboardData == window.clipboardData; // false

[编辑]

现在这只是变得愚蠢:

window

[进一步编辑]

结果是window.frames保存了一个指向ie调试器的指针。因此,打开调试器会更改window.frames.location === window.frames.location; // false window.frames.location == window.frames.location; // true window.frames.event.boundElements == window.frames.event.boundElements; // false 对象。我必须做更多的测试。

window.external

更不用说>>for (var i in window.external) alert(i); "Object doesn't support this action" 不能很好地发挥

{{1}}

4 个答案:

答案 0 :(得分:13)

这不是一个错误:主机对象可以做任何他们喜欢的事情,window对象是一个特别复杂的野兽,服务于作为代表浏览器窗口的对象的双重目的,也是一个全局对象的别名。我会把这个作为一个奇怪的东西,并且在比较===对象时避免使用严格的Window运算符。

请注意,这不是“JavaScript很奇怪”的耸肩。除了作为全局对象之外,window是一个宿主对象,并且HTML5之前可以合法地(根据规范,至少)表现出它喜欢的行为。较早版本的IE利用了这种自由,并表现出许多古怪的行为,没有任何规范。试图在不访问源代码的情况下理解它是一个毫无意义的练习。

答案 1 :(得分:4)

对于遇到此问题并需要解决方案的任何人:

我在开发Facebook应用时遇到了这个问题。我想确保应用已加载到Canvas页面iframe中,但在Internet Explorer window === top中始终返回false。

此:

window.top === window.self

应该适用于IE(和其他浏览器)的所有版本。它非常适合确定你是否被诬陷,它是一个快乐,结构良好的JS,它不会让你感到肮脏​​。它在iframe内部工作,也没有抛出任何安全警告。

答案 2 :(得分:3)

wtfjs是我最喜欢的网站之一,你可以在Javascript中找到真正古怪的怪物。

不出所料,这个小小的IE功能已被提及,并尝试解释:http://wtfjs.com/2010/02/25/ie-scope

这个解释是否准确,我不能说,但之前已经注意到了效果。

所以是的,IE的DOM中可能有一个怪癖。

但它不会是IE中唯一的怪癖,它让我感到不那么重要。事实上,说实话,为什么这甚至很重要?除了嘲笑IE的费用之外,想要在真实世界的脚本中比较window === top的用例是什么?

答案 3 :(得分:-3)

window往往是全局对象,而不是页面。 window.window将是该全局对象的一个​​属性,称为“窗口”,所以理论上它们永远不应该相同(===)但可能类似(==),因为该全局对象位于全球范围。

我没有对此进行测试,但作为猜测,您可能会比较self(当前页面)和parent