私がこれをやったやり方は、ページが読み込まれたときに入力の初期値を保存するためにjavascriptを使うことです。次に、ページのロード時とは異なる入力値があるかどうかを確認するbeforeunloadハンドラがあります。いずれかの入力が変更された場合、ユーザーはページを離れることを確認するように指示し、キャンセルするとそのアクションを取り消します。私のサブミットロジックでは、beforeunloadチェックが起きないようにフラグを設定して、サブミットがプロンプトを表示しないようにします。
これを行うためのjQueryプラグインがあると思われますが、jQueryを使い始めて以来これを実装していません。私の以前のコードではPrototypeを使用しました。
:jQueryプラグインを見つけることができませんでしたが、私はそれを見逃していた可能性があります。ここで私はそれをどうやって行うのかのサンプルを紹介します。明らかに、もっと多くのことができます。注:純粋なjQueryで動作するようにはできませんでした。なぜ、ポップアップが2回現れるのか正確にはわかりません。
これはすべての入力要素で機能するはずです。ただし、ボタンを無視/処理するように変更することもできます。私は送信ボタンを無視するように調整しただけです(ポップアップなしでポストバックすることができます)。他のボタンタイプがページのアンロードを引き起こす可能性がある場合は、それに対処する必要があります。
var CheckOnClose = function() {
this.initialize();
}
CheckOnClose.prototype = {
submitting: false,
initialize: function() {
var that = this;
window.onbeforeunload = function() { return that.checkLeavePage(); }
},
isChanged: function() {
var changed = false;
$('input:not(:submit)').each(function() {
var iv = $(this).data('initialValue');
if ($(this).val() != iv) {
changed = true;
return false;
}
});
return changed;
},
setSubmitting: function() {
this.submitting = true;
},
checkLeavePage: function() {
if (!this.submitting && this.isChanged()) {
return 'You have some unsaved changes.';
}
}
}
var checker = new CheckOnClose();
$(document).ready(function() {
$(':input:not(:submit)').each(function() {
$(this).data('initialValue',$(this).val());
});
$(':submit').click(function() {
checker.setSubmitting();
});
});
もちろん、jQuery/Prototype /他のライブラリも使用できますが、基本的な実装は上記のスニペットと同じくらい簡単です。 – synhershko