2011-07-18 15 views
0

変更のためのフォーム入力要素を監視しています(ページ終了時に保存されていないフォームの変更をユーザーに警告するため)。jQuery変更イベント(フォームの更新を監視する)

jQueryの変更イベントは、特定の入力要素がフォーカスを失った場合(たとえば、テキストボックス)にのみトリガされることは理解できます。

これは、ユーザーが1つのテキストボックスを編集してから終了しようとしたため、テキストボックスの変更イベントが発生しないため、問題があります。この問題を克服する方法について

var formChanges = { 
    override: false, 
    changed: false, 
    checkChanges: function() { 
     if(!formChanges.override) { 
      if(formChanges.changed) { 
       return "There are currently unsaved changes."; 
      } 
     } 
    }, 
    init: $(document).ready(function() { 
     $('#checkThis').submit(function() { //'checkThis' is the form ID 
      formChanges.override = true; 
     }); 
     $(':input').change(function() { 
      formChanges.changed = true; 
     }); 
    }) 
} 
window.onbeforeunload = formChanges.checkChanges; 

任意のアイデア:ここ

は、私が得ているどのくらいいるのですか?

答えて

3

実際にあなたが何をしているか、私は非関連の要素に焦点だろう「ハック」あなたが入力のためのキー入力やからkeyupを使用したほうが良いと思いますし、この

$('input:text, textarea').keypress(function() { 
     formChanges.changed = true; 
    }); 

    $('select, input:radio, input:checkbox').change(function(){ 
     formChanges.changed = true; 
    }); 
+0

私は、すべてのキー入力は、必ずしもテキスト(矢印キー)での変化を意味するとは思いません。 –

+1

もちろん、何かが変わったかどうか知ることは、私が行ったことよりはるかに複雑です(あなたは実際の値を本来の値と照らし合わせて、文字を追加し、それを削除しても入力を変更しません)。私の答えは、正しいイベントを選ぶことだけでした。私は、キー入力を使用し、テキスト入力を変更しないでください。 –

+0

この解決策がそのままあれば十分だと思います。ありがとう! –

0

のように選択し、ラジオのための変更のためにcheckloadsの前にアンロードするとき。 keypressは実際に変更を意味しません。

編集:Nicolaのように、変更されているかどうかを絶対に確認するには、おそらく元の値と比較する必要があります。

+0

これはかなり賢いです。アイデアありがとう! –

2

これはかなりうまく動作するようです:

var oldForm = null; 
function monitorChanges(form) { 
    if(oldForm == null) { 
     oldForm = ($(form).serialize()); 
    } else { 
     alert(oldForm == $(form).serialize()); 
    } 
}