jquery验证 - 远程方法在有效后不会触发

时间:2012-07-13 22:55:29

标签: jquery jquery-validate

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调用中添加cache: false会做同样的事情吗?

修改

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

2 个答案:

答案 0 :(得分:8)

<强> UPDATE /溶液

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

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

    if ( valid ) {   ...

由于响应被评估为JSON,因此您需要调用return "true"。这也在documentation

中指出
  

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

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

结束更新


经过调查,我会说'dataFilter'不应该返回'成功'

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

  

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

我的猜测是你的JS试图做return success而没有发送进一步的验证请求

答案 1 :(得分:5)

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

如果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();