注册表单需用配method=”post”和action,所有必须有name属性,type=”email”/”password”提升体验,required/pattern仅作前端校验,后端验证不可替代。

用 <form></form> 和 <input> 搭出能提交的注册表单
浏览器原生表单不需要 JavaScript 就能发请求,关键在 <form></form> 的 action 和 method 属性。不设 action 会默认提交给自己,不设 method 默认是 GET——但注册必须用 POST,否则密码可能出现在 URL 里。
-
<input type="email">比type="text"更靠谱:自带基础邮箱格式校验,且移动端会弹出对应键盘 -
<input type="password">必须配name属性(如name="password"),后端靠这个取值,漏了就收不到密码 - 所有
<input>都要加name,否则不会被提交;id只用于关联<label></label>或 js 操作,不影响提交 - 别用
<div> 或 <code><span></span>模拟表单控件——它们不参与表单序列化,按回车也不会提交
为什么点注册没反应?检查这三处硬性约束
常见“点了没反应”不是 JS 问题,而是 html 层面卡住了:
-
<button></button>在<form></form>里默认是type="submit",但如果写了type="button"就不会触发表单提交 -
<input>如果放在<form></form>外面,哪怕视觉上挨着,也不会被包含进提交数据 - 表单内有
<input type="submit">但没写value,按钮可能显示为空白或默认文字,用户根本找不到点击位置
required和pattern能防错,但不能替代后端验证前端校验只是体验优化,绕过太容易:禁用 JS、直接发 POST 请求、用 curl 都能跳过。但加上它们能让用户少一次往返。
-
required对空值拦截有效,但对 ” “(纯空格)不拦截,得靠pattern="S+"强制非空白字符 -
pattern值是正则字符串,不用写/.../包裹,比如手机号校验写pattern="^1[3-9]d{9}$" - IE10+ 支持
required,但pattern在 safari 旧版本里行为不一致,关键逻辑仍得后端兜底
密码确认字段怎么绑定校验?用
oninput比onblur更及时“两次输入密码不一致”这种反馈,等失焦再提示太滞后。直接监听输入更自然:
立即学习“前端免费学习笔记(深入)”;
<input type="password" id="pwd" name="password"> <input type="password" id="pwd-confirm" name="confirm_password" oninput="checkMatch()"> <script> function checkMatch() { const pwd = document.getElementById('pwd').value; const confirm = document.getElementById('pwd-confirm').value; if (pwd !== confirm && confirm) { this.setCustomValidity('两次输入不一致'); } else { this.setCustomValidity(''); } } </script>setCustomValidity是原生 API,设空字符串才表示通过;只要非空,表单就无法提交。注意别在onblur里调用,否则用户还没输完就误报。真实场景里,密码明文传输、弱口令、缺乏 csrf 保护、没做速率限制……这些比表单结构难得多。先让 HTML 表单能跑通、字段能取到,再一层层往上补。
-