2011-10-21 41 views
1

我有一組帶有下拉字段的表單,其中每個表單都具有默認值「0」和可用值1-3。這些作爲優先選擇,用戶選擇他們的前3項。每個選擇字段名稱都是唯一的,並填充到PHP foreach循環中 - 我只是在下面的示例中將其稱爲「N」。需要通過多個選擇字段驗證唯一的特定值

<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」值用作非優先選擇的默認值/預設值。使用技術described here,我已成功修改JQuery驗證,以確保通過比較級「variable_priority」,在超過一個下拉列表,用戶可以不挑1,2或3:

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

不過,我仍然需要驗證用戶確實在任何選擇字段中輸入了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)的

+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

我首先會讓瀏覽器做大部分的工作,所以我會使用HTML5屬性,如requireddisabledselected以獲得良好的效果。

你可以嘗試這樣的事情。

<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; 
    } 
}); 

這個if語句將檢查相比,頁面上的下拉列表總數的selected下拉列表中選擇計數。如果它們匹配,那麼表單是有效的。

我希望這可以幫助你。

+0

感謝您的想法。我目前還無法訪問HTML5,但我很欣賞這種見解。至於驗證碼,我試過了: 'if($(「select.variable_priority:selected」)。length == 8)' 在我的測試用例中,我的select對象有8個選項。上面的腳本只有長度== 8纔會返回true。它應該是長度= 3來驗證三個條目已經作出,即優先級值1,2和3.我已經修改了我的默認選項不返回值(),但不知何故它們仍然被計算在內總數:選中。 – elshaddai

+0

我想到你使用多選的'字段,每個字段的值分別爲0,1,2或3.我需要用戶在三個字段中進行選擇,標記其中一個字段「1」,其中一個「2」和一個「3」。必須選擇任何模糊和所有三個值,而將其他值設爲「0」。我通過總結答案的值並返回false直到他們= 6(1 + 2 + 3)來驗證工作。它可以工作,但是錯誤消息傳遞是在字段級而不是全局下處理的,所以它有點奇怪。另外,我必須對唯一的答案req使用單獨的驗證。 – elshaddai

0

試試這個:

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

});

相關問題