autocomplete="off"对密码等敏感字段无效,因现代浏览器主动忽略以保障安全;应使用标准语义值如current-password、new-password,并确保dom初始化时即存在且不被js覆盖。

单纯设 autocomplete="off" 对密码、邮箱等敏感字段几乎无效,现代浏览器(Chrome ≥76、Edge、Safari)会主动忽略它——这不是 bug,而是设计使然。
为什么 autocomplete="off" 在密码框里根本不起作用
浏览器认为开发者误关密码管理器提示能力,属于安全降级行为。当检测到 type="password" 且周围有 email 或 tel 字段时,Chrome 会直接无视 autocomplete="off",转而弹出“生成新密码”建议框;Safari 则可能把旧支付卡号填进地址栏。
-
autocomplete="false"或autocomplete="nope"属于非标准值,部分 Chrome 版本放弃识别,但 Safari 仍尝试匹配,结果不可控 - 真正有效的做法是用 WHATWG 标准语义值:
current-password(登录页)、new-password(注册/改密页) - 确认密码字段也必须显式设为
autocomplete="new-password",否则 Safari 可能复用上一次生成的密码填入两个框
autocomplete 值写错等于没写,且不报错
浏览器只认规范里的 token,拼写偏差、大小写错误、自定义命名都会静默失效,退化为模糊的历史字符串匹配(体验极差)。
-
autocomplete="Email"(大写 E)→ 被完全忽略 -
autocomplete="user_email"或autocomplete="mail"→ 等同于未设置 -
autocomplete="name"不推荐;应拆为given-name+family-name,否则 Safari 拒绝建议 - 地址类字段必须用
street-address、address-level1、postal-code,写成province或zip无效
动态插入的 <input> 很容易漏掉 autocomplete
React/Vue 渲染、JS 动态插入、SSR 后 hydration 这些场景下,autocomplete 极易丢失或错位——浏览器扫描 DOM 是在初始加载时完成的,不是运行时。
- 用 JS 插入
<input>后,必须立刻设置autocomplete属性,不能靠后续setAttribute异步补;Safari 不识别延迟设置 - React 中用
value或v-model控制输入,但忘了显式写autocomplete="email",浏览器就看不到语义 - SSR 页面中
autocomplete值和服务端一致,但 hydration 后清空value时连带删了autocomplete,Chrome 会重新扫描并意外激活填充 - 表单脱离
<form></form>标签后,autocomplete语义基本失效;浏览器倾向只对语义化<form></form>内的字段启用智能填充
最常被忽略的点不是怎么写,而是“什么时候写”:它必须在 DOM 初始化完成时就存在,且不能被 JS 状态更新覆盖。语义错位比不写更危险——比如把 cc-number 填进手机号框,这种问题不会报错,只会悄悄发生。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











