ChatGPT解决这个技术问题 Extra ChatGPT

禁用 Chrome 自动填充

这个问题的答案是社区的努力。编辑现有答案以改进这篇文章。它目前不接受新的答案或交互。

我在几个表单上遇到了 chrome 自动填充行为的问题。

表单中的字段都有非常常用且准确的名称,例如“email”、“name”或“password”,并且还设置了autocomplete="off"

自动完成标志已成功禁用自动完成行为,在您开始输入时会出现下拉值,但并未更改 Chrome 自动填充字段的值。

除了 chrome 错误地填充输入之外,这种行为是可以的,例如用电子邮件地址填充电话输入。客户对此提出了投诉,因此已证实它在多种情况下都会发生,而不是作为我在我的机器上本地完成的某事的某种结果。

我能想到的唯一当前解决方案是动态生成自定义输入名称,然后在后端提取值,但这似乎是解决这个问题的一种非常老套的方法。是否有任何标签或怪癖可以改变可用于解决此问题的自动填充行为?

它不是重复的。这个处理禁用自动填充,一个处理自动填充颜色的样式......
根据 Kaszoni Ferencz 的回答,autocomplete="false" 而不是 autocomplete="off",请为它投票。
看看这个问题的答案数量——它应该告诉你一些事情:你正在打一场失败的战斗。这不再是 Chrome 的问题,Firefox 等也纷纷效仿。不管你喜不喜欢,你需要接受浏览器行业的决定,表单自动完成是用户的选择——你可以和他们抗争,但你会输。归根结底,您应该问的问题不是,我如何才能颠覆自动完成功能,而是如何创建与自动完成功能兼容的表单。您对安全性的担忧不是您的担忧,而是用户的担忧。
抱歉,@mindplay.dk 的回复适得其反。我的情况是我的用户已经登录到我的站点,并且站点上的一个页面供他们输入其他系统的帐户/密码信息。当我为他们输入一个新的对话框时,他们对我网站的登录信息被填写,这是完全错误的,如果/当用户无意中输入该信息时会导致问题。这两者没有任何关系彼此。在这种情况下,浏览器正在做一些与用户想要的相反的事情。
@mindplay.dk - 我的 Web 应用程序是工作场所的工作流管理应用程序,所以,不,安全问题是我要担心的,这是最高管理层的要求,所有员工,也就是“用户”都必须遵守。 "然而,要求他们自己设置 Chrome、IE 或任何其他浏览器会在身份验证过程中留下空白,因为他们可以有意或无意地使用自动填充。答:并非所有 Web 应用程序都属于同一类型,具有相同类型的用户或关注点。

M
Matt K

2022 年 4 月autocomplete="off" 仍然无法在 Chrome 中运行,而且在查看与该问题相关的 Chromium 错误(可能仅适用于密码字段)后,我认为它从未出现过。我看到在 2014 中报告的问题已以“WontFix”的形式关闭,而问题仍处于开放状态并正在讨论中 [1][2]。根据我收集的信息,Chromium 团队认为 autocomplete="off" 没有有效的用例。

总的来说,我仍然认为这两种极端策略(“总是尊重 autocomplete=off”和“从不尊重 autocomplete=off”)都不好。

https://bugs.chromium.org/p/chromium/issues/detail?id=914451#c66

他们的印象是网站不会正确使用它并决定不应用它,建议以下建议:

如果您想禁用自动填充,我们的建议是利用 autocomplete 属性为您的字段赋予语义含义。如果我们遇到无法识别的自动完成属性,我们不会尝试填充它。例如,如果您的 CRM 工具中有一个地址输入字段,您不希望 Chrome 自动填充,您可以为其赋予相对于您所要求的内容有意义的语义含义:例如 autocomplete="new-user -街道地址”。如果 Chrome 遇到这种情况,它不会尝试自动填充该字段。

https://bugs.chromium.org/p/chromium/issues/detail?id=587466#c10

虽然这个“建议”目前对我有用,但它可能并不总是正确的,看起来团队正在进行实验,这意味着自动完成功能可能会在新版本中发生变化。

我们不得不求助于这个很愚蠢,但唯一可靠的方法是尽可能地尝试混淆浏览器:

命名您的输入而不会将任何信息泄露给浏览器,即 id="field1" 而不是 id="country"。

设置 autocomplete="do-not-autofill",基本上使用不会让浏览器将其识别为可自动填充字段的任何值。

2021 年 1 月autocomplete="off" 现在可以正常工作(在 Chrome 88 macOS 上测试)。

为此,请确保您的输入标签包含在表单标签中

2020 年 9 月autocomplete="chrome-off" 禁用 Chrome 自动填充功能。

原始答案,2015:

对于新的 Chrome 版本,您只需在密码字段中输入 autocomplete="new-password" 即可。我已经检查过了,工作正常。

在此讨论中从 Chrome 开发人员那里得到了提示:https://bugs.chromium.org/p/chromium/issues/detail?id=370363#c7

