私の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で機能し、ポストバックを引き起こす可能性のあるすべてのコントロールを配線する必要のないアプローチを持っている人はいますか?