这是由于 Chrome 做出的设计决定(可以说任何 Chrome 用户都想要这种行为)。
原因是谷歌称之为选区优先级:
- 用户为王!他们想要什么最重要。
- 用户想要使用密码或自动填充管理器。
- Web 应用程序说它不希望保存表单值。
- 用户的选择更重要,所以保留了表单值。
有一些方法可以解决,但很有可能这些方法会在未来的 Chrome 版本中得到修复,因为 Chrome 开发人员认为他们的行为是正确的,而您的解决方法是错误的。
即使您的解决方法确实有效,它也会给用户带来令人困惑的行为 - 他们希望自动填充能够根据他们的设置工作。
许多用户已经选择使用插件或脚本忽略应用程序自动完成设置,这些插件或脚本只是删除页面中的任何 autocomplete=off - 他们已经有了这个选择。
您最好在设计时假设自动完成功能可以工作并考虑到这一点。
就我个人而言,我讨厌网站不记得我的密码并覆盖那些使用浏览器扩展的密码。然而,我也为我的工作创建了应用程序,并且召回密码被视为一种安全风险,因为用户可能会让他们的机器处于解锁状态。在我个人看来,用户不锁定他们的机器是本地 IT 的问题,而不是应用程序的问题,如果他们的用户不能被信任,本地 IT 可以禁用所有 Web 应用程序的所有密码自动完成。
不幸的是,为了通过安全检查,一些应用程序仍然必须禁用自动完成,有办法做到这一点,但它们都很糟糕。第一个技巧是使密码输入全新:
<input type="hidden" name="password" id="realPassword" />
<input type="password" name="{randomly generated}"
onchange="document.getElementById('realPassword').value = this.value" />
我已经内联了所有内容以简化,但这应该让您了解黑客 - 没有插件或浏览器可以用全新的名称自动填充输入。
如果您正确构建 ARIA 和标签,则此解决方案会中断(因为这样可以让浏览器/扩展程序找到并自动填充标签中的输入)。
所以选项 2,也很可怕,是等到自动完成触发之后,然后将字段清空:
<input type="text" name="username"
onchange="window.setTimeout(function() {
document.getElementById('password').value = '';
}, 100)" />
<input type="password" id="password" />
就像我说的,讨厌。