2011-10-21 7 views
1

私はドロップダウンフィールドのセットを持つフォームを持っています。それぞれのフィールドのデフォルト値は「0」で、使用可能な値は1-3です。これらは、ユーザーが上位3項目を選択する優先順位選択として機能します。それぞれの選択フィールド名はユニークで、PHPのforeachループで実装されています - 私は以下の例では "N"と呼んでいます。複数のSelectフィールドで一意の特定の値を検証する必要があります

<select class="variable_priority unique required" name="select-N"> 
    <option value="0"></option> 
    <option value="1">1</option> 
    <option value="2">2</option> 
    <option value="3">3</option> 
</select> 

"0"の値は、優先順位なしの選択のデフォルト/プリセット値として使用されます。私はまだ検証する必要がある、しかし

$('.variable_priority').each(function() { 
      if ($(this).val() === value && $(this).val() > 0) { 
       timeRepeated++; 
      } 
     }); 

:技術described hereを使用して、私は正常クラス「variable_priority」を比較することによって、ユーザーが複数のドロップダウンに1、2または3を選択することができないことを保証するためにjQueryの検証を変更しましたユーザーが実際に選択フィールドのいずれかに1,2および3の値を入力し、スキップしていないことを確認します。誰も私にJQueryの検証のコンテキスト内でこれを行う方法に関するいくつかのガイダンスを与えることができますか?

+1

値を追加して、それらがすべてではないことを確認してください。2 –

+0

@Diodeus - 提案をありがとう。私はJavaScript初心者ですから、セレクタに基づいて値の文字列を集計するのは簡単な方法ですか?たとえば、以下の答えでは、select.variable_priorityに基づいて選択されています。そして、それは= 6、すなわち1 + 2 + 3でなければならないと仮定します。 – elshaddai

答えて

2

JSフィドルで要件を再作成した後。 http://jsfiddle.net/halfcube/aLvc6/

私はあなたの条件にこの多分もっと近いと思う

HTML

<div class="selects"> 
    <select class="variable_priority unique required" name="select[]" required> 
     <option value="0">Select</option> 
     <option value="1">1</option> 
     <option value="2">2</option> 
     <option value="3">3</option> 
    </select> 
    <select class="variable_priority unique required" name="select[]" required> 
     <option value="0">Select</option> 
     <option value="1">1</option> 
     <option value="2">2</option> 
     <option value="3">3</option> 
    </select> 
    <select class="variable_priority unique required" name="select[]" required> 
     <option value="0">Select</option> 
     <option value="1">1</option> 
     <option value="2">2</option> 
     <option value="3">3</option> 
    </select> 
    <select class="variable_priority unique required" name="select[]" required> 
     <option value="0">Select</option> 
     <option value="1">1</option> 
     <option value="2">2</option> 
     <option value="3">3</option> 
    </select> 
</div> 
<div class="value"> 
    0 
</div> 

CSS

.valid{ 
    box-shadow:0 0 10px green; 
    -webkit-box-shadow:0 0 10px green; 
    -moz-box-shadow:0 0 10px green; 
} 

JavaScriptを今すぐ

$(document).ready(function() { 

    function checkSelected(val) { 
     var ret = false; 
     $(".variable_priority").each(function() { 
      if ($(this).val() === val) { 
       ret = true; 
      } 
     }); 
     return ret; 
    } 

    function totalValue() { 
     var total = 0; 
     $(".variable_priority:first option[value!=0]").each(function() { 
      total = total + parseInt($(this).val(), 10); 
     }); 
     return total; 
    } 
    function totalSelectedValue(){ 
     var total = 0; 
     $(".variable_priority option:selected").each(function() { 
      total = total + parseInt($(this).val(), 10); 
     }); 
     return total; 
    } 
    $('.value').html(totalValue()); 
    $('.variable_priority').change(function() { 
    //  variable_priority = variable_priority + parseInt($(this).val(), 10); 
     $('.value').html(totalSelectedValue() + " out of " + totalValue()); 

     $('option', this).each(function() { 
      if (checkSelected($(this).val()) && $(this).val() !== "0") { 
       $('.variable_priority option[value=' + $(this).val() + ']').attr('disabled', true); 
      } else { 
       $('.variable_priority option[value=' + $(this).val() + ']').removeAttr('disabled'); 
      } 
     }); 
     if (totalSelectedValue() === totalValue()) { 
      $('.selects').removeClass('invalid').addClass('valid'); 
     } else { 
      $('.selects').removeClass('valid').addClass('invalid'); 
     } 
    }); 
}); 

