2011-12-23 9 views
2

私は、ウィンドウのグローバルスコープから利用可能なjavascriptオブジェクトのツリー全体を通して再帰を行っています。IE再帰におけるスタックオーバーフロー - > window.framesがそれ自身と等しくない

Chrome、Firefox、Safariではすべてうまく機能しますが、Internet Explorerでは少し問題があります。

基本的に私はツリーを横切るようにオブジェクトのスタックを構築しているので、オブジェクトの行が複数の場所に配置されていることを確認できます。たとえば、私はチェックします。

var ignoreStack = [window, document]; // grows over time to contain every object 

ignoreStack.contains = function(obj) { 
    for(var i=0;i<this.length;i++) { 
    if (this[i] === obj) {return true;} 
    } 
    return false; 
}; 

// ... further down the line inside a recursion 
if (!(obj instanceof Object)) {return;} 
for (var prop in obj) { 
    if (ignoreStack.contains(obj[prop])) {return;} 
    ignoreStack.push(obj[prop]); 
    recurse(obj[prop], prop); 
} 

今、唯一の問題は、それは次のことをチェックするときです:

// Returns true in Chrome, Safari and Firefox 
console.log(window.frames.frames === window.frames); 
// Return false in IE 

ツリー内の他のすべてのオブジェクトは、それ自体に等しく、しかしwindow.frames IEでその真実ではない唯一の例外のようです次のように再帰をオンに続けて、それ自体に、:

// window.frames.frames.frames.frames.frames ...etc 

誰もがwindow.framesは、それ自体に等しくない理由の任意のアイデアを持っていますか?

私は、IEデベロッパーツールを使用してGoogleでいくつかの掘り下げやデバッグを試みましたが、私が集めることができるのは、タイプDispHTMLWindow2のオブジェクトです(それほど意味がありません)。(それは他のブラウザと異なります)オブジェクトも配列もありません。

// Returns true in Chrome, Safari and Firefox 
console.log(window.frames instanceof Object); 
// Return false in IE 

誰かがIEでwindow.framesがはるかに高く評価されるだろう(無限再帰のこのタイプを引き起こす)、他のJavaScriptのオブジェクトとは異なり振る舞う理由にいくつかの光を当てることができれば。

ありがとうございます。

+0

私は、その特定の項目タイプに対して正しい等価操作が存在しなかった可能性が高いと思います。 – jcolebrand

答えて

4

Related question about other host objects that are not equal in IE

誰かがIEでwindow.framesがはるかに高く評価されるだろう(無限再帰のこのタイプを引き起こす)、他のJavaScriptのオブジェクトとは異なり振る舞う理由にいくつかの光を当てることができれば。

window.framesはホストオブジェクトです。ホストオブジェクトはES3で何をしてもかまいません。 IEは不正なホストオブジェクトを持つことで有名です。あなたはそれについて少ししかできません。

キーが'frames'で、objがwindowで、全体が無視されているかどうかをハードコードで確認するダーティハックをお勧めします。

window.frames内には、ふたつのプロパティもありますが、それらも動作しません。

+1

+1のホストオブジェクトへの参照(ES3 4.3.8)では、このコードを書いている時点でECMA 'bible'を開いていましたが、ホストオブジェクトについて聞いたこともありませんでした。 –

+0

参考のために、これは正しいequalsメソッドが書かれていないということについての私のOPのコメントでの意味です。私はそれがホストオブジェクトであるという事実を、質問される質問に照らして理解していると仮定しました。 – jcolebrand

+0

@jcolebrand私はそれについて "適切な同等"とは思わない。私は問題は、 'window.frames'は何らかの未知の理由(IEのバグ?) – Raynos

関連する問題