ChatGPT解决这个技术问题 Extra ChatGPT

Chrome 忽略 autocomplete="off"

我创建了一个使用标签框下拉菜单的 Web 应用程序。这适用于除 Chrome 浏览器(版本 21.0.1180.89)以外的所有浏览器。

尽管 input 字段和 form 字段都具有 autocomplete="off" 属性,但 Chrome 坚持显示该字段以前条目的下拉历史记录,这会消除标签框列表。

从技术上讲,这个问题是在被称为“这个问题在这里已经有了答案”的那个问题之前大约 5 个月被问到的。那个是在这个之后出现的副本。
老实说,如果这是禁用 autocomplete=off 的原因。如果,计划是确保网络是详细和描述的,以便您现在使用的浏览器可以自动完成他们最新版本可能想要的任何字段。如果是这种情况,我们需要描述所有字段 - 浏览器将优雅地禁用自动完成脚本/应用程序范围之外的所有字段的自动完成......我打赌这种情况,
7 年了,我们仍然无法正确禁用自动完成功能……真可惜……
请参阅建议使用 autocomplete="new-password" 的 bugs.chromium.org/p/chromium/issues/detail?id=370363#c7 链接

A
Alexander Abakumov

防止用户名(或电子邮件)和密码的自动完成:

<input type="email" name="email"><!-- Can be type="text" -->
<input type="password" name="password" autocomplete="new-password">

防止自动完成字段(可能不起作用):

<input type="text" name="field" autocomplete="nope">

解释:

autocomplete 仍然适用于<input>尽管有 autocomplete="off",但您可以将 off 更改为随机字符串,例如 nope

其他禁用字段自动完成的“解决方案”(这不是正确的方法,但它有效):

1.

HTML:

<input type="password" id="some_id" autocomplete="new-password">

JS(加载):

(function() {
    var some_id = document.getElementById('some_id');
    some_id.type = 'text';
    some_id.removeAttribute('autocomplete');
})();

或使用 jQuery:

$(document).ready(function() {
    var some_id = $('#some_id');
    some_id.prop('type', 'text');
    some_id.removeAttr('autocomplete');
});

2.

HTML:

<form id="form"></form>

JS(加载):

(function() {
    var input = document.createElement('INPUT');
    input.type = 'text';
    document.getElementById('form').appendChild(input);
})();

或使用 jQuery:

$(document).ready(function() {
    $('<input>', {
        type: 'text'
    }).appendTo($('#form'));
});

使用 jQuery 添加多个字段:

