2011-01-31 11 views
13

IEで。IEバグ(ウィンドウ===上)===偽

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

FF3.6 &では、これは起こりません。 IE typeof.toString

Object.prototype.toString.callすべてこれはthisに関連して、両方のtop & window

のために同じことを返します。

誰でもIEが厳格な公平を行うことができない理由を教えてもらえますか?

循環参照がIE & Chromeで問題を引き起こすことはありません。

o = {}; 
o.o = o; 
o === o.o; // true 

だから、それはそれ自身にwindowを得ることの問題だ

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

が判明。

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.frames、すなわちデバッガへのポインタを保持していることが判明しました。したがって、デバッガを開いているとwindowオブジェクトが変更されます。もう少しテストをしなければならない。 window.externalがちょうどうまく

>>for (var i in window.external) alert(i); 
"Object doesn't support this action" 
+2

ちょうどIEが動作する奇妙な方法のもう一つの人工物。 IE9を除いて修正される可能性は低い+私は恐れている。 –

+0

@IainBallardは、IEがこれを行う理由、または単にバグであるという論理的な理由はありますか? – Raynos

+1

厳密にはバグですか?それはより機能的であると私には思えますし、なぜあなたは 'window === top'を比較する必要がありますか? '=='がうまくいくようになると、あなたは本当に必要なのでしょうか? –

答えて

13

これはまさにバグではありません:ホストオブジェクトは、彼らが好きなものは何でもすることができ、 windowオブジェクトは、特に複雑な獣であり、ブラウザウィンドウを表すオブジェクトであり、グローバルオブジェクトのエイリアスでもあるという二重の目的を果たします。私は奇妙なものとしてこの1つをチョークし、===の演算子を使用しないでください。Windowのオブジェクトを比較します。

これは「JavaScript is weirdird」のshrugpostではありません。グローバルオブジェクトとしての役割を果たすだけでなく、windowはホストオブジェクトであり、pre-HTML5は正当な理由で(少なくともスペックに従って)動作します。 IEの古いバージョンでは、この自由を利用し、仕様がまったくない多くの風変わりな動作を示しています。ソースコードにアクセスせずにすべてを理解しようとすると、無意味な練習になります。

+0

編集された質問を参照してください。これは、DOMWindowである 'window'のプロパティを取得することと、' window'自体を取得することの間に違いがあるようです。 – Raynos

+0

@Raynos:面白いが、おそらくそれほど有用ではない: '=='を使うと問題はない。 –

+0

'frames'と' clipboardData'がうまく動作しないという根本原因が見つかりました。 – Raynos

-3

windowを果たしていないことは言うまでもありません

window.frames.location === window.frames.location; // false 
window.frames.location == window.frames.location; // true 
window.frames.event.boundElements == window.frames.event.boundElements; // false 

はグローバルオブジェクトではなく、ページ傾向にあります。 window.windowは、グローバルオブジェクトがグローバルスコープにあるため、理論的には同じではない(===)が、グローバルオブジェクトのプロパティである(==)ことがあります。

私はこれをテストしていませんが、推測として、あなたはself(現在のページ)を比較し、より良い運を持っていることとparent

+1

-1 'window.window === window'が真でなければなりません。これは循環参照です。 'window'はすべて「varウィンドウを見つけることができないので、ウィンドウでそれを探して' window.window'を返します」 – Raynos

+1

この答えは推測であり、少なくとも部分的に間違っています: 'window'はJavaScriptのグローバルオブジェクトとウィンドウを表すホストオブジェクトそれは確かです。また、循環参照はJavaScriptで完全に有効であるため、 'window.window'が' window'と同じオブジェクトにならない理由はありません。 –

+0

@Raynos: 'window'はホストオブジェクトなので、それは続きません。 –

3

wtfjsは、あなたがJavascriptで見つけることができる本当に変わった奇妙なもののための私のお気に入りのサイトの一つです。

は当然のことながら、この小さなIEの機能は、説明の試みと一緒に、言及を持っている:http://wtfjs.com/2010/02/25/ie-scope

その説明が正確であるかどうかは、私が言うことはできませんが、効果は以前に指摘されています。

はい、IEのDOMには奇妙なことがあります。

しかし、それはIEの唯一の変わったものではなく、それはあまり重要でないものの一つとして私を襲う。実際、正直言って、なぜこれは問題なのでしょうか? IEの費用を笑っている以外は、実世界のスクリプトでwindow === topと比較したいと思っていたユースケースは何ですか?

Facebookアプリを開発している間、私はこの問題に遭遇した:この問題に遭遇し、解決策を必要とする人のため

+0

ウィンドウオブジェクトを比較すると便利です。 jQueryで 'elem == window'を検索するだけです。我々は '==='で動作しない2つの等価なウィンドウオブジェクトについて話しています。 – Raynos

+0

@Raynos - 未知のオブジェクト 'elem'を' window'と比較する:はい、私はその事件を見ることができます。しかし、2つの既知のオブジェクト 'top'と' window'を比較しますか?いいえ、現実世界のスクリプトがこれを必要とする理由はわかりません。問題の全体的なポイントは、あなたがすでに確認しなくても常に同じでなければならないことをすでに知っているということです。 IEで実際には同じではないということは、それが議論の対象であることを意味します。 – Spudley

+1

wtfjsの説明はごみです。 'toString()'は、 '=='を使ってオブジェクトを比較するときには、必ずしも呼び出されません。 1つのオペランドが文字列であり、もう1つが文字列でない場合にのみ発生します。 –

4

。私は、アプリケーションがCanvas Page iframeに読み込まれていることを確認したかったのですが、Internet Explorerではwindow === topは常にfalseを返します。

この:

window.top === window.self 

はIE(および他のブラウザ)のすべてのバージョンで動作するはずです。あなたがフレームになっているかどうかを判断するのは素晴らしいことです。あなたが汚い気分にならない、幸せで整形式のJSです。これは、iframe内でセキュリティ警告を投げることなく動作します。