2009-11-16 115 views
2

我在我正在構建的表單上使用jQuery驗證插件(http://docs.jquery.com/Plugins/Validation)。該表格由6個字段組成,每個字段包含3個用於電子郵件地址,名字和姓氏的文本輸入。標記的簡化版本如下:jQuery驗證 - 基於其他字段更改「必需」屬性

<form id="ref" action="submit.php" method="post"> 
    <fieldset id="ref_1"> 
     <input id="ref_1_email" type="text" /> 
     <input id="ref_1_fname" type="text" /> 
     <input id="ref_1_lname" type="text" /> 
    </fieldset> 
    <fieldset id="ref_2"> 
     <input id="ref_2_email" type="text" /> 
     <input id="ref_2_fname" type="text" /> 
     <input id="ref_2_lname" type="text" /> 
    </fieldset> 
    <fieldset id="ref_3"> 
     <input id="ref_3_email" type="text" /> 
     <input id="ref_3_fname" type="text" /> 
     <input id="ref_3_lname" type="text" /> 
    </fieldset> 
</form> 

等等,直到ref_6。但是,用戶不一定需要完成每個字段 - 他們可能只會選擇填寫fieldset#ref_1和fieldset#ref_2內的輸入,並將其他字段留空。但是,例如,如果他們輸入了ref_1的電子郵件,則還需要ref_1的名字和姓氏。所以我需要做的是檢查一個字段集中的所有3個輸入。如果它們全部是空白的,則可以忽略它們,但是如果其中一個輸入被填充,則兩個鄰居也必須完成。到目前爲止,我所有的嘗試都非常麻煩(注意每個人的改變,然後評估是否空着......),任何幫助都會很大,非常感謝。

感謝

更新:

我發現一個帖子有類似的問題,有建議的解決方案之中:

$('#emailToName2').keyup(function() { 
    $('#emailToAddress2').toggleClass('required', $(this).val()); 
}); 

但這需要重複對每個輸入上述邏輯,這對我來說似乎有點矯枉過正。什麼會是一個更動態的方法?

乾杯!

回答

3

指示需要字段時,可以指定expressioncallback。驗證插件將在驗證字段之前評估表達式或回調。

下面是一個例子:

$("#ref").validate({ 
    rules: { 
    ref_1_email: { 
     required: function(element) { 
     return $("#ref_1_fname").val() || $("ref_1_lname").val(); 
     } 
    } 
    } 
}); 
$("#ref_1_email").blur(function() { 
    $("#ref_1_fname").valid(); 
    $("#ref_1_lname").valid(); 
}); 

很可能有一些重構,你可以做,這樣你就不必再重複所有這一切都爲每個字段...

+0

感謝您的建議。我試圖完成這項工作,但它似乎對其他「相關」字段應用一類「有效」,而不管它們是否爲空。有任何想法嗎? – AlvinRow 2009-11-16 15:36:17

+0

如果第一部分中的其他字段中有一個值具有值,則此示例實際上只是使第一部分中的電子郵件處於必需狀態。在'blur'事件處理程序可以正常工作之前,您需要爲其他字段設置類似的規則... – bdukes 2009-11-16 19:07:47

0

沒試過也不正確書面形式:

$("#ref input").keyup(function() { 
$(this).parents("fieldset").children("input").toggleClass("required", $(this).val()); 
}); 
3

您可以編寫自己的自定義驗證類,用於評估2個輸入的其中一個是否已完成。

例如。

jQuery.validator.addMethod('MyOwnValidator', function(value, element) { 
    var required = false; 
    $(element).parent().children('input').each(function() { 
     if($(this).val() && $(this).attr('id') != $(element).attr('id')){ 
      required = true; 
     } 
    }); 
    return !required; 
}); 

這將評估是否有任何兄弟輸入有一個值,如果他們這樣做,使呼叫輸入需要。

+0

這幾乎就在那裏!以下是我的規則(我將函數checkSiblings重命名爲): [code] $('#ref')。validate({rules:{ref_1_email:{required:function(element){checkSiblings:true}} ,ref_1_fname:{required:function(element){checkSiblings:true}},ref_1_lname:{required:function(element){checkSiblings:true}}}}); [/ code] 但唯一的問題是,如果我清除所有的字段,它仍然按要求標記它們,因此表單不能被提交。有任何想法嗎?非常感謝(給大家!) – AlvinRow 2009-11-17 11:00:13

0

你不能在一個循環內完成所有操作,因爲你需要在切換類之前檢查兄弟姐妹。但是,您可以定義一個可檢查和應用的小型循環函數,但您需要多次調用它才能保持邏輯。

試試這個:

var loop = function(target, fn) { 
    var t = 0, fn = fn || function(){}; 
    $(target).siblings().andSelf().each(function(i, el) { 
     t += $(el).val().length; 
     fn(el); 
    }); 
    return t; 
} 
$('fieldset input').each(function() { 
    $(this).bind('blur', function(e) { 
     if(loop(e.target)) { 
      loop(e.target, function(el) { 
       $(el).toggleClass('required', !$(el).val().length); 
      }) 
     } else { 
      loop(e.target, function(el) { 
       $(el).removeClass('required'); 
      }) 
     } 
    }); 
}); 
0

只是調查這一個項目。根據文檔,以下應該做你想要的。

當第一次調用表單上validate,像這樣做:

$("#emailRecsForm").validate({ 
    rules: { 
     ref_1_email: { 
     required: ("#ref_1_fname:filled" || "#ref_1_lname:filled"), 
     email: true 
     }, 
     ref_1_fname: { 
     required: ("#ref_1_email:filled" || "#ref_1_lname:filled") 
     }, 
     ref_1_lname: { 
     required: ("#ref_1_email:filled" || "#ref_1_fname:filled") 
     }, 

     ref_2_email: { 
     required: ("#ref_2_fname:filled" || "#ref_2_lname:filled"), 
     email: true 
     }, 
     // And so on... 
    } 
}); 

此外,確保每個input S的有一個name屬性等同於它id

我自己實際上沒有嘗試過,但通過the docs(請參閱required(dependency-expression))來判斷,它應該有效。

相關問題