jQuery Validate插件在成功进行远程验证时未在输入元素上设置有效类

时间:2012-04-16 05:44:32

标签: jquery-validate

所以这就是问题所在。我有一个使用JörnZaefferer的jQuery Validation插件验证的表单。除了一个组件,即远程验证,我的验证工作正常。实际上,远程验证确实有效但不是预期的。当我在用户名输入中输入一些数据并“聚焦”时,数据在服务器上验证,并且根据用户名可用性,服务器以字符串true或false响应。现在,在客户端,我希望验证插件根据服务器的响应将“错误”或“有效”类添加到输入元素。插件在从服务器收到错误的响应字符串时会添加“错误”类,但在收到真正的响应字符串时无法添加“有效”类。

如果在用户名输入内部点击并第二次关注,请添加神秘感,瞧!有效的类被添加。需要注意的一点是:由于输入字段数据没有改变,远程Ajax验证不会在第二个焦点上运行。插件只是根据从服务器收到的最后一个响应(我认为)来添加类。怪异。

最初,我认为问题可能是异步Ajax造成的。但我把它改为同步。问题持续存在。我已经在Firebug控制台中彻底检查了服务器的响应。我可以看到“真”或“假”字符串(没有引号)作为回应。

我还添加了errorLabelContainer(虽然我不需要它)来检查它是否正在接收任何内容。在这里,错误时errorLabelContainer选择器收到错误消息,但成功时它仍然是空白。

我需要设置有效的类,因为我用它来改变CSS中的输入背景以便向用户显示视觉指示。

这是我的验证码:

$('.registration-form').validate({
    debug           : true,
    onkeyup         : false,
    errorLabelContainer: '.message-box',
    onfocusout      : function(element) { var isvalid = $(element).valid(); console.log(isvalid); },
    rules           : { username                    : { required: true, alphanumeric: true, minlength: 3, remote: { url     : ajaxVars.ajaxurl,
                                                                                                                    type    :'POST',
                                                                                                                    async   : false,
                                                                                                                    cache   : false,
                                                                                                                    timeout : 5000,
                                                                                                                    data    : { action: 'check_username',
                                                                                                                                username: function() { return $('input[name="username"]').val(); },
                                                                                                                                _ajax_nonce: ajaxVars._ajax_nonce
                                                                                                                    }
                                                                                                        }
                                                    },
                        email                       : { required: true, email: true, remote: {  url     : ajaxVars.ajaxurl,
                                                                                                type    :'POST',
                                                                                                async   : false,
                                                                                                cache   : false,
                                                                                                timeout : 5000,
                                                                                                data    : { action: 'check_email',
                                                                                                            email: function() { return $('input[name="email"]').val(); },
                                                                                                            _ajax_nonce: ajaxVars._ajax_nonce
                                                                                                        }
                                                                                                }
                                                    },
                        password                    : { required: true, minlength: 5 },
    }, // end rules
    messages        : { username                    : { required        : 'Please enter a username.',
                                                        alphanumeric    : 'Your username must be atleast 3 characters long and must only include alphabets, numbers or an underscore.',
                                                        minlength       : 'Your username must be atleast 3 characters long and must only include alphabets, numbers or an underscore.',
                                                        remote          : 'This username is already taken!'
                        },
                        email                       : { required        : 'Please enter an email address.',
                                                        email           : 'Please enter a valid email address.',
                                                        remote          : 'This email is already registered!'
                        },
                        password                    : 'Please provide a password for your new account. The password must be atleast 5 characters long.',
    }, // end messages
    submitHandler   : function(form) {
                        $(form).ajaxSubmit({
                            success                 : show_reg_response,
                            url                     : ajaxVars.ajaxurl,
                            type                    : 'POST',
                            timeout                 : 10000,
                            clearForm               : true,
                            resetForm               : true
                        });
    } // end submitHandler
});

2 个答案:

答案 0 :(得分:0)

我遇到了与你相同的问题,我目前的解决方案是用单独的ajax.call替换远程验证来执行我的验证逻辑(稍微不方便,因为我应该在适当的时候实现show / hide方法)。

答案 1 :(得分:0)

只是为了傻笑,在遥控器上添加一个完整的回调

    complete: function(data){
      $("#field_id").valid();                         
    }

这解决了我的问题,不确定它是否适合您,具体取决于您的其余代码。 我正在使用与您类似的一组代码。

希望有所帮助

Ť