email1: { required: true,blacklist: true,beanEmailValidator: true,minlength: 6,maxlength: 70,remote: { type: "GET",url: llbFieldValJSONURL,data: { fieldData : function() { return $("#enterEmail").val(); } },dataType:"json",dataFilter: function(data) { var json = jQuery.parseJSON(data); if(json.error == "true") { return "\"" + json.errorMessage + "\""; } else { return success; } } } }
此函数检查用户名的唯一性,如果不是唯一的,则返回错误.问题是远程方法在有效之后不会进行任何额外的调用.每次输入/更改值时我都需要它.
例如,如果我输入3个非唯一用户名,则每次都会进行调用.如果我输入唯一的用户名,则调用正确,用户名将恢复为有效.所以该领域是有效的.现在,如果我输入另一个非唯一(无效)用户名,则远程方法不会再次触发.
想知道它是否以某种方式缓存响应?
无效(非唯一)响应:
{"error":"true","errorMessage":"<b>The User Name you chose is already in use.</b> Please enter another name."}
有效(唯一)响应:
{"error":"false","errorMessage":""}
编辑
在SO上看到这个:
https://stackoverflow.com/a/1821667/335514
$("#site").change(function() { $("#email").removeData("prevIoUsValue"); });
因此插件似乎缓存了响应.插件是否有关闭缓存的方法,或者是否会在ajax调用中添加缓存:false执行相同的操作?
编辑
这些方法都没有奏效.看起来,一旦字段被标记为有效,它将不再进行远程呼叫.关于如何解决的想法?将函数放入自己的addMethod会阻止这种情况吗?
解决方法
查看jquery.validate.js的源代码,特别是这个片段:
success: function(response) { validator.settings.messages[element.name].remote = prevIoUs.originalMessage; var valid = response === true; if ( valid ) { ...
由于响应被评估为JSON,因此您应该调用return“true”.这也在documentation中指出
“The response is evaluated as JSON and must be true for valid elements”
但是,如果忽略以下事实隐式设置dataType:json,那么在查看完全等于test的源代码时可能会非常混乱.
结束更新
在调查了一些之后,我会说你的’dataFilter’不应该回归’成功’
请参阅回调函数队列@ http://api.jquery.com/jQuery.ajax/
dataFilter callback is invoked immediately upon successful receipt of
response data. It receives the returned data and the value of
dataType,and must return the (possibly altered) data to pass on to
success.
我的猜测是你的JS试图返回成功,因此没有发送进一步的验证请求