键入时验证电子邮件

时间:2013-01-11 09:43:36

标签: javascript regex validation

我想在输入时验证输入,所以我使用onkeyup事件来执行此操作,但如果我验证电子邮件正则表达式“name@domain.com”,则一旦用户开始键入它就会抛出错误 - 第一个字符不会匹配正则表达式...

所以我写了这个:

var addValidation = function (patterns) {
        var index = patterns.length; //I know I can avoid this
        while (index--) {
            patterns[index] = new RegExp(patterns[index]);
        }

        index = 0;
        var current = patterns[index],
        matchExact = function (patt, str) {
            var match = str.match(patt);
            return match !== null && str === match[0];
        };

        return function () {
            var str = this.value;
            if (!matchExact(current, str) ) {
                var tmp = patterns[index + 1] ? 
                    new RegExp(current.source + patterns[index + 1].source) :
                    false;
                if (tmp && matchExact(tmp, str)) {
                    current = tmp;
                    index++;
                }
                else {
                    alert("Wrong");
                }
            }
        }
    };
    document.getElementById("x").onkeyup = addValidation(["[a-zA-Z0-9\\.]+", "@{1}", "[a-zA-Z0-9]+", "\\.{1}", "[a-zA-Z]{1,3}"]);

它似乎有用,但是......它很丑陋,如果你退后一步它会提醒你(例如“name @”并按退格键)。

我知道Dojo的验证很棒,但我不想使用Dojo。有没有更好的方法来实现这一目标?

//编辑:http://livedocs.dojotoolkit.org/dijit/form/ValidationTextBox这是一个示例,但您可以定义自己的模式(如电子邮件正则表达式),它将完美验证它。

2 个答案:

答案 0 :(得分:1)

在验证开始之前添加间隔:

var t;
document.getElementById("x").onkeyup = function () {
    if (t) {
        clearTimeout(t);
    }
    t = setTimeout(function () {
        //do validation
    }, 1000)
}

答案 1 :(得分:0)

请勿尝试使用regualr表达式验证电子邮件地址。您最终将允许无效的地址,或阻止完全有效的电子邮件地址,并且只会惹恼您的访问者。同样值得注意的是,到目前为止验证电子邮件地址的最佳正则表达式是:

http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html