我正在使用验证插件。 我想验证同一形式的某些字段,当无线电值不是" 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之后只运行一次而无法工作。
我必须遗漏一些东西,一些语法......〜想法?
答案 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"});
}
}
});