5

次のコードを使用して window.onbeforeunload イベントをキャプチャしています。

window.onbeforeunload = function (evt) 
{

    if(checkIsDirty())
        { 
            var message = 'If you continue your changes will not be saved.'; 
            if (typeof evt == 'undefined') 
            {   
                //IE 
                evt = window.event; 
            } 
            if (evt) 
            { 
                evt.returnValue = message; 
            }
            else
            {
                return message; 
            }
        }

} 

結果の確認で [キャンセル] をクリックすると、「不明な例外」というエラーが表示され、デバッガーによって以下が強調表示されます。

onclick="location.href='/<WhicheverPageYouRequested>.aspx';

OK をクリックすると、ページが完全に変わります。なぜこのエラーが発生するのですか?どうすれば修正できますか?

4

1 に答える 1

9

はい、これは既知の IE の動作です。JavaScript から (location、location.href、location.replace、document.location、history、さらには link.click や form.submit などのラウンドアバウト メソッドを使用して) ナビゲートしようとすると、beforeunloadCancel によって例外が発生します。テスト ケースは次のように単純です。

window.onbeforeunload= function() { return '?'; }
location.href= 'http://www.example.com/';

これは、エラー名がまったく役に立たないことを除いて、ナビゲーションの試行が失敗したことをスクリプトに知らせるために、意図的に行われている可能性もあります。(「不明なエラー」が表示されます。)

伝統的な解決策は、それをキャッチすることです:

try {
    location.href= '...';
} catch(e) {}

すべての例外をキャッチすることは一般的に悪いニュースであるため、私は常にそれを疑っています(ただし、IEではこの例外のみをキャッチすることはできません...正確なstringToをチェックすることは非常に脆弱です.

もう 1 つの方法は、onbeforeunload 作業を呼び出し元のコードに移動して、実際の onbeforeunload が発生せず、例外が発生しないようにすることです。

function navigate(url) {
    if (window.onbeforeunload) {
        if (confirm(window.onbeforeunload()+' Press OK to continue, or Cancel to stay on the current page.')
            window.onbeforeunload= '';
        else
            return;
    }
    location.href= url;
}

ただし、自分で書いたものではなく、使用しているフレームワークがコードを挿入している場合、どちらのソリューションも理解できない可能性があります。

onclick="location.href='/<WhicheverPageYouRequested>.aspx'";

これはどのような制御ですか?正直に言うと、それ自体が疑わしいように見えます。別のページに移動するためにクリックするものは、JavaScript の onclick 要素ではなく、単純なリンクとしてマークアップする必要があります (これらは多くの点で間違っています)。JavaScript 以外の単純なリンクであれば、IE エラーについて心配する必要はありません。

ちなみに、IE 以外のブラウザーではおそらく beforeunload 関数は失敗します (returnValue は IE のみのものです)。また、少し複雑すぎるようです...何が問題なのですか:

window.onbeforeunload= function() {
    if(checkIsDirty())
        return 'If you continue your changes will not be saved.';
}
于 2009-10-02T15:00:07.360 に答える