在用jquery.validate.js做输入验证中,用到了对某个字段重复性的判断,就是在某字段的验证中使用remote进行输入时用ajax不断向后台发送请求,但是奇怪的是,在你在data:{}中用name作为属性名,传到后台时,值丢了!?是的值没了,用的post方法,formdata里该属性为空,所以就无法进行验证了.解决方法就是改一下前台的属性名,可能jquery.validate这个插件的name是个关键字,不可以作为ajax的数据属性值。
---------------------------------2017-11-27-------------------------------------------------------
我上述的推测是错误的,如果误导了一些朋友深感抱歉。与同事仔细探究了一番才发现,对某个input用remote输入验证时,不需要在data属性中指定这个input的value,因为源码中已经自动获取了该input的nam与value,并在封装的ajax中作为data中的参数传到后端,所以如果仅仅只是对此字段验证的话,data中可以什么都不需要写。
下面是源码中对remote的描述:
remote: function (value, element, param)//element指input的dom元素,value是被验证的值,param是remote对象
{
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;
param = typeof param == "string" && { url: param} || param;
if (this.pending[element.name])
{
return "pending";
}
if (previous.old === value)
{
return previous.valid;
}//缓存设置
previous.old = value;
var validator = this;
this.startRequest(element);
var data = {};
data[element.name] = value;//这一步就是将dom元素的name和value作为data中的参数
$.ajax($.extend(true, {
url: param,
mode: "abort",
port: "validate" + element.name,
dataType: "json",
data: data,
success: function (response)
{
validator.settings.messages[element.name].remote = previous.originalMessage;
var valid = response === true;
if (valid)
{
var submitted = validator.formSubmitted;
validator.prepareElement(element);
validator.formSubmitted = submitted;
validator.successList.push(element);
validator.showErrors();
} else
{
var errors = {};
var message = response || validator.defaultMessage(element, "remote");
errors[element.name] = previous.message = $.isFunction(message) ? message(value) : message;
validator.showErrors(errors);
}
previous.valid = valid;
validator.stopRequest(element, valid);
}
}, param));//这里将默认参数与我们在remote中写的参数进行合并,相同的属性后者覆盖
return "pending";
}