autocomplete="off"对密码字段无效,因chrome≥76等现代浏览器主动忽略该属性以保障密码管理安全;必须使用标准语义值current-password(登录)或new-password(注册/改密),且需在dom初始化时显式设置,不可动态补写。

autocomplete="off"对密码字段根本不起作用
现代浏览器(Chrome ≥76、Edge、Safari)会主动忽略 autocomplete="off",尤其当 type="password" 与 email 或 tel 字段共存时。这不是 bug,而是安全设计:浏览器认为开发者误关密码管理器,属于降级行为。
常见错误现象包括:
- 登录页两个
type="password"框都只写了name,没设autocomplete→ Chrome 把注册时存的new-password填进当前密码框 -
<form autocomplete="off"></form>包裹了<input type="password">,但 input 本身没设值 → 补全照常发生 - 用
autocomplete="false"或autocomplete="nope"→ 非标准值,Chrome 可能忽略,Safari 却尝试匹配,结果不可控
必须用 current-password 和 new-password 语义值
浏览器不是靠 type="password" 判断填什么,而是靠 autocomplete 的语义值决定“匹配哪条凭证”。写错或漏掉,等于主动邀请填错。
正确做法是:
- 登录页密码框:
<input type="password" autocomplete="current-password"> - 注册页/改密页密码框:
<input type="password" autocomplete="new-password"> - 确认密码框也必须是
autocomplete="new-password",否则 Safari 可能复用上一次生成的密码填入两个框
new-password 不代表“生成密码”,只是告诉浏览器:“这是新凭证,别用已有记录填,且允许保存这条新记录”。写成 off 或留空,Chrome 会 fallback 到 name 或历史行为,结果不可控。
动态插入的 input 很容易丢掉 autocomplete
浏览器扫描 DOM 做自动填充决策,发生在初始加载阶段,不是运行时。React/Vue 渲染、JS 动态创建、SSR 后 hydration,都极易让 autocomplete 属性丢失或错位。
实操要点:
- JS 创建
<input>后,必须立刻用setAttribute('autocomplete', 'email')设置,不能等后续异步补 —— Safari 不识别延迟设置 - React 中用
value或v-model控制输入,但忘了显式写autocomplete="email",浏览器就看不到语义 - SSR 页面中
autocomplete值和服务端一致,但 hydration 后清空value时连带删了autocomplete,Chrome 会重新扫描并意外激活填充
信用卡、地址、验证码字段有严格语义要求
autocomplete 不是开关,是语义标签。拼写偏差、大小写错误、脱离 <form></form>,等于没写。
关键细节:
- 信用卡号必须用
autocomplete="cc-number"(小写、连字符),不是CCNumber或credit-card;至少搭配cc-exp或cc-name才易触发整套识别 - 收货地址字段必须加
shipping前缀,如autocomplete="shipping street-address",否则可能把账单地址填进收货栏 - 验证码框需
autocomplete="one-time-code"+ 表单内存在<button type="submit"></button>(哪怕display: none) + HTTPS + 合规短信模板(iOS 要求【品牌名】您的验证码是 123456)
最容易被忽略的不是怎么写,而是“什么时候写”:它必须在 DOM 初始化完成时就存在,且不能被 JS 状态更新覆盖。语义错位比不写更危险。











