JQuery Validation Plugin不能使用电子邮件类型吗?

时间:2014-04-29 15:28:06

标签: javascript jquery jquery-validate

我已经配置了一个Grunt文件,用我所有的库和我的代码构建一个JS文件,所以我只有一个JS文件包含在我的网站中。这一切都运行正常,但我刚刚将JQuery Validate插件添加到其中(http://jqueryvalidation.org/)并且这个插件正在工作但不完全,我认为它是我的代码以及我如何构建它的红色。

但我有多种形式,其中一种是更改用户电子邮件。我还应该在这里说我正在使用CakePHP和它的表单助手构建这个站点(尽管该站点的那一侧完全正常工作而没有任何错误)。

这是我正在使用的代码:

 $( "#EmailChange" ).validate({
    rules: {
        'data[Email][currentemail]':{ 
            required: true,
            email: true
        },
        'data[Email][newemail]':{
            required: true,
            email: true
        },
        'data[Email][emailconfirm]': {
            equalTo: "#NewEmail", <-id for the [email][newemail] input
            required: true,
            email: true
        }
    },
    messages: {
        'data[EmailUpdate][currentemail]': "email address is needed",
        'data[EmailUpdate][newemail]': "a vaild email address is needed",
        'data[EmailUpdate][emailconfirm]': "second email does not match",
    }
}); 

现在这样可行,但是没有正确验证我的电子邮件地址,我将输入someemail@something,这将删除或返回有效的电子邮件,然后输入域名后缀。当我在自己的网站上的电子邮件中使用测试字段时,它不会这样做,它只会在用户输入后缀后返回有效。

那么我做错了什么?

感谢。

3 个答案:

答案 0 :(得分:10)

使用以下代码发送电子邮件:

jQuery.validator.addMethod("validEmail", function(value, element) 
{
    if(value == '') 
        return true;
    var temp1;
    temp1 = true;
    var ind = value.indexOf('@');
    var str2=value.substr(ind+1);
    var str3=str2.substr(0,str2.indexOf('.'));
    if(str3.lastIndexOf('-')==(str3.length-1)||(str3.indexOf('-')!=str3.lastIndexOf('-')))
        return false;
    var str1=value.substr(0,ind);
    if((str1.lastIndexOf('_')==(str1.length-1))||(str1.lastIndexOf('.')==(str1.length-1))||(str1.lastIndexOf('-')==(str1.length-1)))
        return false;
    str = /(^[a-zA-Z0-9]+[\._-]{0,1})+([a-zA-Z0-9]+[_]{0,1})*@([a-zA-Z0-9]+[-]{0,1})+(\.[a-zA-Z0-9]+)*(\.[a-zA-Z]{2,3})$/;
    temp1 = str.test(value);
    return temp1;
}, "Please enter valid email.");

在规则中使用以下

rules: {

    'data[Email][newemail]': {
        required: true,
        validEmail: true
    }
}

答案 1 :(得分:1)

jQuery Validate Plugin使用与HTML标准相同的电子邮件验证。

从jQuery Validate Plugin的源代码链接到过时的http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#e-mail-state-%28type=email%29,现在应该是https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address

  

以下与JavaScript和Perl兼容的正则表达式是上述定义的实现。

/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/someemail@something

这正是插件(目前在版本1.13.1中)使用的,并且匹配someemail@something为有效。

HTML标准使用此类规范的原因也在规范网站上说明:

  

此要求是RFC 5322的willful violation,它定义了同时过于严格(在“@”字符之前),过于模糊(在“@”字符之后)的电子邮件地址的语法,并且太宽松(允许评论,空白字符和大多数用户不熟悉的方式引用的字符串)在这里实用。

总结一下 - 如果您不喜欢它,请使用Validation Plugin的自定义验证功能。

答案 2 :(得分:0)

此问题出现在jquery验证插件版本14.尝试使用版本12,它可以正常工作。