【问题标题】:jQuery Validation plugin failing to fire onblur and also not validating on submission consistentlyjQuery Validation 插件无法触发 onblur 并且也无法一致地验证提交
【发布时间】:2013-02-11 19:42:00
【问题描述】:

从字面上看,我已经使用了这个插件数百次,从来没有遇到过这样的问题.. 现在,当提交表单(字段为空)时,错误标签会正确显示.. 然而,当您填写正确的一两个字段,这些字段的错误不会消失..如果您重新提交表单,它会提交..即使字段保持为空..并且未验证。

我正在运行 jQuery v1.8.2 和 jQuery Validate v1.11.0 该站点在 Twitter 引导程序上运行,因此插件代码末尾的 highlight、success 和 errorPlacement 函数。

我可以提供开发人员的链接。环境,如果你给我发消息并有可能的修复,但想查看实时代码(这个应用程序尚未启动,我刚刚被雇用来清理一些东西,..因此处理这样的问题:[ )

非常感谢任何输入,谢谢!

这里是 JS:

$.validator.setDefaults({
submitHandler: function() {
    form.submit();
}
});

$('#register').validate({ 
rules: {
    name: {
        minlength: 2,
        required: true
    },
    lname: {
        minlength: 2,
        required: true
    },
    username: {
        minlength: 2,
        required: true,
        remote: {
            url: '/setup/verify_username/',
            cache: false
        }
    },
    email: {
        required: true,
        email: true,
        remote: {
            url: '/setup/verify_email/',
            cache: false
        }
    },
    password: {
        required: true,
        alphaNumeric: true,
        minlength: 5,
        maxlength: 250
    },
    password2: {
        required: true,
        alphaNumeric: true,
        minlength: 5,
        maxlength: 250,
        equalTo: '#password'
    },
    postal_code: {
        required: true,
        minlength: 5
    },
    timezones: {
        required: true
    },
    mp: {
        minlength: 10,
        required: true
    },
    gender: {
        required: true
    },
    dob: {
        required: true,
        date: true
    }
},
messages: {
    name: "Please enter your first name",
    lname: "Please enter your last name",
    username: {
        required: "Please enter a username",
        minlength: "Your username must consist of at least 2 characters"
    }, 
    email: "Please enter a valid email address",
    password: {
        required: "Please provide a password",
        minlength: "Your password must be at least 5 characters long"
    },
    password2: {
        required: "Please provide a password",
        minlength: "Your password must be at least 5 characters long",
        equalTo: "Please enter the same passwords"
    },
    postal_code: "Please enter a valid email address",
    timezones: "Please select a time zone",
    mp: "Please enter a valid mobile number. Only numbers please.",
    gender: "Please select a gender",
    dob: "Please enter a valid Date of Birth in mm/dd/yyyy format."
},
highlight: function(element) {
    $(element).closest('.control-group').removeClass('success').addClass('error');
},
success: function(element) {
    $(element).closest('.control-group').removeClass('error').addClass('success');
    $(element).closest('form').find('.valid').removeClass("invalid");
},
errorPlacement: function(error, element){
    error.text( element.closest('.control-group').find('.help-line') );
},
onfocusout: function(element) { 
    $(element).valid();  
}
});  

我不愿意创建一个 jsfiddle 示例,因为所有因素都与实际环境不同,但根据@Sparky 的建议,这就是它(感谢 Sparky) http://jsfiddle.net/DLcLJ/7/

您可以看到,如果您浏览字段,它会正确通知您该字段无效.. 但是如果您填写数据,它将保持无效.. 如果您提交表单,您刚刚的字段输入有效数据,将保持无效..meh...

【问题讨论】:

  • 将链接传递给一两个人对未来的读者没有任何好处。为了大家的利益,请构建一个 jsFiddle 演示。还请包含表单的 HTML。
  • 完成,见上文

标签: jquery jquery-validate validation


【解决方案1】:

我将指出我对您发布的代码的观察。

我发现了几个潜在问题,包括大量冗余和默认功能的重复...


1)您忘记将form 变量传递给submitHandler 回调函数...

submitHandler: function() {
    form.submit();
}

应该是……

submitHandler: function(form) {
    form.submit();
}

当它通过验证时提交表单也是默认行为,因此整个submitHandler 可以被排除在您的选项之外,在这种情况下它不会产生任何影响。只需让插件按照其默认值处理提交......这只是为了在表单验证时允许 submit 事件。如果您不做任何其他事情,则无需编写自定义处理函数。


2) 默认情况下,插件将“在焦点外”验证每个字段。那么为什么要使用$(element).valid(); 覆盖默认的 onfocusout 回调函数呢?根据您的标题,它是“未能触发 onblur”。所以只需删除以下内容,并让插件按照默认设置执行此操作...

onfocusout: function(element) { // <-- remove
    $(element).valid();         // <-- remove
}                               // <-- remove

3) 你的代码...

highlight: function(element) {
    $(element).closest('.control-group').removeClass('success').addClass('error');
},
success: function(element) {
    $(element).closest('.control-group').removeClass('error').addClass('success');
    $(element).closest('form').find('.valid').removeClass("invalid");
},

success 被触发“以显示有效元素”。 unhighlight 被触发“以恢复选项 highlight 所做的更改”。

但是,highlight 和 unhighlight 是免费的功能,所以也许你想要这个...

highlight: function(element, errorClass, validClass) {
    $(element).closest('.control-group').removeClass('success').addClass('error');
},
unhighlight: function(element, errorClass, validClass) {
    $(element).closest('.control-group').removeClass('error').addClass('success');
},
success: function(label) {
    $(label).closest('form').find('.valid').removeClass("invalid");
},

4) 您的代码包含无效规则。见 cmets...

password: {
    required: true,
    alphaNumeric: true,  // <-- not valid spelling and plugin missing
    minlength: 5,
    maxlength: 250
},
password2: {
    required: true,      // <-- redundant
    alphaNumeric: true,  // <-- redundant
    minlength: 5,        // <-- redundant
    maxlength: 250,      // <-- redundant
    equalTo: '#password'
},

应该拼写为alphanumeric,它还需要additional-methods.js plugin,但缺少了。

password: {
    required: true,
    alphanumeric: true,
    minlength: 5,
    maxlength: 250
},
password2: {
    equalTo: '#password'
},

这里是 OP 的 jsFiddle 的修改版本:http://jsfiddle.net/RQnWx/

See this page了解每个回调函数和选项的详细说明。

【讨论】:

  • 太棒了.. 感谢您对回调和反馈的澄清!我已经使用 jsfiddle 链接将原始帖子编辑为。请随时检查一下。我会更新我的本地代码,看看这些更改是如何影响它的。谢谢!
  • @revive,见我上面的编辑...我只是应用了我推荐的更改,你的小提琴似乎工作得更好。
  • 嗨 Sparky,是的,它的表现确实好一点.. 奇怪的是:1)密码不会验证,2)您可以在第二次单击提交按钮时提交表单。即使有错误..会导致什么?
  • 我刚刚进行了一些更改,因此我已将它们添加到您的 jsfiddle... 即,我从 password2 中删除了 required: true ,因为将其设置为 equalTo: #password 也一样..我还在errorPlacement函数中更正了一个类名,这里是更新的jsfiddle:jsfiddle.net/DCb9g/1
  • @revive,您不需要复制第二个密码字段的规则,因为它必须与第一个匹配:jsfiddle.net/DCb9g/2
猜你喜欢
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
  • 2019-09-16
  • 2015-12-15
  • 1970-01-01
  • 2016-10-28
  • 2020-11-08
  • 1970-01-01
相关资源
最近更新 更多