【发布时间】:2014-11-07 12:39:53
【问题描述】:
我有一个像这样的角形
<ng-form name="AddTaskForm" autocomplete="off">
......
</ng-form>
但是,当我开始输入数据时,chrome 仍会提示我之前输入的值。
如何防止 chrome(和所有浏览器)在我的输入中显示任何带有先前输入值的下拉菜单?
我做了一些搜索,发现人们正在编写自定义指令,但不确定这是否真的需要。
【问题讨论】:
我有一个像这样的角形
<ng-form name="AddTaskForm" autocomplete="off">
......
</ng-form>
但是,当我开始输入数据时,chrome 仍会提示我之前输入的值。
如何防止 chrome(和所有浏览器)在我的输入中显示任何带有先前输入值的下拉菜单?
我做了一些搜索,发现人们正在编写自定义指令,但不确定这是否真的需要。
【问题讨论】:
autocomplete="off" 现在可以使用了。在当前 Chrome 70.0.3538.110 中测试。
Demo.
【讨论】:
As of recent Chrome (definitely version 70) autocomplete="off" is now respected, as long as your inputs do not look like user profile, address or credit card data. 我个人还没有遇到过autocomplete="off" 不起作用的情况。如果您可以更改我的演示以演示其中一种情况,那将非常有帮助。
尽管autocomplete 是一个定义非常明确的part of the HTML5 spec,Chrome 却在他们如何使用autocomplete 属性上出现了翻天覆地的变化。 Originally honoring autocomplete="off" (2013),然后他们决定开发人员一定是用错了它,浏览器应该忽略它。
这并不意味着不存在您不希望浏览器自动填充数据的非常有效的情况(例如,在 CRM 系统上),但总的来说,我们认为这些情况属于少数情况。因此,我们开始忽略 Chrome 自动填充数据的 autocomplete=off。
(来源:Chromium bug from 2015 marked as WontFix)
如果发生冲突,请考虑用户而不是作者而不是实现者而不是说明符而不是理论纯度。换句话说,用户的成本或困难应该比作者的成本更重要;这反过来应该比实施者的成本更重要......
...这让我们的开发人员陷入了寻找变通办法的不幸境地。 This article from MDN 很好地勾勒了当前状态,并提供了将autocomplete 设置为new-password 的解决方案:
如果作者想防止在用户管理页面中自动填充密码字段,用户可以为自己以外的其他人指定新密码,则应指定 autocomplete="new-password",尽管对此的支持尚未已在所有浏览器中实现。
我不确定这将保持多长时间,但目前(2016 年 9 月在 Chrome 53 中测试)这是最简单的解决方案:
<input type="password" name="someName" autocomplete="new-password" />
编辑:注意:这具有要求用户保存密码的副作用,可能会覆盖现有密码。因此,虽然它确实“防止密码字段的自动填充”,但它并没有完全从自动完成混乱中删除该元素。
编辑:更新信息: 较新版本的 Chrome 再次尊重 autocomplete=off 属性 as Alexander Abakumov pointed out in his answer。他让它适用于 Chrome 68,适用于我的 Chrome 70。
【讨论】:
看起来 Chrome 忽略了单个 inputs 的 autocomplete 属性;旧的解决方法是像您所做的那样在整个表单上添加autocomplete=off(这是一个非常不完整的解决方案,因为它会将此功能添加到表单中包含的所有输入中,这可能是不需要的)。
无论如何,从this post 看来,该解决方法已不再可用,因此您可能需要一个指令。我知道这可能不是您想要的,但我认为这是您使用 chrome 的唯一选择。
myApp.directive('autocomplete', function() {
return {
restrict: 'A',
link: function( $scope, el, attr ) {
el.bind('change', function(e) {
e.preventDefault();
}
}
}
});
【讨论】:
noautocomplete还是autocomplete?它必须是指令的名称。