PS 请注意,Chrome 将尝试从名称、ID 和它可以在字段周围获取的任何文本内容(包括标签和任意文本节点)推断自动填充行为。如果上下文中有像 street-address 这样的自动完成标记,Chrome 会自动填充它。启发式可能会非常令人困惑,因为它有时只会在表单中有其他字段时触发,或者如果表单中的字段太少则不会触发。另请注意,autocomplete="no" 似乎可以工作,但 autocomplete="off" 由于历史原因不会。 autocomplete="no" 是您告诉浏览器该字段应自动填写为名为 "no" 的字段。如果您生成唯一的随机 autocomplete 名称,您将禁用自动完成。

如果您的用户访问了错误的表单,他们的自动填充信息可能已损坏。让他们手动进入并在 Chrome 中修复其自动填充信息可能是他们采取的必要措施。


尝试“关闭”和“错误”后,“新密码”对我有用
这是现在唯一有效的修复。假的,关了,不工作了。现在应该是正确答案了。
从 1.13.2018 版本 63.0.3239.132(官方版本)(64 位)起无法正常工作
我只是想说.. 在偶然发现这个问题之后.. Chrome 是一个真正的作品。所以现在我们必须越过障碍来禁用应该保持可选的功能。在地址每次都是新/不同的业务应用程序中,在什么世界中需要地址自动填充。谷歌正变得和微软一样糟糕。
在 Windows 上的 Chrome 91 中,我无法让 Chrome 停止自动填充,autocomplete="off" 和 autocomplete="chrome-off" 都不起作用
L
Lee Taylor

我刚刚发现,如果您记住了某个网站的用户名和密码,当前版本的 Chrome 会自动将您的用户名/电子邮件地址填充到任何 type=password 字段之前的字段中。它不关心该字段的名称 - 只是假设密码之前的字段将成为您的用户名。

旧解决方案

只需使用 <form autocomplete="off">,它就可以防止密码预填充以及基于浏览器可能做出的假设(通常是错误的)对字段的任何类型的启发式填充。与使用 <input autocomplete="off"> 相反,密码自动填充似乎几乎忽略了它(在 Chrome 中,Firefox 确实遵守它)。

更新的解决方案

Chrome 现在会忽略 <form autocomplete="off">。因此,我最初的解决方法(我已删除)现在风靡一时。

只需创建几个字段并使用“display:none”将它们隐藏起来。例子:

<!-- fake fields are a workaround for chrome autofill getting the wrong fields -->
<input style="display: none" type="text" name="fakeusernameremembered" />
<input style="display: none" type="password" name="fakepasswordremembered" />

然后把你的真实领域放在下面。

请记住添加评论,否则您团队中的其他人会想知道您在做什么!

2016 年 3 月更新

刚刚用最新的 Chrome 测试过——一切都很好。这是一个相当老的答案,但我只想提一下,我们的团队多年来一直在数十个项目中使用它。尽管下面有一些评论,它仍然很好用。可访问性没有问题,因为字段为 display:none 表示它们没有获得焦点。正如我所提到的,您需要将它们放在您的真实字段之前。

如果您使用 javascript 来修改表单,则需要一个额外的技巧。在您操作表单时显示假字段,然后在一毫秒后再次隐藏它们。

使用 jQuery 的示例代码(假设你给你的假字段一个类):

$(".fake-autofill-fields").show();
// some DOM manipulation/ajax here
window.setTimeout(function () {
  $(".fake-autofill-fields").hide();
}, 1);

2018 年 7 月更新

由于 Chrome 的反可用性专家一直在努力工作,因此我的解决方案不再有效。但是他们以以下形式向我们扔了一块骨头:

<input type="password" name="whatever" autocomplete="new-password" />

这有效并且主要解决了问题。

但是,当您没有密码字段而只有电子邮件地址时,它不起作用。这也很难让它停止变黄和预填充。假字段解决方案可用于解决此问题。

事实上,有时你需要放入两个假字段,并在不同的地方尝试它们。例如,我的表单开头已经有假字段,但 Chrome 最近开始再次预填充我的“电子邮件”字段 - 所以我加倍努力并在“电子邮件”字段之前输入更多假字段,并且修复了它.删除第一批或第二批字段将恢复为不正确的过度自动填充。

2020 年 3 月更新

目前尚不清楚该解决方案是否以及何时仍然有效。它有时似乎仍然有效,但并非一直有效。

在下面的评论中,您会发现一些提示。 @anilyeni 刚刚添加的一个可能值得更多调查:

我注意到,如果 <form> 中的元素少于三个,autocomplete="off" 可以在 Chrome 80 上运行。我不知道逻辑是什么,也不知道相关文档在哪里。

@dubrox 的这个也可能是相关的,虽然我没有测试过:

非常感谢这个技巧,但请更新答案,因为 display:none; 不再有效,但 position: fixed;top:-100px;left:-100px; width:5px; 有效:)

2020 年 4 月更新

此属性的 chrome 的特殊值正在完成这项工作:(在输入上测试 - 但不是由我测试)autocomplete="chrome-off"


