2011-10-17 12 views
4

iframeを含むページを考えてみましょう。IEの異なるウィンドウでtry/catchを実行する

try { 
    iframe.contentWindow.foo(); 
} catch (e) { console.log('ok'); } 

try { 
    iframe.contentWindow.bar(); 
} catch (e) { console.log('ok'); } 

これは私が得るものです::

  • のiframeの内容は、今、私はこのような何かを実行したいこの

    <script type="text/javascript"> 
        window.foo = function() { 
         nonExisting(); 
        }; 
        window.bar = function() { 
         throw "An error!"; 
        }; 
    </script> 
    

    のようになります。 Chrome/Firefox/Opera - 'ok'、 'ok'
    (期待される動作)

  • IE8 - "オブジェクト期待" エラー、キャッチされない例外

WTFはここで起こっていますか?私がtry/catchブロックを使用していると、それはどのように捕らえられない例外になりますか?それはバグですか?または、仕様上の何かがこの動作を許可していますか?
そして、最も重要なのは、それをできるだけ動作させることができますか?

+1

なぜあなたはIEでなくクロム/ ff/operaでうまくいくのですか?ちょっと話をしましょう。 – cambraca

+1

ここ何が起こっているのは、世界中のWeb開発者が何年も前に発見したものです.IEはうまくいきません。 – Polynomial

+0

さて、私はこのバグに誰も遭遇しなかったことに非常に驚いています。通常、私は特定のIEのバグを記述し、回避策を提供する何十ものウェブサイトを見つける。今回はかなり無力感があります。前述したように、主な質問は次のとおりです。 – user123444555621

答えて

2

これは、タイプミス("An error"!)が原因です。

IE8でエミュレートされたIE9でそのタイプミスなしで実行すると、http://jsfiddle.net/vsSgE/3/が動作します。

+0

私はIEが悪い時代にこのジャンプを嫌っています。何かがIEの人々の間違いのより多くをキャッチし、それについてあなたに知らせる。それを正しくコード化すれば、問題はありません。各ブラウザには違いがありますが、あなた自身の問題を抱えば、すべてのブラウザでサイトを稼働させることができます。 – anothershrubery

+0

BTW @pimvdb - それはあなたの解決策ではありませんでしたが、IE上で怠惰なコーディングをしている人の例としてあなたのソリューションを使用していました。 – anothershrubery

+0

@anothershruberyすべての深刻さにおいて、私は多くの間違いを許して歴史的にブラウザを責めています。 HTML(pre XHTML)は正確ではないマークアップをたくさん受け取り、JSも同様です。そのため、Web開発は怠惰でバグの多い分野です。 – cambraca

1

私は今日この正確な問題に遭遇しました。親ウィンドウに「例外クラス」をいくつか定義しました。これを子ウィンドウ(iframe)に「インポート」して、親の中でinstanceofを使ってそれらを処理できます。このような何か:

親ウィンドウ

window.MyExceptions = { 
    RenderingException: function() { ... } 
    // ...more exception types 
}; 

// Somewhere further down in the code, assuming 'iframe' is the child iframe 
try { 
    iframe.contentWindow.renderAllTheThings(); 
} catch (ex) { 
    if (ex instanceof MyExceptions.RenderingException) { 
     // ... 
    } 
} 

子供(インラインフレーム)ウィンドウ

window.MyExceptions = window.parent.MyExceptions; // Import exception types 
window.renderAllTheThings = function() { 
    // ... 
    throw new MyExceptions.RenderingException(); 
}; 

この設定を使用して、あなたがやったと私は同じ問題を抱えて - それがすべてで働いていました現代のブラウザでテストしましたが、IE8では "キャッチされない例外"エラーが発生しました。

私の回避策は、実際の投げを行い、親ウィンドウ内のオブジェクトのように、MyExceptionsにシンプルなユーティリティ機能を追加しました:私は子ウィンドウから例外をスローしたい時はいつでも次に

window.MyExceptions = { 
    RenderingException: function() { ... }, 
    // ...more exception types 
    Throw: function (ex) { 
     throw ex; 
    } 
}; 

を親で扱われる場合は、私はMyExceptions.Throw(new MyExceptions.RenderingException());とします。

エレガントではありませんが、私はそれを機能させる必要がありました。

+0

だから、あなたは 'parent.MyExceptions.Throw(...)'のように呼んでいると思いますか?それは私の 'bar'の例のためのすっきりした回避策ですが、' foo'の問題は本当に解決されません。まあ、私たちはいくつかのことをすることができると思います[catch-all魔法](http://stackoverflow.com/questions/9780505/is-there-sucha-a-thing-as-a-catch-all-javascript-error-handler ) 'window.addEventListener( 'error'、parent.MyExceptions.Throw); 'のようですが、私はそのATMを試すことはできません。 – user123444555621

関連する問題