表单验证函数在提交时没有触发怎么办?
大家好,我正在做一个用户注册表单,想用JS验证邮箱格式。按照教程写好了验证函数,但点击提交按钮时验证完全没反应,直接跳转页面了。
我尝试过在表单加了onsubmit调用验证函数,但好像没生效。代码是这样的:
function validateForm() {
const email = document.querySelector('#email').value;
const regex = /^[^s@]+@[^s@]+.[^s@]+$/;
if (!regex.test(email)) {
alert('邮箱格式错误');
return false;
}
}
HTML里表单写的是<form onsubmit="validateForm()">。调试时发现函数根本没执行,但控制台也没报错,这是哪里出问题了?
先说两个坑点:
第一个是正则里用了
s而不是s,这会导致空格字符被当成合法邮箱的一部分,得改成/^[^s@]+@[^s@]+.[^s@]+$/第二个更关键:
onsubmit="validateForm()"这种写法在 HTML 里是没加return的,应该写成onsubmit="return validateForm()",不然函数返回值根本传不到表单提交流程里。不过更推荐用 JS 绑定事件,别在 HTML 里写
onsubmit,更干净点。比如:另外提醒一句,JS 验证只能做前端友好提示,真正安全还得靠后端验证,别把用户邮箱直接裸提交。
如果还是不触发,检查下表单是不是被
ajax提交了,或者有没有别的 JS 把事件覆盖了——有时候插件冲突也会导致事件失效,这种情况用event.stopPropagation()前先看看控制台有没有别的错误。onsubmit="validateForm()"只是调用了函数,但没把返回值传给表单,所以就算return false也拦不住提交。最简单的改法是把onsubmit改成这样:
注意前面加了个 return,这样才能把false传回去阻止提交。
另外你那个正则也有点问题,
[^s@]+.[^s@]+这里应该用 \. 转义点号,不然.会匹配任意字符。建议改成:还有个更现代的写法是别用内联事件,用 addEventListener,不过你现在这样修一下就能跑通了。下次搞复杂验证我再教你用钩子函数统一处理。