Javascript 如何对绑定字段进行远程jquery验证?
假设我有两个输入字段-它们的组合必须是唯一的。 它们中的每一个都会触发远程验证方法——这两个字段的方法都是相同的。如果组合是唯一的,则返回true。 问题如下:在验证错误后,我更改了字段(未标记为错误),即使方法返回true(这对字段是唯一的),错误字段仍被认为是错误的 我甚至不需要向服务器发出额外的请求,因为这对夫妇是独一无二的!我只需要清除字段的错误,标记为错误。然而,我还没有做到这一点——似乎jquery没有为此提供功能 有什么想法吗 相关代码非常庞大,但关键部分如下:Javascript 如何对绑定字段进行远程jquery验证?,javascript,jquery,jquery-validate,Javascript,Jquery,Jquery Validate,假设我有两个输入字段-它们的组合必须是唯一的。 它们中的每一个都会触发远程验证方法——这两个字段的方法都是相同的。如果组合是唯一的,则返回true。 问题如下:在验证错误后,我更改了字段(未标记为错误),即使方法返回true(这对字段是唯一的),错误字段仍被认为是错误的 我甚至不需要向服务器发出额外的请求,因为这对夫妇是独一无二的!我只需要清除字段的错误,标记为错误。然而,我还没有做到这一点——似乎jquery没有为此提供功能 有什么想法吗 相关代码非常庞大,但关键部分如下: this.clea
this.clearErrors = function ($elements) {
var $validator = $elements.first().closest('form').validate();
$elements.each(function(index, item) {
var $parent = $(item).parent();
var element = $(item).get(0);
if ($parent.is('td')) {
$parent.removeClass(window.resources.errorCellClass);
}
$parent.find('span.' + window.resources.errorSpanClass).remove();
$validator.successList.push(element);
delete $validator.invalid[element.name];
delete $validator.submitted[element.name];
});
};
//Fixing remote method, since original one returned "pending" status all the time, as reported in other stackoverflow question
$.validator.addMethod('synchronousRemote', function (value, element, param) {
if (this.optional(element)) {
return 'dependency-mismatch';
}
var previous = this.previousValue(element);
if (!this.settings.messages[element.name]) {
this.settings.messages[element.name] = {};
}
previous.originalMessage = this.settings.messages[element.name].remote;
this.settings.messages[element.name].remote = previous.message;
if (typeof param == 'string') {
param = { url: param }
}
if (previous.old === value) {
return previous.valid;
}
previous.old = value;
var validator = this;
this.startRequest(element);
var data = {};
data[element.name] = value;
var valid = 'pending';
$.ajax($.extend(true, {
url: param,
async: false,
mode: 'abort',
port: 'validate' + element.name,
dataType: 'json',
data: data,
success: function (response) {
validator.settings.messages[element.name].remote = previous.originalMessage;
valid = response === true || response === 'true';
if (valid) {
var submitted = validator.formSubmitted;
validator.prepareElement(element);
validator.formSubmitted = submitted;
validator.successList.push(element);
delete validator.invalid[element.name];
validator.showErrors();
} else {
var errors = {};
var message = response || validator.defaultMessage(element, 'remote');
errors[element.name] = previous.message = $.isFunction(message) ? message(value) : message;
validator.invalid[element.name] = true;
validator.showErrors(errors);
}
previous.valid = valid;
validator.stopRequest(element, valid);
}
}, param));
return valid;
});
$root.filter(':input[data-excluded-values-method]:not([readonly])').add($root.find(':input[data-excluded-values-method]:not([readonly])')).each(function () {
var $element = $(this);
$element.validate({
onkeyup: false
})
var $entityContainer = $element.closest('[data-entity]');
var $keyFields = $entityContainer.filter('INPUT[data-is-key]:not([disabled])').add($entityContainer.find('INPUT[data-is-key]:not([disabled])'));
var localizedNames = [];
$keyFields.each(function () {
localizedNames.push($(this).attr('localized-name'));
});
$element.rules('add',
{
synchronousRemote: function () {
var key = [];
var keyIsUnique = true;
$keyFields.each(function () {
key.push($(this).val());
});
return {
url: $element.attr('data-excluded-values-method'),
type: 'POST',
async: false,
data: JSON.stringify({
key: key,
entityType: $entityContainer.attr('data-entity')
}),
contentType: 'application/json; charset=utf-8',
dataType: 'json',
dataFilter: function (isUnique) {
keyIsUnique = isUnique;
return isUnique;
},
complete: function () {
if (keyIsUnique === 'true') {
window.commonUtils.clearErrors($keyFields.filter('[name!="' + $element.attr('name') + '"]:input[data-excluded-values-method]:not([readonly])'));
}
}
}
},
messages: {
synchronousRemote: $.validator.format(window.resources.notUniqueValidationError)(localizedNames.join(' + '))
}
});
});
我已经调试了jquery validate方法,并找到了要清除验证错误还应该设置的内容:
$validator.previousValue(element).valid = true;
现在一切正常。各位,请停止投票!如果你没什么可说的,就过去吧!我试着把我的问题描述得尽可能简短,这样你就更容易理解这个问题了。后来,我添加了代码,甚至添加了适合我的解决方案。然而,有一个非常聪明的人一直在投反对票。。。天知道,事实上这对我很有用。在这里,几乎所有与此相关的问题都与“规则”有关,因为这是一种“方法”。我完全理解其中的区别,但有时你需要一个方法而不是规则,原因与此无关。因此,答案似乎是,如果你需要使用远程方法(而不是规则),那么你需要从插件中破解相关的规则代码,并一字不差地重复使用。如果您错过了一个或多个神奇的咒语,那么您将填充错误处理。Phillw-是的,看起来jquery在某些情况下需要被黑客攻击才能正常工作。曾经在jquery库中遇到另一个问题并决定升级到最新版本。结果:事实证明,所需的功能根本没有在那里实现。因此,我不得不使用我的原型回滚并修补一些方法:)