函数 addField(label) { var div = $('

'); var input = $('', { type: 'text' }); if(label) { var label = $('
D
Diogo Cid

更新

现在 Chrome 似乎忽略了 style="display: none;"style="visibility: hidden; 属性。

您可以将其更改为:

<input style="opacity: 0;position: absolute;">
<input type="password" style="opacity: 0;position: absolute;">

根据我的经验,Chrome 只会自动完成第一个 <input type="password"> 和前一个 <input>。所以我添加了:

<input style="display:none">
<input type="password" style="display:none">

<form> 的顶部,此案已解决。


这不再起作用 chrome 40 不起作用 这个解决方案
这不仅丑陋,而且我仍然找不到为什么问题的任何解释?
如果使用 display: none ,Chrome 现在似乎会忽略它们,所以我用绝对定位将字段移出视图......
display: none; 将消失元素,与自动完成无关。
@AugustinRiedinger 为什么?因为 Chrome 粗暴地强迫开发人员这样做,因为他们不尊重规范并且不希望任何人禁用他们永远无法正确填写字段的可怕自动填充:sigh:
i
ice cream

Chrome 现在似乎会忽略 autocomplete="off",除非它位于 <form autocomplete="off"> 标记上。


对于 React 使用 'autoComplete=off'。
有关为什么 Chrome 做出此更改的解释,请参阅此答案:stackoverflow.com/a/39689037/1766230 -- 他们优先考虑用户而不是开发人员。
如果您想向 Chrome 团队提供使用 autocomplete="off" 的正当理由,请在此处进行:bugs.chromium.org/p/chromium/issues/detail?id=587466
只是对上述内容进行澄清,因为存在相互矛盾的报告。在表单标签上添加 autocomplete="off",在单个输入标签上添加 autocomplete="new-password"。从 Chrome 75 开始工作
作为 Chrome 81,它现在忽略各个字段上的 autocomplete="new-password"
c
cssyphus

2021 年更新:将 更改为

就这些。保留以下答案以怀旧。

为了获得可靠的解决方法,您可以将此代码添加到布局页面:

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

只有当表单中至少有一个其他输入元素具有任何其他自动完成值时,Chrome 才会尊重 autocomplete=off。

这不适用于密码字段——这些在 Chrome 中的处理方式非常不同。有关详细信息,请参阅 https://code.google.com/p/chromium/issues/detail?id=468153

更新:Chromium 团队于 2016 年 3 月 11 日以“无法修复”的形式关闭了错误。有关完整说明,请参阅 my originally filed bug report 中的最后一条评论。 TL;DR:使用语义自动完成属性,例如 autocomplete="new-street-address" 来避免 Chrome 执行自动填充。


@Jonathan Cowley-Thom:尝试这些包含我的解决方法的测试页面。在 hub.securevideo.com/Support/AutocompleteOn 上,您应该会看到 Chrome 自动完成建议。然后,在 hub.securevideo.com/Support/AutocompleteOff 上尝试相同的条目。您应该不会看到 Chrome 自动完成建议。我刚刚在 Chrome 45.0.2454.101m 和 46.0.2490.71m 上对此进行了测试,并且在两者上都按预期工作。
关于这个问题的另一个更新:我刚刚收到 Chrome 团队的通知,说这个问题已经修复。因此,希望很快不再需要这种解决方法!
请参阅我上面的帖子:“这不适用于密码字段 - 在 Chrome 中这些字段的处理方式非常不同。有关详细信息,请参阅 code.google.com/p/chromium/issues/detail?id=468153。”
@JTTaylor One 还必须具有 autocomplete="off" 属性,否则 type="search" 将无法解决问题。 感谢! 找到诀窍
在 type="tel" 这样的情况下,将输入类型更改为搜索没有用。
F
Fizzix

现代方法

只需将您的输入设为 readonly,然后在焦点上将其删除。这是一种非常简单的方法,浏览器不会填充 readonly 输入。因此,此方法被接受,并且永远不会被未来的浏览器更新覆盖。

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

下一部分是可选的。相应地设置您的输入样式,使其看起来不像 readonly 输入。

input[readonly] {
     cursor: text;
     background-color: #fff;
}

WORKING EXAMPLE


@Basit - 这就是我称它为 modern approach 的原因。世界上只有不到 1% 的用户关闭了 Javascript。所以老实说,当大多数网站都依赖 Javascript 时,不值得任何人花时间为这么少的受众提供服务。很长一段时间以来一直在开发网站,我的网站 100% 使用 Javascript 并严重依赖它。如果用户关闭了 Javascript,那是他们自己的问题和选择,而不是我的。如果关闭它,他们将无法访问或使用至少 90% 的在线网站......您的反对票完全无关紧要。
这在今天 49 中不起作用。Chrome“开发人员”正在关注 stackoverflow 解决方案并将其删除。
2015 年 9 月的这个答案基本上是下面 2014 年 11 月的答案的副本。
这会中断对 mandatory 的 HTML 表单检查。例如,使用此代码的密码字段不能在提交前强制填写。
请记住,在关键交互上依赖 JS 不仅会破坏停用 JS 的用户的功能:它也会破坏连接速度慢的用户(JS 尚未加载)。
C
Community

好吧,聚会有点晚了,但似乎对 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 的尝试。


@user2060451 - 什么不起作用?我刚刚在 Windows 和 Mac 上的 76.0.3809.87 中对其进行了测试。 - 两者都按照规范执行。如上所述。如果您可以提供比“不起作用”更多的描述,我可能会为您提供帮助。
我只是试图给(在加载所有内容后从控制台并在服务器端设置)一个随机字符串用于输入元素的自动完成,但它不起作用。将 autocomplete="off" 赋予表单元素也不起作用。
它适用于随机字符串。从我注意到的情况来看,似乎无论您放置什么属性值,chrome都会保存它。所以如果你把“关”,chrome会认为“关”等于你输入的值。下次您有一个“关闭”的表单时,chrome 将重用最后一个值。使用随机值可以解决该问题,因为如果该值每次都是新的且唯一的,则 chrome 将永远不会看到它并且不会提出任何建议。
不比设置 new-password 更好
@pishpish - OP 的问题没有提到任何关于密码字段的内容,而是针对一个 select 标签,这意味着这不是他们遇到问题的密码字段(尽管它也可能是一个问题字段)。此外,new-password 是规范中的提示,浏览器可能会或可能不会仅在密码字段中遵循它。因此,如果 new-password 并非在所有情况下都适用于密码字段,请不要感到惊讶。
K
Keith

TL;DR:告诉 Chrome 这是一个新密码输入,它不会提供旧密码作为自动完成建议:

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

autocomplete="off" 因设计决定而不起作用 - 大量研究表明,如果用户可以将密码存储在浏览器或密码管理器中,他们将更难破解密码。

autocomplete has changed 的规范,现在支持各种值以使登录表单易于自动完成:

<!-- Auto fills with the username for the site, even though it's email format -->
<input type="email" name="email" autocomplete="username">

<!-- current-password will populate for the matched username input  -->
<input type="password" autocomplete="current-password" />

如果您提供这些,Chrome 仍会尝试猜测,并在猜测时忽略 autocomplete="off"

解决方案是密码重置表单也存在 autocomplete 值:

<label>Enter your old password:
    <input type="password" autocomplete="current-password" name="pass-old" />
</label>
<label>Enter your new password:
    <input type="password" autocomplete="new-password" name="pass-new" />
</label>
<label>Please repeat it to be sure:
    <input type="password" autocomplete="new-password" name="pass-repeat" />
</label>

您可以使用此 autocomplete="new-password" 标志告诉 Chrome 不要猜测密码,即使它已为此网站存储了密码。

Chrome 还可以直接使用 credentials API 管理网站的密码,这是一个标准,最终可能会得到普遍支持。


不是一个真正令人信服的理由。用户想要某些东西这一事实并不意味着它是一个聪明的想法。这几乎与在应用程序中允许使用单字符密码一样糟糕,因为用户觉得这样更方便。有时,安全胜过便利……
我有一个名为“ContactNoAlt”的字段,Chrome 坚持填写电子邮件地址。自动完成开/关是首选,但在实际层面上需要解决方法,因为 Chrome 是错误的。更明确地说 autocomplete="off" 是一个标准——所以是什么让 Chrome 的开发者如此优秀以至于他们只是觉得他们可以忽略标准——也许有一天 Chrome 会决定其他一些 HTML 不方便......(这是开始感觉像 IE5/6 de-ja-vu)
我是 chrome 用户,我不想要这种行为。在自动填充弹出的密码框以确保只有我可以访问相关的 Web 应用程序之前,它甚至没有问我。保存一些密码并不意味着自动完成所有密码。
这个答案(和谷歌的行为)忽略了这样一个事实,即您可能想要这样做的主要原因之一是实现您自己的(例如,来自数据库的列表)自动完成行为。
您正试图捍卫 chrome 做出的明显错误的决定。我正在执行我无法更改的公司政策。所以现在我必须为 chrome 插入 hacks。他们目前工作。如果他们将停止工作,那么我们公司将更改员工的默认浏览器。所以现在我们有相同的行为,但在未来的升级中会有黑客攻击和可能损坏的页面。在这里看到所有这些答案,有很多开发人员使用这些技巧。镀铬做得好。
N
Nathan Pitman

目前的解决方案是使用type="search"。 Google 不会将自动填充应用于具有某种搜索类型的输入。

请参阅:https://twitter.com/Paul_Kinlan/status/596613148985171968

2016 年 4 月 4 日更新: 看起来这已修复!请参阅http://codereview.chromium.org/1473733008


这不像 v73 那样正确
这对我来说是最简单的,chrome 版本 98.0.4758.102。不过,它是否适用于其他版本的 Chrome 似乎很脆弱。
s
step

始终有效的解决方案

我已经通过使用随机字符解决了与谷歌浏览器的无休止的斗争。当你总是用随机字符串渲染自动完成时,它永远不会记住任何东西。

<input name="name" type="text" autocomplete="rutjfkde">

希望它对其他人有所帮助。

2022 年更新:

Chrome 进行了这项改进:autocomplete="new-password" 这将解决它,但我不确定 Chrome 是否会在一段时间后再次将其更改为不同的功能。


当每个渲染都有唯一的随机字符串时,它不可能记住。不是重点。
在电子邮件和密码字段的 chrome 版本 99.0.4844.51 中,这对我不起作用,但确实如此: autocomplete="new-password" 在 developer.mozilla.org/en-US/docs/Web/Security/… 上找到
也不适合我
d
dsuess

浏览器不关心 autocomplete=off auto 甚至将凭据填充到错误的文本字段?

我通过将密码字段设置为只读并在用户单击它或对该字段使用制表键时激活它来修复它。

修复浏览器自动填充:只读并在焦点上设置可写(在鼠标单击和选项卡中通过字段)

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

更新:Mobile 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 中的密码字段之前(只是由于观察而猜测)。由于浏览器是最后一个实例并且您无法控制它,有时即使 autocomplete=off 也不会阻止将凭据填写到错误的字段中,但不会阻止用户或昵称字段。


我没有使用 onfocus,而是使用 setTimeout 来清除只读,所以我的用户看不到输入是只读的并且永远不会关注它!
只有解决方案对我有用
m
matheca

Chrome 版本 34 现在忽略 autocomplete=offsee this

Lots of discussion 关于这是好事还是坏事?你有什么看法?


很抱歉投反对票...这不是讨论网站(请尝试使用 quora),并且您没有提供答案。不过感谢您的链接。
S
Steffi

您可以使用 autocomplete="new-password"

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

工作于:

铬:53、54、55

火狐:48、49、50


这是行不通的,因为自动完成字符串是固定的。浏览器下次会记住新密码。
t
thisisashwani

[适用于 Chrome(v88、89、90)、Firefox、Brave、Safari 的 2021 年工作] 此处已编写的旧答案将经过反复试验,但其中大多数未链接到任何官方文档或 Chrome 必须在这件事上说。

问题中提到的问题是由于 Chrome 的自动填充功能,这是 Chrome 在此错误链接中的立场 - https://bugs.chromium.org/p/chromium/issues/detail?id=468153#c164

简单来说,有两种情况——

[案例 1]:您的输入类型不是密码。在这种情况下,解决方案很简单,分为三个步骤。向输入名称添加名称属性不应以电子邮件或用户名之类的值开头,否则 Chrome 仍会显示下拉列表。例如,name="emailToDelete" 显示下拉列表,但 name="to-delete-email" 不显示。同样适用于自动完成属性。添加 autocomplete 属性,并添加一个对您有意义的值,例如 new-field-name 它将看起来像这样,并且您将在余生中不会再次看到此输入的自动填充 -

将名称属性添加到输入

名称不应以电子邮件或用户名之类的值开头,否则 Chrome 仍会显示下拉列表。例如,name="emailToDelete" 显示下拉列表,但 name="to-delete-email" 不显示。同样适用于自动完成属性。

添加自动完成属性,并添加对您有意义的值,例如 new-field-name

[CASE 2]: input type is password 好吧,在这种情况下,无论您是否尝试过,Chrome 都会向您显示管理密码/使用现有密码的下拉菜单。 Firefox 也会做类似的事情,所有其他主要浏览器也是如此。 [1] 在这种情况下,如果您真的想阻止用户查看下拉菜单以管理密码/查看安全生成的密码,您将不得不使用 JS 来切换输入类型,如其他答案中所述问题。

好吧,在这种情况下,无论您进行何种试验,Chrome 都会向您显示管理密码/使用现有密码的下拉菜单。 Firefox 也会做类似的事情,所有其他主要浏览器也是如此。 [1]

在这种情况下,如果您真的想阻止用户查看下拉菜单以管理密码/查看安全生成的密码,您将不得不使用 JS 来切换输入类型,如本问题的其他答案中所述。

[1] 关于关闭自动完成功能的详细 MDN 文档 - https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion


这是行不通的。我有一个输入用户名和密码的 WordPress 网站。对于用户名输入,我有 <input name="portal_user" type="text" maxlength="64" autocomplete="portal">。 Chrome 坚持自动填充 WordPress 管理员用户名和密码。
嗨@Gavin,这就是为什么我通过两个单独的案例来回答。请看我写的第二个案例。没有直接的方法来禁用密码的自动填充。 MDN 对此有一个很好的文档。这才是硬道理!对于用户名,它应该理想地工作。此外,通过自动填充,我或任何浏览器都在谈论带有保存列表的下拉菜单。您是在谈论自动完成吗?很乐意帮助您解决问题:)
E
Eduardo Cuomo

Autocomplete="Off" 不再起作用。

尝试仅使用随机字符串而不是 "Off",例如 Autocomplete="NoAutocomplete"

我希望它有所帮助。


C
Chang

看到 chrome 忽略 autocomplete="off",我用一种愚蠢的方法解决它,即使用“假输入”欺骗 chrome 来填充它而不是填充“真实”输入。

例子:

<input type="text" name="username" style="display:none" value="fake input" /> 
<input type="text" name="username" value="real input"/>

Chrome 会填写“假输入”,提交时,服务器会取“真实输入”的值。


L
Loenix

我发布这个答案是为了给这个问题带来更新的解决方案。我目前正在使用 Chrome 49,并且对此没有给出答案。我也在寻找与其他浏览器和以前版本一起使用的解决方案。

将此代码放在表单的开头

<div style="display: none;">
    <input type="text" autocomplete="new-password">
    <input type="password" autocomplete="new-password">
</div>

然后,对于您的真实密码字段,使用

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

如果这不再有效,或者如果您遇到其他浏览器或版本的问题,请评论此答案。

批准日期:

铬:49

火狐:44、45

边缘:25

互联网浏览器:11


不幸的是,Chrome 版本 49.0.2623.87 并且它不适用于 TextBox,我仍然看到自动完成弹出。
S
SuperDJ

不知道为什么这在我的情况下有效,但在 chrome 上我使用了 autocomplete="none" 并且 Chrome 停止为我的文本字段建议地址。


Chrome 86.0 确认/2020 年 11 月
m
minigeek

写一个 2020+ 的答案,以防万一这对任何人都有帮助。我在上面尝试了许多组合,尽管在我的情况下遗漏了一个键。即使我保留了 autocomplete="nope" 一个随机字符串,但它对我不起作用,因为我缺少 name 属性!

所以我保留了 name='password' 和 autocomplete = "new-password"

对于用户名,我保留了 name="usrid" // 不要保留包含“用户”的字符串

和 autocomplete = "new-password" // 也一样,所以 google 停止建议密码(管理密码下拉菜单)

这对我来说效果很好。 (我为 Cordova/ionic 使用的 Android 和 iOS 网络视图做了这个)

<ion-input [type]="passwordType" name="password" class="input-form-placeholder" formControlName="model_password"
        autocomplete="new-password" [clearInput]="showClearInputIconForPassword">
</ion-input>

截至 2021 年 2 月 3 日,此解决方案仍然有效 - 在最新的 Chrome、Firefox 和 IE11 上进行了测试。自动完成中的随机字符串不起作用。
很高兴知道那件事 :)
这在最新的 Chrome 27/11/2021 中运行良好 - 也不要使用 name="email"
Y
Yevgeniy Afanasyev

