サイト全体のすべての設定フォームで変更が保存されていることを確認したいのですが、フォームに変更を加えてから保存せずに移動しようとすると、Facebookのようになります。そのため、フォームの送信ボタンを無効にして、値が変更された場合にのみ有効にします。次に、保留中の変更がある場合に備えて、ページを離れる前に[保存]をクリックするようにユーザーに促します。
var form = $('form.edit');
if(form.length > 0) {
var orig_str = form.serialize();
$(':submit',form).attr('disabled','disabled');
form.on('change keyup', function(){
if(form.serialize() == orig_str) {
setConfirmUnload(false);
$(':submit',form).attr('disabled','disabled');
} else {
setConfirmUnload(true);
$(':submit',form).removeAttr('disabled')
}
});
$('input[type=submit]').click(function(){ setConfirmUnload(false); });
}
function setConfirmUnload(on) {
window.onbeforeunload = (on) ? unloadMessage : null;
}
function unloadMessage() {
return 'If you navigate away from this page without saving your changes, they will be lost.';
}
これらのフォームの1つには、jQuery.validateライブラリを使用して行う追加の検証が必要です。たとえば、ユーザーが送信などをダブルクリックして誤ってフォームを二重送信できないようにしたい場合(問題の実際の検証はクレジットカードフォームであり、これは単純ではありません):
$('form').validate({
submitHandler: function(form) {
$(':submit', form).attr('disabled','disabled');
form.submit();
}
});
残念ながら、両方のビットが送信ボタンにバインドしようとしていて、互いに干渉しているため、私が何をしても送信ボタンが無効のままになり、フォームを送信できなくなります。
検証を連鎖させる方法などはありますか?または、検証コードを書き直して「フォーム内の何かを変更しましたか」というビジネスを繰り返すことを回避する他の方法はありますか?