这曾经工作得很好,我也用过,但自从 Chrome 升级前一段时间(从那时到 5 月 5 日),Chrome 忽略了表单属性:(
谷歌在(我认为是 Chrome v34)中做出了决定,现在总是忽略 autocomplete="off",包括表单级别的指令......如果它真的把该死的字段弄对了,那就没问题了。
尝试自动完成=“假”而不是自动完成=“关闭”
此属性也是必需的:autocomplete="I told you I wanted this off, Google. But you would not listen."
chrome-off 在 Chrome 81 中为我工作。另外 - 大家都好吗?自从我第一次提出这个问题以来,我已经有 2 个孩子了。保持健康!
r
rmcsharry

经过几个月和几个月的努力,我发现解决方案比你想象的要简单得多:

而不是 autocomplete="off" 使用 autocomplete="false" ;)

就这么简单,它在谷歌浏览器中也像一个魅力!

2019 年 8 月更新(评论中感谢 @JonEdiger)

注意:网上很多信息说浏览器现在将 autocomplete='false' 视为与 autocomplete='off' 相同。至少在这一分钟,它正在阻止这三个浏览器的自动完成。

将其设置在表单级别,然后对于您想要关闭的输入,设置为一些无效值,例如“无”:

<form autocomplete="off"> 
  <input type="text" id="lastName" autocomplete="none"/> 
  <input type="text" id="firstName" autocomplete="none"/>
</form>

为我工作!但是有一个重要的说明:我的网页中有 5 个字段:姓名、地址、邮政编码、电话和电子邮件。当我在表单和名称字段中包含 autocomplete='false' 时,它仍然有效。但是,当我在地址字段中也包含 autocomplete='false' 时,它最终停止了自动填充它们!因此,您需要将自动完成属性不要放在登录名或姓名字段上,而也要放在以下字段上! (截至 2015 年 5 月 27 日,在 Chrome 43.0.2357.81 上工作)
如果这对您不起作用:请记住,Chrome 有两种“帮助”用户的方式。 AUTOCOMPLETE 将根据之前提交的相同表单提交提示,并会影响多次使用该表单的人。使用 autocomplete="off" 禁用自动完成功能。 AUTOFILL 会根据之前在其他页面填写的类似表格中的通讯录进行提示。它还将突出显示它正在改变的领域。可以使用 autocomplete="false" 禁用自动填充。
这对我不起作用(版本 43.0.2357.124 m)。这可能是谷歌的疏忽,现在已经解决了。他们似乎在想“用户永远是对的”,因为他们想自动填充所有内容。问题是,我的注册表单就像登录表单一样保存了用户数据,这绝对不是用户想要的......
是的,它适用于 Chrome 43.0.2357! Chrome 中的这种行为非常烦人,这个解决方法花了我一段时间才弄清楚。感谢您的回答。
不适用于 Chrome 44.0.2403.157。此功能如何工作而不适用于不同版本。这很荒谬
C
Cœur

有时甚至 autocomplete=off 也无法阻止将凭据填写到错误的字段中。

一种解决方法是使用只读模式禁用浏览器自动填充并将焦点设置为可写:

 <input type="password" readonly onfocus="this.removeAttribute('readonly');"/>

focus 事件发生在鼠标单击和通过字段切换时。

更新:

移动 Safari 将光标设置在字段中,但不显示虚拟键盘。这个新的解决方法像以前一样工作,但处理虚拟键盘:

<input id="email" readonly type="email" onfocus="if (this.hasAttribute('readonly')) {
    this.removeAttribute('readonly');
    // fix for mobile safari to show virtual keyboard
    this.blur();    this.focus();  }" />

现场演示https://jsfiddle.net/danielsuess/n0scguv6/

// 更新结束

说明:浏览器自动将凭据填充到错误的文本字段?

错误地填写输入,例如用电子邮件地址填写电话输入

有时我会在 Chrome 和 Safari 上注意到这种奇怪的行为,当密码字段以相同的形式出现时。我猜,浏览器会寻找密码字段来插入您保存的凭据。然后它将用户名自动填充到最近的 textlike-input 字段中,该字段出现在 DOM 中的密码字段之前(只是由于观察而猜测)。由于浏览器是最后一个实例,您无法控制它,

上面的这个只读修复对我有用。


多么好的修复:) 你应该用这个替换jquery:this.removeAttribute("class")
@Clint:我上面的代码片段会在用户输入字段后立即删除 readonly 属性(通过鼠标单击或 Tab 键)。我想,您指的是一个字段,该字段受自动填充保护,但用户未触及。这个领域的目的是什么——它真的需要保护吗?根据具体情况,可以选择在提交时删除所有只读属性。您能否就您的问题添加更具体的评论?也许我可以帮助你:)
如果您使用的是 JavaScript。为什么不将值设置为 dummy 然后再次删除该值?添加和删除 readonly 听起来像是一个危险的举动——如果浏览器不想让你专注于它怎么办?
但是,这具有误导性,因为该字段具有灰色背景,向用户表明它已被禁用(确实如此),并且在将鼠标悬停在其上时会显示被禁止的光标。只有当用户点击它时,他们通常不会这样做,因为样式告诉他们没有,它才真正开始工作。它可能有效,但与 IMO 和糟糕的用户体验相反。我想你可以添加样式来解决这个问题。
显然,谷歌正试图在这里为我们所有人做出决定,他们关闭了关于 autocomplete="off": bugs.chromium.org/p/chromium/issues/detail?id=468153 的票。但是还有另一张票用于收集有效用户案例以禁用自动填充,请在此处回复此票以提高对此问题的认识:bugs.chromium.org/p/chromium/issues/detail?id=587466
d
dana

