jqueryvalidation – 远程方法在有效后不会触发

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":"The User Name you chose is already in use. Please enter another name."} 

有效(唯一)响应:

 {"error":"false","errorMessage":""} 

编辑

在SO上看到这个:

https://stackoverflow.com/a/1821667/335514

 $("#site").change(function() { $("#email").removeData("previousValue"); }); 

因此插件似乎缓存了响应。 插件是否有关闭缓存的方法,或者是否会在ajax调用中添加cache: false执行相同的操作?

编辑

这些方法都没有奏效。 看起来,一旦字段被标记为有效,它将不再进行远程呼叫。 关于如何解决的想法? 将函数放入自己的addMethod会阻止这种情况吗?

UPDATE /解决方案:

查看jquery.validate.js的源代码,特别是这个片段:

 success: function(response) { validator.settings.messages[element.name].remote = previous.originalMessage; var valid = response === true; if ( valid ) { ... 

由于响应被评估为JSON,因此您应该调用return "true" 。 这也在文档中指出

“响应被评估为JSON,对于有效元素必须为true”

但是,如果忽略以下事实隐式设置dataType: json ,那么在查看完全等于 test的源代码时可能会非常混乱。

结束更新


在调查了一些之后,我会说你的’dataFilter’不应该回归’成功’

请参阅回调函数队列@ http://api.jquery.com/jQuery.ajax/

成功接收响应数据后立即调用dataFilter回调。 它接收返回的数据和dataType的值,并且必须返回(可能已更改的)数据以传递给成功。

我的猜测是你的JS试图return success ,因此没有发送进一步的validation请求

我有相同的症状,但它是由一个不同的问题引起的。

看起来jQuery远程validation方法如果认为字段的值没有改变,则不会触发另一个ajax调用。 这对我来说是有问题的,因为我有远程validation,在表格中的两个字段上validation:手机号码(IE 555-123-1234)和国家代码(IE 1表示美国)。

如果手机号码没有变化,但国家代码没有变化,我们需要重新validation。 但是,如果validation绑定到移动号码字段,则插件不会再进行另一个ajax调用,因为其值未更改。

您可以在远程方法中查看插件执行此缓存的位置:

 if ( previous.old === optionDataString ) { return previous.valid; } 

该插件使用jQuery的$ data方法和“previousValue”键存储前一个值。 因此,在我的情况下,我所要做的就是清除这个值:

 $("#my-phone-number-element").removeData("previousValue"); $("#my-phone-number-element").valid();