【问题标题】:Chrome ignores autocomplete="off"Chrome 忽略 autocomplete="off"
【发布时间】:2021-07-26 08:18:10
【问题描述】:

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

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

【问题讨论】:

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

标签: html google-chrome autocomplete forms


【解决方案1】:

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

<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 仍然可以在 &lt;input&gt;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 添加多个字段:

function addField(label) {
  var div = $('<div>');
  var input = $('<input>', {
    type: 'text'
  });
  
  if(label) {
    var label = $('<label>', {
      text: label
    });
    
    label.append(input);
    div.append(label);    
  } else {
    div.append(input);    
  }  
  
  div.appendTo($('#form'));
}

$(document).ready(function() {
  addField();
  addField('Field 1: ');  
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form id="form"></form>

适用于:

  • 铬:49+

  • 火狐:44+

【讨论】:

  • 没有代码,如果 autocomplete="" 应该只接受布尔值,你的答案实际上如何防止自动完成
  • 最重要的(也是唯一对我有用的)是绝对确保您的 字段的 ID 和 Name 属性不包含“用户名”或“密码”。这有效地停止了我在 autocomplete="off" 上的所有自动完成。
  • Lol autocomplete="nope" 实际上对我有用,除非我将它添加到我的两个表单字段中。就像我可以将它放在任一字段上,然后 that 字段不会自动完成,但另一个字段仍会自动完成,但只要我把它放在两个字段上,它们都会再次开始自动完成。
  • lol autocomplete="nope" 效果很好。虽然很有趣
  • 是时候开始在自动完成标签中输入有趣的文本行了
【解决方案2】:

更新

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

您可以将其更改为:

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

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

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

&lt;form&gt;的顶部,这个案子就解决了。

【讨论】:

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

Chrome 现在似乎会忽略 autocomplete="off",除非它位于 &lt;form autocomplete="off"&gt; 标签上。

【讨论】:

  • 对于 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"
【解决方案4】:

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。”
  • @J.T.Taylor 一个还必须具有autocomplete="off" 属性,否则type="search" 将不起作用。 感谢! 找到诀窍
  • 将输入类型更改为搜索在 type="tel" 这样的情况下没有用。
【解决方案5】:

现代方法

只需输入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 尚未加载)。
【解决方案6】:

好吧,聚会有点晚了,但似乎对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 并非在所有情况下都适用于密码字段,请不要感到惊讶。
【解决方案7】:

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

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

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

autocompletehas 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。他们目前工作。如果他们将停止工作,那么我们公司将更改员工的默认浏览器。所以现在我们有相同的行为,但在未来的升级中会有黑客攻击和可能损坏的页面。在这里看到所有这些答案,有很多开发人员使用这些技巧。做得好铬。
【解决方案8】:

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

见:https://twitter.com/Paul_Kinlan/status/596613148985171968

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

【讨论】:

  • 这与 v73 不同
【解决方案9】:

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

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

希望对其他人有所帮助。

【讨论】:

  • 当每个渲染都会有唯一的随机字符串时,它不可能记住。不是重点。
【解决方案10】:

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

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

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

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

更新: 移动 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 上注意到这种奇怪的行为,当密码字段以相同的形式出现时。我猜,浏览器会寻找密码字段来插入您保存的凭据。然后它username 自动填充到最近的 textlike-input 字段中,该字段出现在 DOM 中的密码字段之前(只是由于观察而猜测)。由于浏览器是最后一个实例并且您无法控制它,有时即使 autocomplete=off 也不会阻止将凭据填写到错误的字段中,但不会阻止用户或昵称字段。

【讨论】:

  • 我没有使用 onfocus,而是使用 setTimeout 来清除只读,所以我的用户看不到输入是只读的并且永远不会聚焦它!
  • 只有解决方案适合我
【解决方案11】:

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

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

【讨论】:

  • 很抱歉投了反对票……这不是一个讨论网站(请尝试使用 quora),您也没有提供答案。不过感谢您的链接。
【解决方案12】:

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

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

工作于:

  • 铬:53、54、55
  • 火狐:48、49、50

【讨论】:

  • 这不起作用,因为自动完成字符串是固定的。浏览器下次会记住新密码。
【解决方案13】:

[2021 年适用于 Chrome(v88、89、90)、Firefox、Brave、Safari]

这里已经写的旧答案可以反复试验,但大多数 他们没有链接到任何官方文档或 Chrome 对此有何评论 问题。

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

简单来说,有两种情况-

  • [CASE 1]:您的input 类型不是password。在这种情况下,解决方案很简单,分为三个步骤。

    • name 属性添加到input
    • name 不应以电子邮件或用户名之类的值开头,否则 Chrome 最终仍会显示下拉菜单。例如,name="emailToDelete" 显示下拉菜单,但 name="to-delete-email" 不显示。同样适用于autocomplete 属性。
    • 添加autocomplete属性,并添加一个对你有意义的值,比如new-field-name

    它看起来像这样,在你的余生中你不会再看到这个输入的自动填充 -

    <input type="text/number/something-other-than-password" name="x-field-1" autocomplete="new-field-1" />
    
  • [案例 2]input typepassword

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

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

【讨论】:

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

Autocomplete="Off" 不再起作用了。

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

希望对你有帮助。

【讨论】:

    【解决方案15】:

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

    示例:

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

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

    【讨论】:

      【解决方案16】:

      我发布这个答案是为了给这个问题带来更新的解决方案。 我目前正在使用 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
      • Internet Explorer:11

      【讨论】:

      • 不幸的是,Chrome 版本 49.0.2623.87 并且它不适用于 TextBox,我仍然看到自动完成弹出。
      【解决方案17】:

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

      【讨论】:

      • 已确认 Chrome 86.0 /2020 年 11 月
      【解决方案18】:

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

      所以我保留了 name='password' 和自动完成=“新密码”

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

      and 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"
      【解决方案19】:

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

      我的问题是 - 自动完成功能与谷歌 address helper 混淆了

      我通过重命名修复了它

      来自

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

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

      在 chrome 71 中测试。

      【讨论】:

      • 我认为这是删除自动完成的最新方法。 2020 年 5 月在 chrome 81 上工作
      【解决方案20】:

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

      <input type="search"/> 
      

      自动完成功能消失了!

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

      【讨论】:

      • 浏览器会为输入添加样式并使其清晰
      【解决方案21】:

      对于任何正在寻找解决方案的人,我终于弄明白了。

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

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

      【讨论】:

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

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

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

      【讨论】:

        【解决方案23】:

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

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

        【讨论】:

        • 我会否决:在 chrome 60 上测试:这不会阻止自动完成..
        【解决方案24】:

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

        1. 表单顶部的以下内容:
        <input style="display:none" type="text" name="fakeUsername"/>
        <input style="display:none" type="password" name="fakePassword"/>
        
        1. 密码输入元素中的以下内容:

          自动完成=“关闭”

        所以为了快速解决这个问题,起初我尝试使用一个主要的技巧,即最初将密码输入元素设置为禁用,然后在文档准备功能中使用 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 仅适用于密码输入,但不适用于文本输入。
        • 为什么有人要禁用用户名/密码字段的自动完成功能?浏览器制造商越来越多地忽略自动完成功能也就不足为奇了。让您的用户使用密码管理器。为了每个人的安全,这应该鼓励而不是阻止。
        【解决方案25】:

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

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

        【讨论】:

          【解决方案26】:

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

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

            <form autocomplete="off">
              <input name="fake_email"    class="visually-hidden" type="text">
              <input name="fake_password" class="visually-hidden" type="password">
            
              <input autocomplete="off" name="email"    type="text">
              <input autocomplete="off" name="password" type="password">
            </form>
            
          2. 隐藏虚假字段:

            .visually-hidden {
              margin: -1px;
              padding: 0;
              width: 1px;
              height: 1px;
              overflow: hidden;
              clip: rect(0 0 0 0);
              clip: rect(0, 0, 0, 0);
              position: absolute;
            }
            
          3. 你做到了!

          这也适用于旧版本。

          【讨论】:

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

          在 chrome v. 34 之后,将 autocomplete="off" 设置为 &lt;form&gt; 标记不起作用

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

          1. 去掉密码输入的nameid
          2. 在输入中加入一个类(例如:passwordInput

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

          最后,为了让表单工作,当用户点击提交按钮,或者当你想触发表单提交时,运行这段代码:

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

          在我的例子中,我曾经在密码输入中有id="password" name="password",所以我在触发提交之前把它们放回去了。

          【讨论】:

            【解决方案28】:

            从 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);
            

            【讨论】:

              【解决方案29】:

              我有一个类似的问题,输入字段要么是姓名,要么是电子邮件。我设置了 autocomplete="off" 但 Chrome 仍然强制建议。原来是因为占位符文本中有“姓名”和“电子邮件”这两个词。

              例如

              <input type="text" placeholder="name or email" autocomplete="off" />
              

              我通过在占位符中的单词中放置一个零宽度空格来解决它。不再有 Chrome 自动完成功能。

              <input type="text" placeholder="nam&#8203;e or emai&#8203;l" autocomplete="off" />
              

              【讨论】:

                【解决方案30】:

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

                不是密码但应该隐藏的字段,例如信用 卡号,也可能有 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">
                

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

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

                【讨论】:

                • 现在它显示抄送建议而不是其他表单建议...
                猜你喜欢
                • 1970-01-01
                • 2013-08-15
                • 2015-05-21
                • 1970-01-01
                • 2019-04-11
                • 2018-06-17
                • 2014-05-05
                • 1970-01-01
                • 2014-11-07
                相关资源
                最近更新 更多