如果您要实现搜索框功能,请尝试将 type 属性设置为 search,如下所示:

<input type="search" autocomplete="off" />

这在 Chrome v48 上对我有用,并且似乎是合法的标记:

https://www.w3.org/wiki/HTML/Elements/input/search


是的! :) 谢谢!这适用于 Chrome 67.0.3396.99。 (我认为您的链接应该是:w3.org/wiki/HTML/Elements/input/search 截至 2018 年 9 月)。
最后!仍然有效 版本 69.0.3497.100 (Official Build) (64-bit) 这应该是真正的答案!
每个人都是对的和错的,同时你应该在标签内写 autocomplete="off"
而不是在输入时,这将停止自动填充行为
如果您在表单上设置 autocomplete="off" (更改默认表单范围)然后只需要在 上设置 type="search" 也可以工作
在 Chrome 版本 72.XX 之后,此修复程序不起作用。在此处查找最新修复stackoverflow.com/a/55045439/1161998
P
Pang

我不知道为什么,但这对我很有帮助。

<input type="password" name="pwd" autocomplete="new-password">

我不知道为什么,但 autocomplete="new-password" 禁用自动填充。它适用于最新的 49.0.2623.112 chrome 版本。


更新了我的 chrome,它仍然对我有用。 50.0.2661.87(64位)
不幸的是,在提交表单时(或当输入字段被隐藏/删除时),Chrome 会要求保存更改的登录信息。
适用于版本 51.0.2704.79 m
神圣的f ***为什么这有效?那是一个错误吗?因为我在这里对其进行了测试并将其仅放在一个输入中并且适用于输入登录名和密码,但我仅将其放在密码中
只有目前仍然有效的答案。
a
arun

尝试这个。我知道这个问题有些陈旧,但这是解决问题的另一种方法。

我还注意到问题出现在 password 字段上方。

我尝试了这两种方法

<form autocomplete="off"><input autocomplete="off"> 但它们都不适合我。

所以我使用下面的代码段修复了它 - 只是在密码类型字段上方添加了另一个文本字段并将其设为 display:none

像这样的东西:

<input type="text" name="prevent_autofill" id="prevent_autofill" value="" style="display:none;" />
<input type="password" name="password_fake" id="password_fake" value="" style="display:none;" />
<input type="password" name="password" id="password" value="" />

希望它会帮助某人。


这个对我有用(现在)。我发现随着时间的推移,我已经使用了大约六种不同的 hack,过了一段时间,Chrome 决定要打败那个 hack。所以需要一个新的,比如这个。在我的应用程序中,我有一个配置文件更新表单,其中包含电子邮件和密码字段,除非用户想要进行更改,否则这些字段将留空。但是当 Chrome 自动填充时,它会将用户 ID 放在“电子邮件确认”字段中,从而导致各种错误情况,从而导致进一步的错误情况,因为用户在尝试做正确的事情时犹豫不决。
关于为什么这个 hack 起作用的快速解释(现在):Chrome 看到第一个 type=password 输入并自动填充它,它假定直接在此之前的字段必须是 userhame 字段,并使用用户名自动填充该字段。 @JeffreySimon 这应该可以解释电子邮件确认字段中的用户 ID 现象(我在表单上看到了同样的内容)。
@kentcdodds - 不知道你说的不再工作是什么意思。您的 jsbin 没有密码字段,因此情况不同。多年来我一直在使用这个解决方案,最近我注意到它是必需的,它就在上周(2015 年 3 月)对我有用。
万岁!一个似乎有效的解决方案!我建议将该字段命名为 password 并将 actual_password 用于合法字段,因为 Google 现在似乎正在查看 name。但是,这意味着 Chrome 不会保存密码,这是我真正想要的功能。啊啊啊啊啊!
更新:自从我上次实施以来,这继续工作一年多。我们在这里可能有一个可靠的赢家。
K
Kuf

对我来说,简单

<form autocomplete="off" role="presentation">

做到了。

在多个版本上测试,最后一次尝试是在 56.0.2924.87