autocomplete="off" 通常有效,但并非总是如此。这取决于输入字段的 name。 “地址”、“电子邮件”、“姓名”等名称 - 将自动完成(浏览器认为它们可以帮助用户),当“代码”、“pin”等字段 - 不会自动完成时(如果设置了 autocomplete="off"

我的问题是 - 自动完成与 google address helper 混淆了

我通过重命名来修复它

<input type="text" name="address" autocomplete="off">

<input type="text" name="the_address" autocomplete="off">

在 chrome 71 中测试。


我认为这是删除自动完成的最新方法。 2020 年 5 月在 chrome 81 上工作
B
BenHero

一些结束 2020 更新。我尝试了来自不同站点的所有旧解决方案。他们都没有工作! :-( 然后我发现了这个:使用

<input type="search"/> 

自动完成功能消失了!

Chrome 86、FireFox、Edge 87 取得成功。


浏览器将为输入添加样式并使其清晰
U
Udhav Sarvaiya

对于任何寻找解决方案的人,我终于弄清楚了。

如果页面是 HTML5 页面(我使用的是 XHTML),Chrome 只服从 autocomplete="off"

我将我的页面转换为 HTML5,问题就消失了(facepalm)。


你能解释一下你是怎么做到的吗?
@user1130176 现在是 2021 年,除非您明确规定不使用 HTML5,否则您正在使用 HTML5。该解决方案(如果曾经是一个解决方案)不再相关。
M
Mahdi Afzal

autocomplete=off 在现代浏览器中很大程度上被忽略 - 主要是由于密码管理器等。

您可以尝试添加此 autocomplete="new-password" 它并非所有浏览器都完全支持,但它适用于某些浏览器


M
Matas Vaitkevicius

将输入类型属性更改为 type="search"

Google 不会对具有某种搜索类型的输入应用自动填充。


我会否决:在 chrome 60 上测试:这不会阻止自动完成..
C
Community

直到上周,以下两种解决方案似乎都适用于 Chrome、IE 和 Firefox。但是随着 Chrome 版本 48(仍然是 49)的发布,它们不再起作用:

表格顶部的以下内容:

<input style="display:none" type="text" name="fakeUsername"/>
<input style="display:none" type="password" name="fakePassword"/>

密码输入元素中的以下内容: autocomplete="off"

所以为了快速解决这个问题,起初我尝试使用最初将密码输入元素设置为禁用的主要技巧,然后在文档准备功能中使用 setTimeout 再次启用它。

setTimeout(function(){$('#PasswordData').prop('disabled', false);}, 50);

但这似乎太疯狂了,我进行了更多搜索,并在 Disabling Chrome Autofill 中找到了@tibalts 答案。他的回答是在密码输入中使用 autocomplete="new-password" ,这似乎适用于所有浏览器(我在此阶段保留了上面的修复号 1)。

以下是 Google Chrome 开发者讨论中的链接:https://code.google.com/p/chromium/issues/detail?id=370363#c7


@JorgeSampayo 仅适用于密码输入,但不适用于文本输入。
为什么有人要禁用用户名/密码字段的自动完成功能?浏览器制造商越来越多地忽略自动完成功能也就不足为奇了。让您的用户使用密码管理器。为了每个人的安全,应该鼓励而不是阻止这一点。
C
Community

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

来自:https://stackoverflow.com/a/29582380/75799


y
yivo

在 Chrome 48+ 中使用此解决方案:

将假字段放在真实字段之前:

隐藏虚假字段:.视觉隐藏{边距:-1px;填充:0;宽度:1px;高度:1px;溢出:隐藏;剪辑:矩形(0 0 0 0);剪辑:矩形(0、0、0、0);位置:绝对; } 你做到了!

这也适用于旧版本。


@yivo 看起来 urs 和 og 答案之间的唯一区别是 !important 标签,所以我添加了它们,但仍然无法正常工作。 dropbox.com/s/24yaz6ut7ygkoql/…
@MikePurcell 您的 form 标签上没有 autocomplete="off"。还尝试在 form 标记之后立即放置虚假输入。
@Yivo:尝试了您的建议,在电子邮件字段中效果很好,但是密码字段仍然会自动填充下拉菜单。 dropbox.com/s/5pm5hjtx1s7eqt3/…
D
Drzewiecki

我设法利用此规则禁用自动完成:

不是密码但应该被隐藏的字段,例如信用卡号,也可能具有 type="password" 属性,但应包含相关的自动完成属性,例如“cc-number”或“cc-csc”。 https://www.chromium.org/developers/design-documents/create-amazing-password-forms

<input id="haxed" type="password" autocomplete="cc-number">

然而,它伴随着巨大的责任:)

不要试图欺骗浏览器 密码管理器(内置于浏览器或外部)旨在简化用户体验。插入虚假字段、使用不正确的自动完成属性或利用现有密码管理器的弱点只会导致用户沮丧。


现在它显示 CC 建议而不是其他表单建议...
R
Renato Lochetti

在 chrome v. 34 之后,在 <form> 标记处设置 autocomplete="off" 不起作用

我进行了更改以避免这种烦人的行为:

删除密码输入的名称和 id 在输入中放入一个类(例如:passwordInput)

(到目前为止,Chrome 不会将保存的密码放在输入中,但现在表单已损坏)

最后,要使表单工作,请在用户单击提交按钮时运行此代码,或者在您想触发表单提交时运行:

var sI = $(".passwordInput")[0];
$(sI).attr("id", "password");
$(sI).attr("name", "password");

就我而言,我曾经在密码输入中有 id="password" name="password",所以我在触发提交之前将它们放回去。


s
spikyjt

虽然我同意自动完成功能应该是用户的选择,但有时 Chrome 会过分热衷于它(其他浏览器也可能如此)。例如,具有不同名称的密码字段仍会自动填充保存的密码,而前一个字段则填充用户名。当表单是 Web 应用程序的用户管理表单并且您不希望自动填充使用您自己的凭据填充它时,这尤其糟糕。

Chrome 现在完全忽略了 autocomplete="off"。虽然 JS hack 可能很有效,但我发现了一种在撰写本文时有效的简单方法:

将密码字段的值设置为控制字符 8(PHP 中的 "\x08" 或 HTML 中的 &#8;)。这会阻止 Chrome 自动填充该字段,因为它有一个值,但没有输入实际值,因为这是退格字符。

是的,这仍然是一个 hack,但它对我有用。 YMMV。


我认为他们已经掌握了这个技巧并忽略了值中的控制字符,所以它现在评估为空。请参阅@ice-cream stackoverflow.com/a/16130452/752696 的答案以获取正确的最新解决方案。
这里的用例相同:使用用户管理并自动填充自己的凭据。但是,由于它是我自己的代码,并且我重用 form 来创建新用户和编辑现有用户,只需通过 JS 覆盖 input 值即可删除自动完成功能。
在某些情况下,它不能由用户选择,例如在密码验证的情况下。在这些情况下,似乎没有办法做到这一点。浏览器现在总是建议使用保存的密码(即使使用新密码),这违背了目的。
B
Bailey Parker

从 Chrome 42 开始,此线程(截至 2015-05-21T12:50:23+00:00)中的任何解决方案/黑客都不能用于禁用单个字段或整个表单的自动完成功能。

编辑:我发现您实际上只需要在表单中插入一个虚拟电子邮件字段(您可以使用 display: none 将其隐藏),然后再插入其他字段以防止自动完成。我认为 chrome 会在每个自动完成的字段中存储某种形式的签名,并且包含另一个电子邮件字段会破坏此签名并阻止自动完成。

<form action="/login" method="post">
    <input type="email" name="fake_email" style="display:none" aria-hidden="true">
    <input type="email" name="email">
    <input type="password" name="password">
    <input type="submit">
</form>

好消息是,由于“表单签名”被破坏了,没有一个字段是自动完成的,所以在提交之前不需要 JS 清除虚假字段。

老答案:

我发现唯一可行的方法是在真实字段之前插入两个类型为电子邮件和密码的虚拟字段。您可以将它们设置为 display: none 以隐藏它们(忽略这些字段不够聪明):

<form action="/login" method="post">
    <input type="email" name="fake_email" style="display:none" aria-hidden="true">
    <input type="password" name="fake_password" style="display:none" aria-hidden="true">
    <input type="email" name="email">
    <input type="password" name="password">
    <input type="submit">
</form>

不幸的是,这些字段必须在您的表单中(否则两组输入都会自动填充)。因此,要真正忽略虚假字段,您需要在表单提交上运行一些 JS 以清除它们:

form.addEventListener('submit', function() {
    form.elements['fake_email'].value = '';
    form.elements['fake_password'].value = '';
});

请注意,使用 Javascript 清除值可以覆盖自动完成功能。因此,如果在禁用 JS 的情况下失去正确的行为是可以接受的,您可以使用 Chrome 的 JS 自动完成“polyfill”来简化所有这些:

(function(document) {

    function polyfillAutocomplete(nodes) {

        for(var i = 0, length = nodes.length; i < length; i++) {

            if(nodes[i].getAttribute('autocomplete') === 'off') {

                nodes[i].value = '';
            }
        }
    }

    setTimeout(function() {

        polyfillAutocomplete(document.getElementsByTagName('input'));
        polyfillAutocomplete(document.getElementsByTagName('textarea'));

    }, 1);

})(window.document);