Jquery 验证插件不适用于动态生成的复选框
Jquery validation plugin not working on dynamic generated checkboxes
大家好,我正在使用 Jquery validation plugin,
我必须创建一个表单,该表单具有动态生成的字段,例如输入框、select 框和复选框,因此它可以完美地用于我表单的其他元素,但不适用于动态生成的复选框
查看下面的快照
为此,我的 jquery 验证码是
var educationFormValidator = $("#educationForm").validate({
rules:function(){
var primaryEducationRules = new Object();
$('.is_primary').each(function() {
primaryEducationRules[this.name] = {
require_from_group: [1, ".is_primary"],
required:true
};
});
console.log(primaryEducationRules);
return primaryEducationRules;
},
messages:function(){
var messages = new Object();
$('.is_primary').each(function() {
messages[this.name] = { required: 'Please select relevant qualification' };
});
console.log(messages);
return messages;
},
submitHandler: function(form) {
form.submit();
},
invalidHandler: function() {
console.log( educationFormValidator.numberOfInvalids() + " field(s) are invalid" );
}
});
javascript 生成动态复选框的函数
function addEducation (educationCount) {
var educationDiv = '<div class="inputRow_'+educationCount+'"><hr><br>';
educationDiv += addInstituteNameDiv (educationCount);
educationDiv += addBatchYears (educationCount);
educationDiv += addCourseType (educationCount);
educationDiv += addDegreeTypeDiv (educationCount);
educationDiv += addAddDegreeButton (educationCount);
educationDiv += '</div>';
$('.multiple-education').append(educationDiv);
//addYearsInOption(educationCount);
if(educationCount!=1){
$('#deleteDegreeBtn_'+(parseInt(educationCount)-1)).css("display","block");
$('#deleteDegreeBtn_'+educationCount).css("display","block");
}
$('#addDegreeBtn_'+ (parseInt(educationCount)-1)).css("display","none");
}
function addInstituteNameDiv (educationCount) {
var instituteNameDiv = '<div class="form-group" id="instituteName'+educationCount+'">';
instituteNameDiv += '<label style="padding-left:0;" class="col-md-2 col-sm-2 control-label" for="textinput">Institute</label>';
instituteNameDiv += '<div class="col-md-6 col-sm-6">';
instituteNameDiv += '<input name="From['+educationCount+'][otherInstitute]" class="form-control input-md" type="text" required id="instituteName_'+educationCount+'">';
instituteNameDiv += '</div>';
instituteNameDiv += '<!--<div class="col-md-1 col-sm-2"><span name="reset_'+educationCount+'" id="reset_institute_'+educationCount+'" class="suggestion-reset greentxt mt7 pull-left">Edit</span></div>-->';
instituteNameDiv += '<div class="checkbox col-md-3 col-sm-2 pdl0 col-xs-12 edu-message">';
instituteNameDiv += '<label style="padding-left:0;" for="checkboxes-0">';
instituteNameDiv += '<input class="is_primary" name="From['+educationCount+'][is_primary]" id="is_primary_'+educationCount+'" value="1" type="checkbox" onclick="setImportantEducation('+educationCount+')">';
instituteNameDiv += '<span name="primary_edu_'+educationCount+'" id="primary_edu_'+educationCount+'">This is my most relevant / important educational qualification</span>';
instituteNameDiv += '</label>';
instituteNameDiv += '</div>';
instituteNameDiv += '</div>';
return instituteNameDiv;
}
如果生成,所有字段在表格中都是必填的,但用户必须 select 从许多教育领域中至少选择 1 个相关教育
为了帮助,我也阅读了 this link
您没有在脚本中调用 addInstituteNameDiv()。此外,addInstituteNameDiv() 应该出现在验证器调用之前。
尝试
jQuery.validator.addMethod("isprimary", function (value, element) {
return $('.is_primary:checked').length == 1;
}, "Please select 1");
$.validator.addClassRules("is_primary", {
isprimary: true
});
var educationFormValidator = $("#educationForm").validate({
submitHandler: function (form) {
form.submit();
},
invalidHandler: function () {
console.log(educationFormValidator.numberOfInvalids() + " field(s) are invalid");
},
errorPlacement: function (label, element) {
if (element.hasClass('is_primary')) {
element.parent().append(label)
} else {
label.insertAfter(element);
}
}
});
演示:Fiddle
有效,但是,它包含一些不必要的代码。
消除.addClassRules()
:
您不需要 .addClassRules()
方法来简单地使用 class 应用自定义规则。 .addClassRules()
方法用于创建 "compound" 规则,此处并非如此。
如果您出于某种原因想要创建自定义规则,则可以直接应用自定义规则作为class。不需要 .addClassRules()
.
<input class="my_custom_rule" ...
大家好,我正在使用 Jquery validation plugin, 我必须创建一个表单,该表单具有动态生成的字段,例如输入框、select 框和复选框,因此它可以完美地用于我表单的其他元素,但不适用于动态生成的复选框
查看下面的快照
为此,我的 jquery 验证码是
var educationFormValidator = $("#educationForm").validate({
rules:function(){
var primaryEducationRules = new Object();
$('.is_primary').each(function() {
primaryEducationRules[this.name] = {
require_from_group: [1, ".is_primary"],
required:true
};
});
console.log(primaryEducationRules);
return primaryEducationRules;
},
messages:function(){
var messages = new Object();
$('.is_primary').each(function() {
messages[this.name] = { required: 'Please select relevant qualification' };
});
console.log(messages);
return messages;
},
submitHandler: function(form) {
form.submit();
},
invalidHandler: function() {
console.log( educationFormValidator.numberOfInvalids() + " field(s) are invalid" );
}
});
javascript 生成动态复选框的函数
function addEducation (educationCount) {
var educationDiv = '<div class="inputRow_'+educationCount+'"><hr><br>';
educationDiv += addInstituteNameDiv (educationCount);
educationDiv += addBatchYears (educationCount);
educationDiv += addCourseType (educationCount);
educationDiv += addDegreeTypeDiv (educationCount);
educationDiv += addAddDegreeButton (educationCount);
educationDiv += '</div>';
$('.multiple-education').append(educationDiv);
//addYearsInOption(educationCount);
if(educationCount!=1){
$('#deleteDegreeBtn_'+(parseInt(educationCount)-1)).css("display","block");
$('#deleteDegreeBtn_'+educationCount).css("display","block");
}
$('#addDegreeBtn_'+ (parseInt(educationCount)-1)).css("display","none");
}
function addInstituteNameDiv (educationCount) {
var instituteNameDiv = '<div class="form-group" id="instituteName'+educationCount+'">';
instituteNameDiv += '<label style="padding-left:0;" class="col-md-2 col-sm-2 control-label" for="textinput">Institute</label>';
instituteNameDiv += '<div class="col-md-6 col-sm-6">';
instituteNameDiv += '<input name="From['+educationCount+'][otherInstitute]" class="form-control input-md" type="text" required id="instituteName_'+educationCount+'">';
instituteNameDiv += '</div>';
instituteNameDiv += '<!--<div class="col-md-1 col-sm-2"><span name="reset_'+educationCount+'" id="reset_institute_'+educationCount+'" class="suggestion-reset greentxt mt7 pull-left">Edit</span></div>-->';
instituteNameDiv += '<div class="checkbox col-md-3 col-sm-2 pdl0 col-xs-12 edu-message">';
instituteNameDiv += '<label style="padding-left:0;" for="checkboxes-0">';
instituteNameDiv += '<input class="is_primary" name="From['+educationCount+'][is_primary]" id="is_primary_'+educationCount+'" value="1" type="checkbox" onclick="setImportantEducation('+educationCount+')">';
instituteNameDiv += '<span name="primary_edu_'+educationCount+'" id="primary_edu_'+educationCount+'">This is my most relevant / important educational qualification</span>';
instituteNameDiv += '</label>';
instituteNameDiv += '</div>';
instituteNameDiv += '</div>';
return instituteNameDiv;
}
如果生成,所有字段在表格中都是必填的,但用户必须 select 从许多教育领域中至少选择 1 个相关教育
为了帮助,我也阅读了 this link
您没有在脚本中调用 addInstituteNameDiv()。此外,addInstituteNameDiv() 应该出现在验证器调用之前。
尝试
jQuery.validator.addMethod("isprimary", function (value, element) {
return $('.is_primary:checked').length == 1;
}, "Please select 1");
$.validator.addClassRules("is_primary", {
isprimary: true
});
var educationFormValidator = $("#educationForm").validate({
submitHandler: function (form) {
form.submit();
},
invalidHandler: function () {
console.log(educationFormValidator.numberOfInvalids() + " field(s) are invalid");
},
errorPlacement: function (label, element) {
if (element.hasClass('is_primary')) {
element.parent().append(label)
} else {
label.insertAfter(element);
}
}
});
演示:Fiddle
消除.addClassRules()
:
您不需要 .addClassRules()
方法来简单地使用 class 应用自定义规则。 .addClassRules()
方法用于创建 "compound" 规则,此处并非如此。
如果您出于某种原因想要创建自定义规则,则可以直接应用自定义规则作为class。不需要 .addClassRules()
.
<input class="my_custom_rule" ...