@ArnoldRoa 版本已添加,自从我发布它的那一天起,它就一直在我们的网站上,并且有几个版本可以正常工作。你用的是哪个版本?电脑/Mac?
@Dummy 我现在在 chrome latest (57) 上对其进行了测试,它仍然对我有用。你对输入字段做了什么特别的事情吗?上限你把你的代码放在我可以尝试重现的地方吗?
版本 64.0.3282.186(官方版本)(64 位)Windows。 2018-03-01 不适用于禁用自动填充。
很确定这会从辅助技术中删除表单/输入w3c.github.io/using-aria/#ariapresentation
这是目前 Mac 上 chrome 88 中唯一有效的东西。
H
Hitesh Kalwani

您必须添加此属性:

autocomplete="new-password"

源链接:Full Article


你有任何消息来源如何解决这个问题吗?
有效,但不是语义,可用于用户名和其他字段。
F
Fareed Alnamrouti

它是如此简单和棘手:)

谷歌浏览器基本上会在 <form><body><iframe> 标记内搜索 每个可见的密码元素 以启用自动重新填充,因此要禁用此功能,您需要添加一个虚拟密码元素如下:

如果您的密码元素在 标签内,则需要将虚拟元素作为表单中的第一个元素,紧跟在 打开标签之后 如果您的密码元素不在 标签内,则将虚拟元素作为第一个元素在 打开标记之后立即在您的 html 页面中您需要隐藏虚拟元素而不使用 css display:none 所以基本上使用以下作为虚拟密码元素。


干得好,你是怎么知道 Chrome 的算法的?我刚刚发现,在使用 setTimeout 计时器加载页面后,我使用 JS 更改值的旧方法不再起作用。但这很完美!
不幸的是,不适用于常规 TextBox 输入。
实际上它只是设置名称属性;)
在 Chrome 58 上,这不起作用。使用宽度:1px。如果密码字段完全隐藏,Chrome 会正常自动填充。 z-index:-999 也很有用,因此它不会与任何内容重叠。
适用于 Angular html 组件 <form *ngIf="!loggedIn()" #loginForm="ngForm" class="navbar-form navbar-right" (ngSubmit)="login()"><input type="password" style="width: 0;height: 0; visibility: hidden;position:absolute;left:0;top:0;"/><input type="text" #username="ngModel" placeholder="Username" class="form-control" required autocomplete="off" name="username" [(ngModel)]="model.username"><input type="password" #password="ngModel" placeholder="Password" class="form-control" required autocomplete="off" name="password" [(ngModel)]="model.password">... 上的 Chrome 67.0
r
rybo111

这是我提出的解决方案,因为谷歌坚持要覆盖人们似乎做出的每一个变通办法。

选项 1 - 单击时选择所有文本

将输入的值设置为用户的示例(例如 your@email.com)或字段的标签(例如 Email),并将名为 focus-select 的类添加到您的输入:

<input type="text" name="email" class="focus-select" value="your@email.com">
<input type="password" name="password" class="focus-select" value="password">

这是jQuery:

$(document).on('click', '.focus-select', function(){
  $(this).select();
});

我真的看不到 Chrome 会弄乱价值观。那太疯狂了。所以希望这是一个安全的解决方案。

选项 2 - 将电子邮件值设置为空格,然后将其删除

假设您有两个输入,例如电子邮件和密码,请将电子邮件字段的值设置为 " "(一个空格)并添加属性/值 autocomplete="off",然后使用 JavaScript 清除它。 您可以将密码值留空。

如果用户由于某种原因没有 JavaScript,请确保您在服务器端修剪他们的输入(您可能无论如何都应该这样做),以防他们不删除空间。

这是jQuery:

$(document).ready(function() {
  setTimeout(function(){
    $('[autocomplete=off]').val('');
  }, 15);
});

我将超时设置为 15,因为 5 在我的测试中似乎偶尔会起作用,所以将这个数字增加三倍似乎是一个安全的选择。

未能将初始值设置为空格会导致 Chrome 将输入保留为黄色,就好像它已自动填充一样。

选项 3 - 隐藏输入

把它放在表格的开头:

<!-- Avoid Chrome autofill -->
<input name="email" class="hide">

CSS:

.hide{ display:none; }

确保保留 HTML 注释,以免其他开发人员将其删除!还要确保隐藏输入的名称是相关的。


@Vaia - 您是否尝试过导航到另一个页面然后按下后退按钮?我得到的结果好坏参半 - 它可能需要调整。
如果你是这个意思,我还没有尝试过选项 1。此外,我只需要禁用不会使用后退按钮调用的 ajax 加载模式上的自动填充。但如果会有其他结果,我会告诉你。 @rybo111
@Vaia 我的意思是选项 2 - 如果您遇到任何问题,请在此处回复。谢谢。
S
Stiffels

使用 css text-security: disc 而不使用 type=password。

html

<input type='text' name='user' autocomplete='off' />
<input type='text' name='pass' autocomplete='off' class='secure' />

or

<form autocomplete='off'>
    <input type='text' name='user' />
    <input type='text' name='pass' class='secure' />
</form>

css

input.secure {
    text-security: disc;
    -webkit-text-security: disc;
}

