我想在输入时验证输入,所以我使用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这是一个示例,但您可以定义自己的模式(如电子邮件正则表达式),它将完美验证它。
答案 0 :(得分:1)
在验证开始之前添加间隔:
var t;
document.getElementById("x").onkeyup = function () {
if (t) {
clearTimeout(t);
}
t = setTimeout(function () {
//do validation
}, 1000)
}
答案 1 :(得分:0)
请勿尝试使用regualr表达式验证电子邮件地址。您最终将允许无效的地址,或阻止完全有效的电子邮件地址,并且只会惹恼您的访问者。同样值得注意的是,到目前为止验证电子邮件地址的最佳正则表达式是: