好吧,聚会有点晚了,但似乎对autocomplete 应该和不应该如何工作存在一些误解。根据 HTML 规范,用户代理(在本例中为 Chrome)可以覆盖 autocomplete:
https://www.w3.org/TR/html5/forms.html#autofilling-form-controls:-the-autocomplete-attribute
用户代理可以允许用户覆盖元素的自动填充字段名称,例如将其从“关闭”更改为“打开”以允许记住和预填充值,尽管页面作者反对,或者始终“关闭”,从不记住值。但是,用户代理不应允许用户轻易地将自动填充字段名称从“off”更改为“on”或其他值,因为如果始终记住所有值,无论站点的偏好如何,都会对用户产生重大的安全隐患。
因此,在 Chrome 的情况下,开发人员基本上说过“我们将让用户自行决定他们是否希望 autocomplete 工作。如果你不想要它,不要在您的浏览器中启用它”。
然而,他们似乎有点过分热心于我的喜好,但事实就是如此。该规范还讨论了此类举措的潜在安全隐患:
“off”关键字表示控件的输入数据特别敏感(例如核武器的激活码);或者它是一个永远不会被重复使用的值(例如银行登录的一次性密钥),因此用户每次都必须明确输入数据,而不是能够依赖 UA 来预填充对他的价值;或者文档提供了自己的自动完成机制,并且不希望用户代理提供自动完成值。
所以在经历了和其他人一样的挫折之后,我找到了一个适合我的解决方案。它与autocomplete="false" 的答案类似。
Mozilla 的一篇文章正好说明了这个问题:
https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion
在某些情况下,即使自动完成属性设置为关闭,浏览器也会继续提示自动完成值。这种意想不到的行为可能会让开发人员感到非常困惑。真正强制不完成的技巧是为属性分配一个随机字符串
所以下面的代码应该工作:
autocomplete="nope"
以下各项也应如此:
autocomplete="false"
autocomplete="foo"
autocomplete="bar"
我看到的问题是浏览器代理可能足够聪明,可以学习autocomplete 属性并在下次看到表单时应用它。如果它确实这样做了,我能看到仍然解决问题的唯一方法是在生成页面时动态更改 autocomplete 属性值。
值得一提的是,许多浏览器会忽略登录字段(用户名和密码)的autocomplete 设置。正如 Mozilla 文章所述:
因此,许多现代浏览器不支持登录字段的 autocomplete="off"。
- 如果网站为表单设置了 autocomplete="off",并且表单包含用户名和密码输入字段,则浏览器仍会提供记住此登录信息,如果用户同意,浏览器将自动填充这些字段下次用户访问此页面时。
- 如果网站将用户名和密码输入字段设置为 autocomplete="off",则浏览器仍会提示记住此登录信息,如果用户同意,浏览器将在用户下次访问此页面时自动填充这些字段.
这是 Firefox(自版本 38 起)、Google Chrome(自 34 版起)和 Internet Explorer(自版本 11 起)中的行为。
最后是关于属性是属于form 元素还是input 元素的一些信息。规范再次给出了答案:
如果省略 autocomplete 属性,则使用与元素的表单所有者的 autocomplete 属性的状态相对应的默认值(“on”或“off”)。如果没有表单所有者,则使用值“on”。
所以。将其放在表单上应适用于所有输入字段。将它放在单个元素上应该只适用于该元素(即使表单上没有元素)。如果根本没有设置autocomplete,则默认为on。
总结
在整个表单上禁用autocomplete:
<form autocomplete="off" ...>
或者如果你动态需要这样做:
<form autocomplete="random-string" ...>
在单个元素上禁用autocomplete(无论是否存在表单设置)
<input autocomplete="off" ...>
或者如果你动态需要这样做:
<input autocomplete="random-string" ...>
请记住,某些用户代理甚至可以覆盖您最努力地禁用 autocomplete 的尝试。