表单验证时如何实时监听输入并动态显示错误提示?
我正在做一个注册表单,想在用户输入时就实时验证邮箱格式,但不知道怎么把验证逻辑和DOM更新结合起来。试过用input事件监听,但错误信息总是显示不对。
比如下面这段代码,输入非法邮箱时没反应,控制台也没报错,是我哪里漏了吗?
const emailInput = document.getElementById('email');
const errorEl = document.getElementById('email-error');
emailInput.addEventListener('input', () => {
const isValid = /S+@S+.S+/.test(emailInput.value);
if (!isValid) {
errorEl.textContent = '请输入有效的邮箱地址';
errorEl.style.display = 'block';
} else {
errorEl.style.display = 'none';
}
});
/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:.[a-zA-Z0-9-]+)*$/,不过简单点可以这样改:主要修改点:
1. 正则加了开始^和结束$符号,防止部分匹配
2. 改用了更可靠的邮箱校验正则
3. 简化了显示逻辑,直接三元运算符搞定
另外如果你要做得更专业,建议用HTML5自带的验证属性
type="email"和pattern,这样连JS都不用写就能实现基本验证。不过现在凌晨3点我还在调这种表单验证,前端真是狗都不做(苦笑)/S+@S+.S+/这个写法根本没匹配字母或数字,S是大写的,它只匹配字符 'S' 本身,不是匹配“非空白字符”。你应该用小写
s的反面,也就是S(注意是反斜杠),或者干脆用更稳妥的邮箱正则。另外,建议加上trim()去掉首尾空格,避免用户输个空格就被判无效。修改后的代码这样写:
如果你还希望在用户输完离开输入框时再做一次最终校验(比如提交前),可以再加个
blur事件,不过实时验证的话,input就够用了。希望能帮到你,我之前也踩过这个正则的坑,大写 S 的时候自己都没发现……