私のASP.NETWebアプリでは、jQueryを使用して、ユーザーが変更を加えたときにフォームから移動する前に、ユーザーに警告する普遍的な方法を作成しようとしています。かなり標準的なものですが、たくさん検索した後、私はまだうまくいくテクニックを見つけていません。
これが私がこの時点で持っているものです:
    addToPostBack = function(func) {
        var old__doPostBack = __doPostBack;
        if (typeof __doPostBack != 'function') {
            __doPostBack = func;
        } else {
            __doPostBack = function() {
                old__doPostBack();
                func();
            }
        }
    }
    var isDirty = false;
    $(document).ready(function() {
        addToPostBack(function() {
            alert("Postback detected.")
            clearDirty();
        });
        $(':input').bind("change select keydown", setDirty);
        window.onbeforeunload = function(e) {
            var msg = "You have unsaved changes. "
            if (isDirty == true) {
                var e = e || window.event;
                if (e) { e.returnValue = msg; }
                return msg;
            }
        };
    });
    setDirty = function() {isDirty = true;}
    clearDirty = function() {isDirty = false;}
これは、ユーザーが離れないように警告する限り機能します。問題は、同じページのポストバックごとに警告が表示されることです。私のフォームには、ポストバックをトリガーする可能性のあるものがいくつかあります。
- ページには[保存]、[キャンセル]、[削除]のリンクボタンがあります
 - 同じページにとどまりながらサーバー側の機能を実行する他のリンクボタンがページにある可能性があります
 - autopostback = trueを持つ他のコントロールがあり、それらにもサーバー側の関数がアタッチされていますが、ユーザーがページを離れることはありません。
 
ユーザーはページを離れていないので、これらのことのどれも警告を引き起こすべきではありません。私のコードは、addToPostBack(この質問の詳細)を乗っ取って、投稿する前にisDirtyビットをクリアしようとしますが、問題は、IEonbeforeunloadでは__doPostBackの前に起動することです。これは、リンクがクリックされるとすぐにIEがonbeforeunloadを起動するためです(ここで説明します)。 )。
もちろん、これらの各コントロールを接続してisDirtyビットをクリアすることもできますが、フォームレベルで動作し、ポストバックをトリガーする可能性のあるすべてのコントロールに触れる必要がないソリューションをお勧めします。
ASP.NETで機能し、ポストバックを引き起こす可能性のあるすべてのコントロールを配線する必要のないアプローチを持っている人はいますか?