迄今为止我发现的最佳方法!好吧,至少对于 Chrome 64:/
就我的目的而言,这是完美的,谢谢! Chrome 不自动填充或自动完成它,不提供保存它,而且它不仅从视图中而且从剪贴板中都被遮住了 - 我复制了我输入的内容并将其粘贴到记事本中,然后得到了“••• ••••••••”。杰出的!
截至 2020 年 10 月,“text-security”不是有效的 CSS 属性
S
Shoaib Khan

以前输入的由 chrome 缓存的值显示为下拉选择列表。这可以通过 autocomplete=off 禁用,在 chrome 的高级设置中明确保存的地址会在地址字段获得焦点时提供自动填充弹出窗口。这可以通过 autocomplete="false" 禁用.但是它将允许chrome在下拉列表中显示缓存的值。

在输入 html 字段上,以下将关闭两者。

Role="presentation" & autocomplete="off"

在为地址自动填充选择输入字段时,Chrome 会忽略那些没有前面标签 html 元素的输入字段。

为了确保 chrome 解析器忽略自动填充地址弹出的输入字段,可以在标签和文本框之间添加隐藏按钮或图像控件。这将破坏自动填充的标签输入对创建的 chrome 解析序列。解析地址字段时忽略复选框

Chrome 还考虑标签元素上的“for”属性。它可以用来打破 chrome 的解析序列。


我爱你。此页面上唯一有效的解决方案。
这对我有用,但只在 Chrome 上测试过。
我尝试了 autocomplete="off" 单独不起作用,在添加 role="presentation" 之后,使它起作用
D
Denis Brezhitskiy

在某些情况下,即使自动完成属性设置为关闭,浏览器也会继续建议自动完成值。这种意想不到的行为可能会让开发人员感到非常困惑。真正强制不自动完成的技巧是为属性分配一个随机字符串,例如:

autocomplete="nope"

RE:“意外行为” 这种行为是由谷歌推动的,谷歌认为它比开发人员更了解每个页面应该如何工作。有时我只想要一个原始密码输入,零装饰。
这种组合最终对我有用:role="presentation" autocomplete="nope" 在 Chrome 版本 64.0.3282.186(官方构建)(64 位)上测试。什么样的恶梦!
随机字符串适用于 chrome 但不适用于 Firefox。为了完整起见,我同时使用“autocomplete='off-no-complete'”并将 readonly 属性设置为 onfocus="this.readOnly=false"。我的应用程序是一个企业应用程序,用户用来输入数千个地址,所以控制它的用例是真实的——我也可以保证使用 Javascript,所以至少我已经做到了
R
Rob Jensen

我发现将此添加到表单会阻止 Chrome 使用自动填充。

<div style="display: none;">
    <input type="text" id="PreventChromeAutocomplete" name="PreventChromeAutocomplete" autocomplete="address-level4" />
</div>

在这里找到。 https://code.google.com/p/chromium/issues/detail?id=468153#hc41

真正令人失望的是,Chrome 决定它比开发人员更了解何时自动完成。有一种真正的微软感觉。


你说的是PreventChromeAutocomplete,这并不是事实。我可以通过说 autocomplete="off" 和 name="somename" 来让自动完成工作。但这仅在您将两个不同的输入命名为相同名称时才有效。因此,在您的情况下,PreventChromeAutocomplete 必须已应用于两个不同的输入。很奇怪...
A
Avindu Hewa
<input readonly onfocus="this.removeAttribute('readonly');" type="text">

将 readonly 属性添加到标签以及 onfocus 事件删除它修复了问题


f
falsarella

对于用户名密码组合,这是一个容易解决的问题。 Chrome 启发式查找模式:

<input type="text">

其次是:

<input type="password">

简单地通过使这个无效来打破这个过程:

<input type="text">
<input type="text" onfocus="this.type='password'">

