11
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");
});

所以插件似乎正在缓存响应。插件是否有关闭缓存的方法,或者cache: false在 ajax 调用中添加一个可以做同样的事情?

编辑

这些方法都不起作用。似乎一旦一个字段被标记为有效,它就不会再次进行远程调用。关于如何修复的想法?将函数放入它自己的 addMethod 会阻止这种情况吗?

4

2 回答 2

8

更新/解决方案:

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

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

    if ( valid ) {   ...

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

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

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

结束更新


在进行更多调查后,我会说您的“dataFilter”不应该返回“成功”

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

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

我的猜测是您的 JS 在尝试执行时中断return success,因此不会发送进一步的验证请求

于 2012-07-15T23:29:43.243 回答
7

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

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

如果手机号码没有变化,但国家代码有变化,我们需要重新验证。但是,如果验证绑定到手机号码字段,插件不会进行另一个 ajax 调用,因为它的值没有改变。

您可以在远程方法中看到插件在哪里进行缓存:

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

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

$("#my-phone-number-element").removeData("previousValue");
$("#my-phone-number-element").valid();
于 2016-04-25T17:17:33.923 回答