覆盖 jQuery 验证中的错误
Overwriting an error in jQuery Validate
我已经能够在定义规则时使用 remote method for jQuery Validate 来包含 Ajax 调用以检查电子邮件是否在使用中。如果电子邮件已经在数据库中,messages
选项包含 html 用于显示的错误标签:
messages: {
email: {
remote: "<button type='button' id='load_details'>Load</button> this users details?"
}
}
接下来我设置一个功能,点击此按钮,必要的用户详细信息将填写表格。一旦发生这种情况,就需要删除错误。
$.ajax({
// ajax call
...
success: function (data) {
// update necessary fields
$('#first_name').val(data.first_name);
$('#last_name').val(data.last_name);
$('#phone').val(data.phone);
var validator = $('#addProduct_form').validate(); // access the validator
var element = $('#email'); // store the element
validator.settings.success(element); // something to overwrite the error
// undo the error placement
$('#email').parent().removeClass('error-control');
$('label[for="email"].error').hide();
}
});
虽然这从视觉上消除了错误,但这并不是解决方案。我使用 invalidHandler
选项在表单提交上设置测试,但由于此错误仍会触发该测试。
invalidHandler: function (event, validator) {
var errors = validator.numberOfInvalids();
if (errors) {
var message = errors == 1
? 'You missed 1 field. It has been highlighted'
: 'You missed ' + errors + ' fields. They have been highlighted';
$("div.error span").html(message);
$("div.error").show();
} else {
$("div.error").hide();
}
},
因此表单不会提交,错误只会再次显示。此外,如果用户再次单击该字段,无论他们实际更改了什么,都会重新显示错误。
是否有一个优雅的解决方案,以便在单击按钮时出现 removed/overwritten 错误?不仅仅是绕过我的 invalidHandler 函数的方法吗?覆盖错误的东西应该可以解决提交和重新单击该字段的问题。
一个可能的解决方案是使用一个变量来检查是否应用规则,所以结构可以是这样的
jQuery(function($) {
var dataloaded = false;
jQuery('#addProduct_form').validate({
rules: {
email: {
remote: {
param: {
//your ajax settings
},
depends: function() {
return !dataloaded;
}
}
}
},
messages: {
email: {
remote: "<button type='button' id='load_details'>Load</button> this users details?"
}
}
});
jQuery('#addProduct_form').on('click', '#load_details', function() {
//do the ajax request here and on success set
dataloaded = true;
$('#email').valid();
});
});
演示:Fiddle
另一种是删除规则本身,如
jQuery('#addProduct_form').on('click', '#load_details', function() {
//do the ajax request here and on success set
$('#email').rules('remove','remote');
$('#email').valid();
});
演示:Fiddle
我已经能够在定义规则时使用 remote method for jQuery Validate 来包含 Ajax 调用以检查电子邮件是否在使用中。如果电子邮件已经在数据库中,messages
选项包含 html 用于显示的错误标签:
messages: {
email: {
remote: "<button type='button' id='load_details'>Load</button> this users details?"
}
}
接下来我设置一个功能,点击此按钮,必要的用户详细信息将填写表格。一旦发生这种情况,就需要删除错误。
$.ajax({
// ajax call
...
success: function (data) {
// update necessary fields
$('#first_name').val(data.first_name);
$('#last_name').val(data.last_name);
$('#phone').val(data.phone);
var validator = $('#addProduct_form').validate(); // access the validator
var element = $('#email'); // store the element
validator.settings.success(element); // something to overwrite the error
// undo the error placement
$('#email').parent().removeClass('error-control');
$('label[for="email"].error').hide();
}
});
虽然这从视觉上消除了错误,但这并不是解决方案。我使用 invalidHandler
选项在表单提交上设置测试,但由于此错误仍会触发该测试。
invalidHandler: function (event, validator) {
var errors = validator.numberOfInvalids();
if (errors) {
var message = errors == 1
? 'You missed 1 field. It has been highlighted'
: 'You missed ' + errors + ' fields. They have been highlighted';
$("div.error span").html(message);
$("div.error").show();
} else {
$("div.error").hide();
}
},
因此表单不会提交,错误只会再次显示。此外,如果用户再次单击该字段,无论他们实际更改了什么,都会重新显示错误。
是否有一个优雅的解决方案,以便在单击按钮时出现 removed/overwritten 错误?不仅仅是绕过我的 invalidHandler 函数的方法吗?覆盖错误的东西应该可以解决提交和重新单击该字段的问题。
一个可能的解决方案是使用一个变量来检查是否应用规则,所以结构可以是这样的
jQuery(function($) {
var dataloaded = false;
jQuery('#addProduct_form').validate({
rules: {
email: {
remote: {
param: {
//your ajax settings
},
depends: function() {
return !dataloaded;
}
}
}
},
messages: {
email: {
remote: "<button type='button' id='load_details'>Load</button> this users details?"
}
}
});
jQuery('#addProduct_form').on('click', '#load_details', function() {
//do the ajax request here and on success set
dataloaded = true;
$('#email').valid();
});
});
演示:Fiddle
另一种是删除规则本身,如
jQuery('#addProduct_form').on('click', '#load_details', function() {
//do the ajax request here and on success set
$('#email').rules('remove','remote');
$('#email').valid();
});
演示:Fiddle