不幸的是,这不仅仅适用于用户名/密码类型的东西。 Chrome 将查看占位符文本以推断建议的内容。例如:jsbin.com/jacizu/2/edit
正如您的示例所示,您仍然可以使用浏览器建议填充字段是有效的,因此这并不能真正解决 OPs 问题。此解决方案只是阻止浏览器“自动”填充用户名和密码组合,如顶部答案的示例中所示。这可能对某些人有用,但不是禁用自动完成的最终解决方案,这必须来自谷歌。
虽然,如果您在占位符文本前添加一个空格,它也会禁用基于占位符的自动建议。绝对是一个黑客,虽然不比其他建议更多。 jsbin.com/pujasu/1/edit
实际上......它似乎适用于您的示例,但由于某种原因它不适用于我:-(
哈!这就是为什么它被称为黑客......你有一个例子可以分享它不起作用的地方吗?
M
Mike

2016 年,Google Chrome 开始忽略 autocomplete=off,尽管它在 W3C 中。 The answer they posted

这里棘手的部分是,在网络之旅的某个地方 autocomplete=off 成为许多表单字段的默认设置,而没有真正考虑过这是否对用户有利。这并不意味着不存在您不希望浏览器自动填充数据的非常有效的情况(例如在 CRM 系统上),但总的来说,我们将这些情况视为少数情况。因此,我们开始忽略 Chrome 自动填充数据的 autocomplete=off。

这实质上是说:我们更了解用户想要什么。

They opened another bug to post valid use cases when autocomplete=off is required

在我的所有 B2B 应用程序中,我没有看到与自动完成有关的问题,但只有输入密码类型。

如果屏幕上有任何密码字段,即使是隐藏的,自动填充也会介入。要打破这个逻辑,如果它不破坏你自己的页面逻辑,你可以将每个密码字段放入它自己的表单中。

<input type=name >

<form>
    <input type=password >
</form>

由于您的答案是最新的,您能否补充一下添加 autocomplete="pineapple" 或其他一些乱码似乎也可以解决问题?至少,它在我身上发生了!
@DouwedeHaan 在保存表单之前这很好,然后自动完成将为保存的“菠萝”字段提供建议。但是,例如使用随机散列作为自动完成值可能会解决这个问题?
@digout 我同意。一个很好的例子是将 UUID 用于这种东西。只要确保字符串是唯一的!
用 autocomplete="pineapple" 解决我的问题啊!!我一生中最愚蠢的解决方法:D 非常感谢! :D
m
mccainz

Mike Nelsons 提供的解决方案在 Chrome 50.0.2661.102 m 中对我不起作用。只需添加具有 display:none 设置的相同类型的输入元素不再禁用本机浏览器自动完成。现在需要复制您希望禁用自动完成的输入字段的名称属性。

此外,为避免输入字段在表单元素中时重复,您应该在未显示的元素上放置禁用。这将阻止该元素作为表单操作的一部分提交。

<input name="dpart" disabled="disabled" type="password" style="display:none;">
<input name="dpart" type="password">
<input type="submit">

至于 2016 年 6 月和 Chrome 51.0.2704.106 m,这是这里唯一可行的解决方案
但是表单会选择您需要的正确(可见)输入字段吗?因为是同一个名字。
@Vaia,将 disabled 属性添加到重复元素将阻止它被提交。
C
Chris Pratt

这有两个部分。 Chrome 和其他浏览器会记住以前输入的字段名称值,并基于此向用户提供一个自动完成列表(值得注意的是,密码类型输入从不以这种方式记住,原因相当明显)。您可以添加 autocomplete="off" 以防止在您的电子邮件字段等内容上发生这种情况。

但是,您将拥有密码填充器。大多数浏览器都有自己的内置实现,并且还有许多提供此功能的第三方实用程序。这,你停不下来。这是用户自己选择保存此信息以供以后自动填写,完全超出您的应用程序的范围和影响范围。


此答案的第一部分似乎不再正确:Chrome Bug
我不确定你在说什么。该“错误”只是 Chromium 为 autocomplete="off" 收集人们用例的占位符。 可能的意图是删除它,但这从未明确说明过,当然也没有什么需要这种精神上的飞跃。他们可能只是想考虑替代或更好的治疗方法。无论如何,它仍然是规范的一部分,同样,也没有迹象表明它将离开规范。而且,据我所知,它仍然适用于所有浏览器,包括 Chrome。
我们有几种情况,Chrome 不尊重 autocomplete="off"。
1. 一些轶事案例不构成证据。 2. 正如我在回答中所说,表单填写扩展等可能不会而且通常不会尊重这一点。最终,就像所有事情一样,这取决于客户,因此也取决于用户。您所能做的就是建议不要自动填充它。
R
Ryan Grush

如果您在保留占位符但禁用 chrome 自动填充时遇到问题,我发现了这个解决方法。

问题

HTML

<div class="form">
    <input type="text" placeholder="name"><br>
    <input type="text" placeholder="email"><br>
    <input type="text" placeholder="street"><br>
</div>

http://jsfiddle.net/xmbvwfs6/1/

上面的示例仍然会产生自动填充问题,但如果您使用 required="required" 和一些 CSS,您可以复制占位符并且 Chrome 不会拾取标签。

解决方案

HTML

<div class="form">
    <input type="text" required="required">
    <label>Name</label>  
    <br>
    <input type="text" required="required">
    <label>Email</label>    
    <br>
    <input type="text" required="required">
    <label>Street</label>    
    <br>
</div>

CSS

input {
    margin-bottom: 10px;
    width: 200px;
    height: 20px;
    padding: 0 10px;
    font-size: 14px;
}
input + label {
    position: relative;
    left: -216px;
    color: #999;
    font-size: 14px;
}
input:invalid + label { 
    display: inline-block; 
}
input:valid + label { 
    display: none; 
}

http://jsfiddle.net/mwshpx1o/1/


这是唯一有效的解决方案。我真的不喜欢它,但那是我们现在所处的糟糕状态:-(
截至 2017 年,这个仍然可以正常工作。如果用户单击“假”占位符,它只需要此脚本强制 input 焦点:$("label").on("click",function(){ $(this).prev().focus(); }); 请注意,label 不能在 input 之前... Chrome 找到它!不错的创意解决方案! +1
M
MZaragoza

我真的不喜欢制作隐藏字段,我认为这样做会很快变得非常混乱。

在您要停止自动完成的输入字段上,这将起作用。使字段只读并在焦点上删除该属性,如下所示

<input readonly onfocus="this.removeAttribute('readonly');" type="text">

这样做是您首先必须通过选择该字段来删除只读属性,那时您很可能将填充您自己的用户输入并弯腰自动填充以接管


不幸的是,这不再有效:-( jsbin.com/sobise/edit?html,css,output
D
Dr. Gianluigi Zane Zanettini

根据 Chromium bug report #352347,Chrome 不再尊重 autocomplete="off|false|anythingelse",无论是在表单上还是在输入上。

对我有用的唯一解决方案是添加一个虚拟密码字段:

<input type="password" class="hidden" />
<input type="password" />

M
MagicSux

好吧,既然我们都有这个问题,我花了一些时间来为这个问题编写一个有效的 jQuery 扩展。谷歌必须遵循 html 标记,而不是我们遵循谷歌

(function ($) {

"use strict";

$.fn.autoCompleteFix = function(opt) {
    var ro = 'readonly', settings = $.extend({
        attribute : 'autocomplete',
        trigger : {
            disable : ["off"],
            enable : ["on"]
        },
        focus : function() {
            $(this).removeAttr(ro);
        },
        force : false
    }, opt);

    $(this).each(function(i, el) {
        el = $(el);

        if(el.is('form')) {
            var force = (-1 !== $.inArray(el.attr(settings.attribute), settings.trigger.disable))
            el.find('input').autoCompleteFix({force:force});
        } else {
            var disabled = -1 !== $.inArray(el.attr(settings.attribute), settings.trigger.disable);
            var enabled = -1 !== $.inArray(el.attr(settings.attribute), settings.trigger.enable);
            if (settings.force && !enabled || disabled)
                el.attr(ro, ro).focus(settings.focus).val("");
        }
    });
};
})(jQuery);

只需将其添加到 /js/jquery.extends.js 之类的文件中,然后将其包含在 jQuery 中。在加载文档时将其应用于每个表单元素,如下所示:

$(function() {
    $('form').autoCompleteFix();
});

jsfiddle with tests


A
Abela

请尝试以下对我有用的 jQuery 代码。

if ($.browser.webkit) {
    $('input[name="password"]').attr('autocomplete', 'off');
    $('input[name="email"]').attr('autocomplete', 'off');
}

很棒很棒的解决方案
您可以将 autocomplete="off" 添加到输入字段而不是使用 jquery。顺便说一句,这不起作用。 Chrome 密码建议仍在显示。
h
hyper_st8

这是一个肮脏的黑客 -

你在这里有你的元素(添加 disabled 属性):

<input type="text" name="test" id="test" disabled="disabled" />

然后在你的网页底部放一些 JavaScript:

<script>
    setTimeout(function(){
        document.getElementById('test').removeAttribute("disabled");
        },100);
</script>

如果您不介意 Javascript,这是一个很好的解决方案。我发现 Chrome 在页面上单击了一下后仍会添加密码,因此我在 onmouseover 事件侦听器中重新启用了该字段。
M
Michael.

不同的解决方案,基于 webkit。如前所述,只要 Chrome 找到密码字段,它就会自动完成电子邮件。 AFAIK,这与 autocomplete = [whatever] 无关。

为了规避这种情况,请将输入类型更改为文本并以您想要的任何形式应用 webkit 安全字体。

.secure-font{
-webkit-text-security:disc;}

<input type ="text" class="secure-font">

据我所知,这至少与输入类型 = 密码一样安全,它是复制和粘贴安全的。但是,通过删除将删除星号的样式很容易受到攻击,当然 input type = password 可以很容易地在控制台中更改为 input type = text 以显示任何自动填充的密码,因此实际上几乎相同。


谢谢!这是在 chrome 49 中唯一有效的方法。以前的方法坏了,因为 chrome 现在似乎用 type="password" 填充所有输入。
m
mumair

通过将 autocomplete 设置为 off 应该可以在这里工作,我有一个谷歌在搜索页面中使用的示例。我从检查元素中找到了这个。

https://i.stack.imgur.com/NLvNh.png

编辑:如果 off 不起作用,请尝试 falsenofill。就我而言,它正在使用 chrome 版本 48.0


e
eug

我终于找到了使用 textarea 的成功。对于密码字段,有一个事件处理程序将输入的每个字符替换为“•”。


T
Thuong

我遇到了同样的问题。这是在 Chrome 上禁用自动填充用户名和密码的解决方案(仅在 Chrome 上测试过)

    <!-- Just add this hidden field before password as a charmed solution to prevent auto-fill of browser on remembered password -->
    <input type="tel" hidden />
    <input type="password" ng-minlength="8" ng-maxlength="30" ng-model="user.password" name="password" class="form-control" required placeholder="Input password">

奇怪的修复,但不知何故,这是在 chrome 48 上唯一对我有用的东西:)