2

テキスト フィールド、チェックボックス、ラジオボタン、送信ボタンを含む HTML フォームがあります。

フィールドの内容が変更された場合にのみ、送信ボタンが有効になるようにしたいと思います。ユーザーがフィールドの内容を元の値に戻した場合、フォーム ボタンを再度無効にする必要があります

  1. 元のフィールド値「foo」=>送信ボタンが無効になっています
  2. ユーザーがフィールド値を「bar」に変更 => 送信ボタンが有効になる
  3. ユーザーがフィールド値を「foo」に戻す => 送信ボタンが再び無効になる

jQueryでこれを達成する方法は? 任意のフォームで使用できる一般的なソリューションまたはスクリプトはありますか?

編集:私が求めていることは、単純なダーティ ステート トラッキングでは実行できません。

4

8 に答える 8

4

ダーティ ステート トラッキングを使用します。すべての入力コントロールにブール値 (IsDirty など) をアタッチし、値が変化するたびに切り替えます。フォームの送信中に、少なくとも 1 つ以上の値が変更されているかどうかを確認してから、フォームを送信してください。それ以外の場合は、ユーザーにアラートを表示します。

もう 1 つの解決策は、コントロールの値が変更されるたびに共通の関数を呼び出すことです。この関数では、何かが変更された場合にグローバル変数 (IsDirty) を true に設定し、送信ボタンを有効/無効にすることもできます。

var isDirty = false;

function SomethingChanged(){
     if( !isDirty ) isDirty = true;
     btnSubmit.disabled = !isDirty;
}

任意のコントロールのジェネリック関数

前提: 各コントロールの初期値を属性「InitVal」に追加します。

function SomethingChanged(control){
     if( control.value != control.InitVal )
          control.IsDirty = true;
     else
          control.IsDirty = false;
}

汎用にする上記の関数では、TextBoxChanged や DropDownChanged などのコントロールの種類ごとに個別の関数を使用できます。ただし、各コントロールには次の 2 つの属性があります。

  1. InitValue - コントロールの初期値
  2. IsDirty - コントロールの値が変更されたことを示すブール値
于 2009-05-19T06:00:19.500 に答える
1

これはより良い答えのようです。

1401-Using-jQuery-To-Leverage-The-OnChange-Method-Of-Inputs.htm

于 2009-08-28T13:39:57.870 に答える
1

検証プラグインを見てください。

于 2009-05-19T06:01:38.360 に答える
0

フォーム オブジェクト全体を保存し (そのまま、または .each() で反復してデータをマップに格納することにより)、同じ onSubmit を実行して両方の値を比較できるはずです。

于 2010-08-25T16:00:08.880 に答える
0

あなたができることは、ページの読み込み時にページをスキャンしてフォームをチェックし、フィールドとその値をインベントリし、入力が更新されるたびにその入力参照配列に対してチェックするように jquery スクリプトをセットアップすることです。

于 2014-09-10T14:23:24.177 に答える
0

私は以下のものをテストしていません:-)しかし、それはあなたが何を意味するのですか?

$(document).ready(function() {
    $("#myform :input").attr("init",$(this).val()).bind("change.dirty", function(evt) {
        if ($(this).val()!=$(this).attr("init")) $(this).addClass("dirty");
        else $(this).removeClass("dirty");
        $('#thebutton').attr("disabled",!$("#myform .dirty").size());
    });
});

*-カワカマス

于 2010-07-21T22:35:41.490 に答える