私は戻って取得する必要があります仕事。

はこれを試してみてください

+0

仕事と洞察力に感謝します。私はそれがページ上でどのように機能しているのか、さまざまなバリデーションをどのように統合したのが大好きです。しかし、私が知る限り、選択された値(1,2,3)の項目が "無効"に設定されているので、情報は$ _POSTデータを持つ次のフォームページに渡されません。私は0の値で5つのデータセットの配列を取得していますが、1,2または3ではありません。これらの値がどのように渡されるかについての考えはありますか? – elshaddai

+0

心配しないでください - 私はいくつかのバインディングコード[ここにあります]を使ってこれを解決することができました(http://stackoverflow.com/questions/1191113/disable-select-form-field-but-still-send-the-value/1191365)。 #1191365): \t \t \t $( 'フォーム')バインド( '提出' 関数(){ \t \t \t \t $(この).find( 'オプション')removeAttr( '無効'); 。 \t \t \t}); – elshaddai

0

私はまずブラウザーでほとんどの作業を行いますので、良いメッシュにはrequireddisabledselectedのようなHTML5属性を使用します。

あなたはこのようなことを試すことができます。

<select class="variable_priority unique required" name="select-N" required> 
    <option value="0" disabled></option> 
    <option value="1">1</option> 
    <option value="2">2</option> 
    <option value="3">3</option> 
</select> 

これにより、ユーザーは、彼らが再びblankを選択することはできませんオプションを選択すると、ブラウザは、デフォルト値としてblankを表示することを可能にするために十分でなければなりません。

安全なメッシュのために、フォームが有効であることを確認するために、フォーム送信イベントにバインドされたJavaScriptサイド検証を行います。

このようなものです。

$("form").bind("submit",function(){ 
    if($("select.variable_priority :selected").length >= $("select.variable_priority").length){ 
    return true; 
    }else{ 
    return false; 
    } 
}); 

この文は、ページ上のドロップダウンの合計数と比較しselectedドロップダウンのカウントをチェックする場合。一致した場合、フォームは有効です。

私はこれがあなたを助けてくれることを願っています。

+0

考えてくれてありがとう。私はまだHTML5に行くことができませんが、洞察に感謝します。検証コードに関しては、これを試しました。 'if($(" select.variable_priority:selected ")。length == 8)' 私のテストケースでは、私のselectオブジェクトには8つのオプションがあります。上記のスクリプトは、長さ== 8の場合にのみtrueを返します。優先度1,2,3の3つのエントリが有効であることを検証するには、長さ== 3でなければなりません。値を返さないようにデフォルトのオプションを変更しましたが、何らかの形でまだカウントされています。合計に対して:選択されています。 – elshaddai

+0

私はあなたが 'フィールドのセットを持っていて、それぞれ0,1,2,3の値を持っています。フィールドのうちの1つをマークする3つのフィールドで選択する必要があります。 "2"と1 "3"。二重引用符と3つの値のすべてを選択し、他の値は「0」にしてください。私は、答えの値を合計し、それらが= 6(1 + 2 + 3)になるまでfalseを返すことによって検証を行っています。それは動作しますが、エラーメッセージは全体的にではなくフィールドレベルで処理されるため、やや複雑です。また、私は独自の答えreqのための別の検証を使用する必要があります。 '\t \t varsum:ここ – elshaddai

0

を楽しむ:

<script>$(document).ready(function() { 
$('select').change(function() { 
    $('option[value=' + $(this).val() + ']').attr('disabled', 'disabled'); 
}); 

});

関連する問題