是唯一语义正确且安全的密码输入方案,需配name属性、避免设value,用inputmode="text"和autocapitalize="none"优化移动端,禁用autocomplete="off"而改用语义化name值。

密码框用 <input type="password"> 就够了
不用额外 JS 或 CSS,原生 HTML 就能实现基础密码输入保护。浏览器会自动遮掩字符、禁用自动填充(部分场景下)、阻止文本选中高亮(某些旧版 Safari 除外)。
常见错误是写成 <input type="text"> 再靠 JS 模拟遮掩——这既不安全(DOM 中明文可见),也不符合可访问性规范(屏幕阅读器无法识别语义)。
-
type="password"是唯一可靠且语义正确的方案 - 必须配
name属性,否则表单提交时该字段不会被发送 - 避免同时设
value属性(如value="123456"),否则初始值会以圆点显示,但实际已暴露在 HTML 源码里
为什么不能用 autocomplete="off" 强制关闭自动填充
现代浏览器(Chrome 86+、Edge 90+、Firefox 90+)基本忽略 autocomplete="off" 对 type="password" 的控制,尤其当页面有配套的 type="email" 或 type="text" 用户名字段时。
这不是 bug,而是安全策略:浏览器优先保障用户密码管理器的正常使用。强行禁用反而导致用户手输弱密码或复用密码。
立即学习“前端免费学习笔记(深入)”;
- 真正有效的是让字段名语义化,比如用
name="current-password"或name="new-password" - 若需绕过密码管理器(如“确认新密码”二次输入),可用
name="confirm-password"—— 多数密码管理器不填这个 -
autocomplete="new-password"是推荐写法,不是命令,是提示浏览器“这是新密码,别拿旧记录填”
移动端软键盘弹出异常?检查 inputmode 和 autocapitalize
iOS Safari 和 Android Chrome 在密码框上默认弹出数字键盘或带大小写切换的全键盘,体验割裂。根本原因常是缺失输入模式声明。
密码永远是文本输入,但你不声明,系统就猜——而它猜得不准。
- 加
inputmode="text"明确告诉移动端:“请弹出常规软键盘” - 加
autocapitalize="none"防止首字母自动大写(密码通常区分大小写,且用户不希望意外触发 Caps Lock) - 不要加
spellcheck="false"—— 它对type="password"无效,还可能干扰部分安卓输入法
密码框和普通文本框的 DOM 行为差异很小,但有一处关键区别
JavaScript 读取 input.value 时,type="password" 和 type="text" 返回的都是明文字符串,没有加密或截断。区别只在渲染层。
容易被忽略的是:当用 JS 动态修改 type(比如从 text 切到 password),部分老版本 IE/Edge 会清空值;现代浏览器虽保留值,但焦点会丢失,影响用户体验。
- 如需“明文/密文”切换,建议用两个
<input>元素 +display: none控制显隐,而非改type - 切勿在
oninput中反复切换type,会触发重排且不可靠 - 服务端永远不能信任前端传来的
type值——它只是个 UI 提示,后端校验才是关键











