基于表单中的无线电值的条件jquery验证

时间:2013-02-11 08:22:53

标签: jquery jquery-validate

我正在使用验证插件。 我想验证同一形式的某些字段,当无线电值不是" REGULAR",

<form id="registerform">
<input type="radio" name="role" value="REGULAR" checked="checked" id="role">Regular<br />
<input type="radio" name="role" value="AGENT" id="role">Agent<br />
<input type="radio" name="role" value="ORGANIZATION" id="role">Organization<br />

<input type="text" name="phone"  id="phone"><br/>
<input type="text" name="password" id="password"><br/>

<input type="text" name="work_area" id="work_area" value=""><br/>
<input type="text" name="work_phone" id="work_phone" value=""><br/>

<input type="text" name="org_name" id="org_name"><br/>
<input type="text" name="org_phone" id="org_phone"><br/>
</form>

当role ==&#34; REGULAR&#34;时,验证手机,密码
当角色==&#34; AGENT&#34;时,验证手机,密码, work_area,work_phone
当role ==&#34; ORGANIZATION&#34;时,验证手机,密码, org_name,org_phone
如何优雅地实现这一目标?
我不想把它分成不同的形式!

我的错误代码:

$(document).ready(function() {
var rule_options = 
{
    "phone": "required"
    ,"password": "required"
};

var role = $("#registerform").find("input[name=role]:checked").val();
if(role ==  "AGENT") {
    $.extend(true, rule_options, 
        {
            "work_area": "required"
            ,"work_phone": "required"
        }
    );
}

if(role ==  "ORGANIZATION") {
    $.extend(true, rule_options, 
        {
            "org_area": "required"
            ,"org_phone": "required"
        }
    );
}
jform.validate({
            errorClass : "err_label",
            rules: rule_options,
            ignore: "",

上面的代码因为在document.ready之后只运行一次而无法工作。
我必须遗漏一些东西,一些语法......〜想法?

5 个答案:

答案 0 :(得分:10)

jquery validation rules
我从上面的链接得到了我真正需要的东西。这里需要解决的是如何使jQuery验证器插件基于每个输入的无线电值表现为动态。我甚至不使用jQuery.change()方法。

function getRole() {
    return $("#registerform").find("input[name=role]:checked").val();
}

$(document).ready(function() {
    var jform = $("#registerform");
    jform.validate({
            errorClass : "err_label",
            rules: 
                "phone": "required"
                ,"password": "required"
                ,"work_area": {
                    required: function(element) {
                        return (getRole() == 'AGENT');
                    }
                }
                ,"work_phone": {
                    required: function(element) {
                        return (getRole() == 'AGENT');
                    }
                }
                ,"org_name": {
                    required: function(element) {
                        return (getRole() == 'ORGANIZATION');
                    }
                }
                ,"org_phone": {
                    required: function(element) {
                        return (getRole() == 'ORGANIZATION');
                    }
                }

如果存在其他想法,请告诉我。

答案 1 :(得分:0)

使用ignore选项。很抱歉,如果有任何语法错误,因为我无法访问我的开发工具,并且jsfiddle无法在我的计算机上运行。

编辑:我假设所有字段都是必需的。

$("form").validate({ignore: ".ignore"});

var role = {
    "REGULAR": ["work_area", "work_phone", "org_name", "org_phone"],
    "AGENT": ["org_name", "org_phone"],
    "ORGANIZATION": ["org_name", "org_phone"]
};

$("input[name=role]").click(function () {
    //reset ignore
    $("#work_area,#work_phone,#org_name,#org_phone").removeClass("ignore");

    for (var i in role[$(this).val()])
    {
        $(i).addClass("ignore");
    }
});

答案 2 :(得分:-1)

$("input[@name='role']").change(function(){
    // Rest of your code here.
});

不使用onload事件,而是将函数绑定到单选按钮。

答案 3 :(得分:-1)

每次用户点击表单或按下表单上的键时,您都可以更新验证规则。

function updateRules() {
  // Your code here
}

$('#registerform').click(function() {
  updateRules();
});

$('#registerform').keyUp(function() {
  updateRules();
});

答案 4 :(得分:-1)

问题在于你在做什么:

var role = $("#registerform").find("input[name=role]:checked").val();

及其工作,但只需要一次,因为你需要将它附加到一个事件(也许更改事件是合适的),所以每当radiobuttons以某种方式改变时,验证设置应该改变:

$("input[@name='role']").change(function(){
    if( $(this).is(":checked") ){ // check if the radio is checked
        var val = $(this).val(); // retrieve the value
        if(role ==  "AGENT") {
           $.extend(true, rule_options, {
              "work_area": "required"
             ,"work_phone": "required"});
        }
        if(role ==  "ORGANIZATION") {
           $.extend(true, rule_options, {
              "org_area": "required"
             ,"org_phone": "required"});
        }
    }
});