停用 Chrome 自动填充功能

Disabling Chrome Autofill

提问人:templaedhel 提问时间:4/1/2013 最后编辑:George Kagantemplaedhel 更新时间:6/26/2023 访问量:1036216

问:

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

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

表单中的字段都有非常常见和准确的名称,例如“电子邮件”、“名称”或“密码”,并且它们还设置了。autocomplete="off"

自动完成标志已成功停用自动完成行为,即在您开始输入时会显示值下拉列表,但并未更改 Chrome 自动填充字段的值。

此行为是可以的,除非 chrome 错误地填充了输入,例如使用电子邮件地址填充了电话输入。客户对此表示不满,因此它被证实在多种情况下发生,而不是我在机器上本地完成的工作的某种结果。

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

HTML 表单 Google-Chrome 完成自动 填充

评论

6赞 Nicu Surdu 5/8/2013
它不是重复的。这个处理禁用自动填充,那个处理自动填充颜色的样式......
17赞 roughcoder 4/21/2015
autocomplete=“false” 而不是 autocomplete=“off” 根据 Kaszoni Ferencz 的回答,为它投票吧。
7赞 mindplay.dk 7/28/2015
看看这个问题的答案数量——它应该告诉你一些事情:你正在打一场失败的战斗。这不再是Chrome的问题,Firefox和其他公司也纷纷效仿。不管你喜不喜欢,你都需要接受浏览器行业的决定,即表单自动完成是用户的选择——你可以和他们战斗,但你会输。归根结底,您应该问的问题不是,我怎样才能颠覆自动完成,而是如何创建与自动完成配合良好的表单。你对安全的担忧不是你要担心的,而是用户要担心的。
21赞 Mike K 4/29/2016
对不起,@mindplay.dk 的回应适得其反。我的情况是,我有用户登录了我的网站,网站上的一个页面供他们输入其他系统的帐户/密码信息。当我为他们输入一个新网站设置一个 diaog 时,他们的登录信息会被填写,这是完全错误的,如果/当用户无意中输入该信息时,将导致问题。两人彼此没有任何关系。在这种情况下,浏览器正在做一些与用户想要的事情相反的事情。
8赞 PoloHoleSet 8/3/2016
@mindplay.dk - 我的 Web 应用程序是工作场所的工作流管理应用程序,所以,不,对安全性的担忧是我担心的,这是最高管理层的要求,所有员工(也就是“用户”)都必须遵守。但是,要求他们自己设置 Chrome、IE 或任何其他浏览器会在身份验证过程中留下空白,因为他们可以有意或无意地使用自动填充功能。A并非所有 Web 应用程序都属于同一类型,具有相同类型的用户或关注点。

答:

842赞 mike nelson 4/10/2013 #1

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

旧解决方案

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

更新的解决方案

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; 不再起作用,但位置:固定;顶部:-100px;左:-100px;宽度:5px;:)

2020 年 4 月更新

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

更新 2023 年 6 月

autocomplete="new-password"

这目前正在工作。

评论

20赞 Tominator 5/14/2014
这曾经工作正常,我也使用它,但是自从前段时间(那时到 5 月 5 日之间)进行 Chrome 升级以来,Chrome 忽略了 form 属性:(
14赞 Jammer 6/2/2014
谷歌在(我认为是 Chrome v34)中做出了决定,将其制定为现在始终忽略 autocomplete=“off” 的政策,包括表单级指令......如果它真的把该死的领域弄对了,那就好了。
10赞 roughcoder 4/21/2015
尝试 autocomplete=“false” 而不是 autocomplete=“off”
335赞 rybo111 6/14/2015
此属性也是必需的:autocomplete="I told you I wanted this off, Google. But you would not listen."
116赞 Alex from Jitbit 5/17/2020
chrome-off在 Chrome 81 中为我工作。另外 - 每个人都过得怎么样?自从我第一次提出这个问题以来,我已经有了 2 个孩子。保持健康!
6赞 Priyanka 3/20/2014 #2

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

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

评论

0赞 DKR 12/4/2019
真棒 真棒解决方案
0赞 Avatar 3/18/2020
您可以只添加到输入字段,而不是使用 jquery。顺便说一句,这是行不通的。Chrome 密码建议仍在显示。autocomplete="off"
66赞 Jobin 5/14/2014 #3

试试这个。我知道这个问题有点老了,但这是解决问题的不同方法。

我还注意到问题就在现场上方。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="" />

希望它能帮助到某人。

评论

1赞 Jeffrey Simon 7/26/2014
这个对我有用(目前)。我发现随着时间的推移,我已经使用了大约六种不同的黑客,过了一段时间,Chrome 决定要击败那个黑客。所以需要一个新的,比如这个。在我的应用程序中,我有一个配置文件更新表单,其中包含电子邮件和密码字段,除非用户想要进行更改,否则这些字段将留空。但是,当 Chrome 自动填充时,它会将用户 ID 放在“电子邮件确认”字段中,从而导致各种错误情况,从而导致进一步的错误情况,因为用户在尝试做正确的事情时苦苦挣扎。
2赞 MrBoJangles 10/7/2014
关于为什么这个黑客有效的快速解释(目前):Chrome 看到第一个 type=password 输入并自动填充它,它假设紧挨着这个字段必须是 userhame 字段,并用用户名自动填充该字段。@JeffreySimon这应该可以解释电子邮件确认字段中的用户ID现象(我在表单上看到了同样的事情)。
1赞 mike nelson 3/22/2015
@kentcdodds - 不确定你说不再工作的意思。您的 jsbin 没有密码字段,因此情况不同。我已经使用这个解决方案多年了,最近我注意到它是需要的,它就在上周(2015 年 3 月)对我有用。
2赞 rybo111 6/14/2015
万岁!一个似乎有效的解决方案!我建议给该字段命名并指定合法字段,因为 Google 现在似乎正在查看 .但是,这意味着 Chrome 不会保存密码,这是我真正想要的功能。啊passwordactual_passwordname
2赞 MrBoJangles 9/4/2015
更新:自我上次实施以来,这继续工作了一年多。我们在这里可能有一个坚实的赢家。
3赞 user3638028 5/15/2014 #4

唯一对我有用的方法是:(需要jQuery)

$(document).ready(function(e) {
    if ($.browser.webkit) {
        $('#input_id').val(' ').val('');
    }
});
7赞 Chris Pratt 7/25/2014 #5

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

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

评论

0赞 Joshua Drake 4/10/2019
这个答案的第一部分似乎不再正确了:Chrome Bug
0赞 Chris Pratt 4/10/2019
我不确定你在说什么。这个“错误”只是 Chromium 收集人们用例的占位符。其意图可能是删除它,但这从未明确说明过,当然也没有什么需要这种精神上的飞跃。他们可能只是想考虑替代或更好的方法来治疗它。无论如何,它仍然是规范的一部分,同样,也没有迹象表明它将离开规范。而且,据我所知,它仍然适用于所有浏览器,包括 Chrome。autocomplete="off"
0赞 Joshua Drake 4/11/2019
在一些情况下,Chrome 不遵守 autocomplete=“off”。
0赞 Chris Pratt 4/11/2019
1. 几个轶事案例不构成证据。2. 正如我在回答中所说,表单填写扩展等可能不而且经常不尊重这一点。归根结底,就像所有事情一样,这取决于客户,因此也取决于用户。您所能做的就是建议它不应该被自动填充。
1赞 Iamzozo 9/21/2014 #6

除了 autocomplete=“off” 之外,还必须将值设置为空 (value=“”) 才能使其工作。

146赞 dsuess 11/14/2014 #7

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

解决方法是使用只读模式禁用浏览器自动填充,并在焦点上设置可写:

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

该事件在单击鼠标和按 Tab 键浏览字段时发生。focus

更新:

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 中的密码字段之前(由于观察而猜测)。由于浏览器是最后一个实例,您无法控制它,

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

评论

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

这是一个肮脏的黑客 -

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

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

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

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

评论

1赞 Bruno Schäpper 7/12/2021
如果你不介意 Javascript,这是一个很好的解决方案。我发现 Chrome 在点击页面后仍然会添加密码,所以我在事件侦听器中重新启用了该字段。onmouseover
7赞 Ryan Grush 3/19/2015 #9

如果您在保留占位符但禁用 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/

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

溶液

[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/

评论

0赞 kentcdodds 3/21/2015
这是唯一真正有效的解决方案。我真的不喜欢它,但这就是我们现在所处的肮脏状态:-(
0赞 Louys Patrice Bessette 3/31/2017
截至 2017 年,这个仍然工作正常。如果用户单击“假”占位符,它只需要此脚本来强制对焦:请注意,不能在...Chrome 找到了它!不错的创意解决方案!+1input$("label").on("click",function(){ $(this).prev().focus(); });labelinput
7赞 MZaragoza 3/19/2015 #10

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

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

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

这样做的目的是,您首先必须通过选择字段来删除只读属性,届时您很可能会使用自己的用户输入进行填充,并弯曲自动填充来接管

评论

1赞 kentcdodds 3/21/2015
不幸的是,这不再有效:-(jsbin.com/sobise/edit?html,css,output
9赞 Bernesto 3/20/2015 #11

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

<input type="text">

其次:

<input type="password">

只需通过使此无效来中断此过程:

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

评论

0赞 kentcdodds 3/21/2015
不幸的是,这不仅仅适用于用户名/密码类型。Chrome 会查看占位符文本,以推断要建议的内容。例如:jsbin.com/jacizu/2/edit
0赞 Bernesto 3/21/2015
正如您的示例所示,您仍然可以使用浏览器建议填充字段,因此这并不能真正解决 OP 问题。此解决方案只是防止浏览器“自动”填充用户名和密码组合,如顶部答案的示例所示。这可能对某些人有用,但并不是禁用自动完成的最终解决方案,这必须来自 Google。
4赞 Bernesto 3/21/2015
不过,如果您在占位符文本前面添加一个空格,它也会禁用基于占位符的自动建议。绝对是一个黑客,尽管不比其他建议更重要。jsbin.com/pujasu/1/edit
0赞 kentcdodds 3/21/2015
实际上。。。它似乎适用于您的示例,但由于某种原因它对我不起作用:-(
0赞 Bernesto 3/21/2015
医 管 局!这就是为什么它被称为黑客......你有没有一个例子可以分享它不起作用的地方?
2赞 Yared Rodriguez 3/30/2015 #12

最后,我想我得到了一个不错的解决方案。更好地了解下拉菜单如何与 Chrome 配合使用有助于:)基本上,当您专注于输入时,以及当您键入与 Chrome 内存中的内容匹配的条目时生成鼠标按下事件时,将显示下拉列表。请记住这一点,并且当某些输入具有默认名称(如“名称”,“电子邮件”等)时,Chrome会这样做,然后我们只需要在显示下拉列表时删除该名称,并在:)后将其添加回来我想使用一种解决方案,只需添加属性自动完成即可使其工作。我认为这是有道理的。代码如下:

解决方案 1

jQuery('body').on('mousedown','[name="name"][autocomplete="off"], [name="email"][autocomplete="off"]',function(e){
    e.stopImmediatePropagation();
    if(typeof this.currentName =="undefined")
        this.currentName=jQuery(this).attr('name');
    jQuery(this).attr('name','');
});

jQuery('body').on('blur','[autocomplete="off"]',function(e){
    e.stopImmediatePropagation();
    jQuery(this).attr('name',this.currentName);
});

解决方案 2(我最喜欢的一个)

我上面描述的解决方案将删除输入的名称,直到我们删除焦点(模糊),在那一刻,它将恢复原始名称。但是,我们可能会在键入时通过其 name 属性访问输入。这意味着我们需要在每次输入后立即将名称放回原处。这个解决方案,基本上是基于第一个解决方案。在这种情况下,我们将在按下键时添加名称,然后将其放回键上。我认为这与“自动完成关闭”行为应该是什么更简洁。无论如何,这是代码:

jQuery('body').on('mousedown keydown','[name="name"][autocomplete="off"], [name="email"][autocomplete="off"]',function(e){
    e.stopImmediatePropagation();
    if(typeof this.currentName =="undefined")
        this.currentName=jQuery(this).attr('name');
    jQuery(this).attr('name','');
});
jQuery('body').on('blur keyup','[autocomplete="off"]',function(e){
    e.stopImmediatePropagation();
    if(typeof this.currentName !="undefined")
        jQuery(this).attr('name',this.currentName);
});

请注意,对于解决方案 1 和 2,我只考虑了输入名称为“name”和“email”的情况。对于此属性使 Chrome 生成下拉列表的任何其他情况,您必须将其添加到鼠标按下事件的选择器中。

解决方案 3

这个解决方案要混乱得多。我没有意识到我们试图纠正的行为只是基于那些具有特定名称(如“姓名、电子邮件等”)的输入。对于这种情况,该解决方案的方法是Chrome显示我们先验不知道的其他名称。这将是一个非常通用的解决方案。我不像其他 2 个那样喜欢,主要是因为当我们按下删除键时可能会有轻微的闪烁。我会在下面解释。

我发现下拉列表在第二次单击输入后出现,但在第一次单击时没有出现在输入上。我为所有这些元素绑定了一个“mousedown”事件,其中处理程序基本上检测它是否已经聚焦在输入上,如果它检测到另一个“鼠标按下”,则强制执行 .blur(),然后强制执行 .focus(),防止第二次单击时的下拉列表。我希望,很明显,以防万一这是我使用的代码:

jQuery('body').on('mousedown','[autocomplete="off"]',function(e){
    e.stopImmediatePropagation();
    if(jQuery(this).is(':focus')) {
        jQuery(this).blur();
        jQuery(this).focus();
    }
});

另一方面,为了防止在您输入时出现下拉列表,以防它与 Chrome 建议匹配......这有点棘手。我只是决定在用户键入时替换输入的默认行为。下拉列表在鼠标按下时评估输入,因此我阻止了字母数字、空格等的默认行为。唯一的问题是 Command、Ctrl 和 delete。对于这种情况,我还必须在鼠标上绑定一个事件。它允许在前两种情况下使用默认行为,因此您可以进行复制、粘贴或全选。在删除的情况下,我必须允许默认行为,但如果在删除字符后输入与 Chrome 建议匹配,则它再次显示下拉列表。在这种情况下,我不得不使用相同的模糊和聚焦技巧。我发现的唯一不便之处是,由于我们正在取消 keyup 时的行为,并且 chrome 尝试在 keydown 时显示它,因此会出现小闪烁。无论如何,这是我能做的最好的事情。可能它需要在某一点过滤字符。我只是添加了条件现在更有意义。这是代码的第二部分:

jQuery('body').on('keydown','[autocomplete="off"]',function(e){
    e.stopImmediatePropagation();
    var ctrlKey = 17,cmKey = 91;
    var charCode = e.which || e.keyCode;

    if(charCode!=16 && this.commandDown != true && this.ctrlDown != true && ((charCode>47 && charCode<58)||(charCode>64 && charCode<91)||(charCode>96 && charCode<123)||charCode==0 || charCode==32)){ 
        e.preventDefault();
        var charStr = String.fromCharCode(charCode);
        if(!e.shiftKey)
            charStr = charStr.toLowerCase(charStr);
        $(this).val($(this).val() + charStr);
    }else{
        if (charCode == cmKey) this.commandDown = true;
        if (charCode == ctrlKey) this.ctrlDown = true;
    }
});
jQuery('body').on('keyup','[autocomplete="off"]',function(e){
    e.stopImmediatePropagation();
    var allowed=[8];//Delete
    var ctrlKey = 17,cmKey = 91;
    var charCode = e.which || e.keyCode;

    if (charCode == cmKey) {this.commandDown = false};
    if (charCode == ctrlKey) {this.ctrlDown = false};
    if(allowed.indexOf(charCode)>=0 || (this.commandDown!=false && this.ctrlDown!=false)){
        jQuery(this).blur();
        jQuery(this).focus();
}

正如我所说,这个解决方案要混乱得多。这是我使用的第一个,直到我意识到下拉列表只是针对某些输入名称出现。

对不起,写了这么多,我只是想确保一切都清楚。我希望它有所帮助。

294赞 Fery Kaszoni 4/12/2015 #13

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

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

就这么简单,它在 Google Chrome 中也像魅力一样工作!


2019 年 8 月更新(归功于评论中的@JonEdiger)

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

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

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

评论

8赞 Dvd Franco 5/27/2015
为我工作!但有一点很重要:我的网页中有 5 个字段:姓名、地址、邮政编码、电话和电子邮件。当我在表单和名称字段中包含 autocomplete='false' 时,它仍然有效。但是,当我在地址字段中也包含 autocomplete='false' 时,它最终停止了自动填充它们!因此,您需要将自动完成属性放在登录名或名称字段上,而不是放在以下字段上!(截至 2015-05-27 适用于 Chrome 43.0.2357.81)
53赞 genkilabs 5/29/2015
如果这对您不起作用: 请记住,Chrome 可以通过两种方式“帮助”用户。“自动完成”将根据之前在同一表单中提交的内容进行提示,并将影响多次使用该表单的用户。自动完成功能被禁用,并显示 autocomplete=“off”。AUTOFILL 将根据以前在其他页面上填写的类似表单中的地址簿进行提示。它还将突出显示它正在更改的字段。可以使用 autocomplete=“false” 禁用自动填充。
4赞 rybo111 6/14/2015
这对我不起作用(版本 43.0.2357.124 m)。这可能是谷歌的疏忽,现在已经解决了。他们似乎在想“用户永远是对的”,因为他们想要自动填充所有内容。问题是,我的注册表单像登录表单一样保存用户数据,这绝对不是用户想要的......
3赞 Adriano Rosa 7/3/2015
是的,它适用于 Chrome 43.0.2357!!Chrome 中的这种行为非常烦人,这种解决方法花了我一段时间才弄清楚。谢谢你的回答。
3赞 Mattijs 8/25/2015
不适用于 Chrome 44.0.2403.157。此功能如何工作,不适用于不同的版本。这太荒谬了
0赞 David Adams 6/2/2015 #14

我在“立即登录或注册”模式窗口中遇到了这个问题,如果用户已将其凭据保存到浏览器,则会出现问题。登录和注册字段都已填充,因此我能够使用以下angular js指令清除它们:

(function () {
    "use strict";

    var directive = function ($timeout) {
        return {
            restrict: "A",
            link: function (scope, element, attrs) {
                $timeout(function () {
                    element.val(" ");
                    $timeout(function () {
                        element.val("");
                    });
                });
            }
        };
    };

    angular.module("app.directives").directive("autofillClear", ["$timeout", directive]);
}());

它与之前一些使用 jquery 的答案基本相同,但以角度方式完成。

评论

0赞 Walid Ammar 6/7/2015
它几乎不作修改,$timeout(function() { element.val("") }, 300)
20赞 rybo111 6/14/2015 #15

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

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

将输入的值设置为用户的示例(例如),或字段的标签(例如),并添加一个调用到输入的类:[email protected]Emailfocus-select

<input type="text" name="email" class="focus-select" value="[email protected]">
<input type="password" name="password" class="focus-select" value="password">

这是jQuery:

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

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

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

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

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

下面是 jQuery:

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

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

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

选项 3 - 隐藏输入

把它放在表单的开头:

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

CSS:

.hide{ display:none; }

确保保留 HTML 注释,以便其他开发人员不会删除它!此外,请确保隐藏输入的名称相关。

评论

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

2023 年 6 月:适用于 Chrome https://robindirksen.com/blog/html-autocomplete-one-time-codeautocomplete="one-time-code"

2022 年 4 月:在 Chrome 中仍然不起作用,在查看了与该问题相关的 Chromium 错误(可能仅适用于密码字段)后,我不相信它曾经有过。我看到 2014 年报告的问题被关闭为“WontFix”,并且问题仍然悬而未决并正在讨论中 [1] [2]。从我收集到的信息来看,Chromium 团队不相信 .autocomplete="off"autocomplete="off"

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

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

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

如果您想禁用自动填充,我们的建议是 利用 autocomplete 属性为您的 领域。如果我们遇到我们没有的自动完成属性 认识到,我们不会试图填补它。

例如,如果您的 CRM 工具中有一个地址输入字段 你不希望 Chrome 自动填充,你可以给它语义 相对于您的要求有意义的含义:例如 autocomplete=“new-user-street-address”。如果 Chrome 遇到这种情况,它会 不会尝试自动填充该字段。

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

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

我们必须求助于此是愚蠢的,但唯一可靠的方法是尝试尽可能多地混淆浏览器:

  • 在不向浏览器泄露任何信息的情况下命名您的输入,即 而不是。id="field1"id="country"

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


2021 年 1 月:现在按预期工作(在 Chrome 88 macOS 上测试)。autocomplete="off"

为此,请确保将输入标记放在 Form 标记中


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


2015年原答案:

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

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

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

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

评论

173赞 Kevin 8/1/2015
“new-password”在尝试“off”和“false”后对我有用
30赞 David 8/7/2015
这是现在唯一有效的修复程序。False,关闭,不再起作用。现在应该是正确答案了。
32赞 PellucidWombat 1/14/2018
自 2018 年 1 月 13 日起无法正常工作 版本 63.0.3239.132(官方版本)(64 位)
97赞 Eddy Howard 3/19/2019
我只想说..偶然发现这个问题后..Chrome 是一项真正的工作。因此,现在我们必须跳过重重障碍来禁用本应保持可选的功能。在哪个世界里,地址每次都是新的/不同的业务应用程序中需要自动填充。谷歌正在变得和Microsoft一样糟糕。
18赞 Joe Solano 6/22/2021
在 Windows 上的 Chrome 91 中,我无法让 Chrome 停止自动填充,autocomplete=“off” 和 autocomplete=“chrome-off” 都不起作用
0赞 Hemant_Negi 7/15/2015 #17

我知道这并不完全相关,但这就是我所做的。 自动填充字段会引发“更改”事件,但前提是您尽早将其绑定到它们。

所以我把它放在头部部分。

  $(document).ready(function(){
            $('input').on('change',function(){$(this).val('')})
     }); 

它对我有用。

20赞 Momin 7/24/2015 #18

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

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

Role="presentation" & autocomplete="off"

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

若要确保部件版式分析器忽略自动填充地址弹出窗口的输入字段,可以在标签和文本框之间添加隐藏按钮或图像控件。这将中断为自动填充创建标签输入对的镶边解析序列。 解析地址字段时会忽略复选框

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

评论

1赞 Day Davis Waterbury 11/3/2018
我爱你。此页面上唯一真正有效的解决方案。
0赞 sam 1/23/2021
这对我有用,但只在 Chrome 上进行了测试。
3赞 rickvian 2/2/2021
我尝试过 autocomplete=“off” 单独不起作用,在添加 role=“presentation” 后,使其正常工作
0赞 marcovtwout 2/6/2023
这可行,但将 ARIA 值作为解决方法感觉是错误的(developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/......)
1赞 Bocapio 8/4/2015 #19

就像 Dvd Franco 说的那样,对我来说,只在所有领域都放置了 automplete='off',它有效。所以我把这个jquery规则放在$(document).ready();我的主 .js 文件上的函数

$('form.no_autofill').attr('autocomplete','off');
$('.no_autofill input').attr('autocomplete','off');
0赞 Geoff Kendall 9/10/2015 #20

为用户名字段输入值 ' '(空格)。

<input type = 'text' value = ' ' name = 'username' />

如果您曾经使用用户输入的值填充用户名,如果没有用户输入的值,请输入“”代码。

编辑:我还必须更改“用户名”字段以具有“用户名”以外的其他名称,例如“nameofuser”

4赞 Thuong 9/15/2015 #21

我遇到过同样的问题。这是在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">

评论

0赞 Jacka 2/15/2016
奇怪的修复,但不知何故,这是 Chrome 48 上唯一对我有用的东西:)
-2赞 Jan DB 9/28/2015 #22

我的解决方案:

$(function(){
    $("form[autocomplete=off]").find('input').attr('autocomplete', 'false');
});

它在具有“autocomplete=”off“的表单中的所有输入字段上设置属性”autocomplete=“false”'。

这适用于 chrome、firefox 和 safari。

13赞 Rob Jensen 11/18/2015 #23

我发现将其添加到表单会阻止 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已经决定它比开发人员更了解何时自动完成。有一种真正的Microsoft感觉。

评论

0赞 Joe Heyming 12/16/2015
这并不是你说的 PreventChromeAutocomplete。我能够通过说 autocomplete=“off” 和 name=“somename” 来使自动完成工作。但这只有在您将两个不同的输入命名为相同的名称时才有效。因此,在您的情况下,PreventChromeAutocomplete 必须已应用于两个不同的输入。很奇怪...
2赞 Juan Carrey 12/7/2015 #24

我需要一些额外的字段才能正常工作,因为 chrome 实际上填充了许多字段。而且我还需要以一种比 display:none 更花哨的方式隐藏字段,以便它真正起作用。

<style>.stylish { position:absolute; top:-2000px; }</style>
<input id="_____fake_email_remembered" class="stylish" tabindex="-1"  type="email" name="email_autofill"/> 
<input id="_____fake_userName_remembered" class="stylish" tabindex="-1"  type="text" name="userName_autofill"/>
<input id="_____fake_firstName_remembered" class="stylish" tabindex="-1"   type="text" name="firstName_autofill"/>
<input id="_____fake_lastName_remembered" class="stylish" tabindex="-1"   type="text" name="lastName_autofill"/>
<input id="_____fake_phone_remembered" class="stylish"  tabindex="-1"  type="text" name="phone_autofill"/>
<input id="_____fake_address_remembered" class="stylish"  tabindex="-1"   type="text" name="address_autofill"/>
<input id="_____fake_password_remembered" class="stylish"  tabindex="-1"   type="password" name="password_autofill"/>
<input id="_____fake_password_remembered2" class="stylish"  tabindex="-1"   type="password" name="passwordRepeated_autofill"/>

评论

0赞 agarcian 5/2/2016
这是经过其他尝试后实际上对我有用的东西。我使用的是 Chrome 50。
6赞 mumair 12/17/2015 #25

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

enter image description here

编辑: 如果不起作用,请尝试或 .就我而言,它适用于 chrome 版本 48.0offfalsenofill

7赞 Dr. Gianluigi Zane Zanettini 1/15/2016 #26

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

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

<input type="password" class="hidden" />
<input type="password" />
2赞 Deminetix 2/8/2016 #27

而不是“这对我有用”的答案和其他看起来像完全黑客的答案......这是目前 chrome(和最新规范)处理元素属性的方式:autocompleteinput

https://developers.google.com/web/fundamentals/design-and-ui/input/forms/label-and-name-inputs?hl=en

TLDR:添加您的输入,其中应该是定义字段用途的任何字符串。这与属性的工作方式类似。尽可能使用上面链接中的建议值。autocomplete='<value>'<value>name

此外,从表单中删除自动完成属性

评论

0赞 wsyq1n 2/23/2021
这并不能解决正在讨论的问题。这是关于如何阻止Chrome自动填充。不是“如何正确创建表单”。要么是这样,要么是您的 TLDR 没有完全贯彻您正在解决的问题或结果。
0赞 Antoine 2/10/2016 #28

我的 hack — 在 Chrome 48 中测试:

由于 Chrome 试图通过查看 或 属性之类的内容来找出字段的类型,而且还查看相关内容,因此您只需要为这些内容找到无意义的名称即可。idname<input><label>

对于 和 ,很容易选择此处未列出的其他内容。idname

对于 ,我在中间插入了一个不可见的,例如对于一个城市(它扰乱了我的 Places 自动完成):label<span>

<span>Ci<span style="display:none">*</span>ty</span>

完整工作示例:

<!DOCTYPE html>
<html>
  <body>
    <form method="post" action="/register">
      <div>
        <label for="name">Name</label>
        <input id="name" type="text" name="name" />
      </div>
      <div>
        <label for="email">Email</label>
        <input id="email" type="text" name="email" />
      </div>
      <div>
        <label for="id1">City</label>
        <input id="id1" type="text" name="id1" /> <-- STILL ON :(
      </div>
      <div>
        <label for="id2">Ci<span style="display:none">*</span>ty</label>
        <input id="id2" type="text" name="id2" /> <-- NOW OFF :)
      </div>
    </form>
  </body>
</html>

6赞 Michael. 2/13/2016 #29

不同的解决方案,基于 webkit。如前所述,每当 Chrome 找到密码字段时,它都会自动完成电子邮件。AFAIK,这与自动完成 = [任何]。

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

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

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

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

评论

0赞 epelc 3/6/2016
谢谢!这是在 chrome 49 中唯一有效的东西。以前的方法坏了,因为 chrome 似乎用 now 填充了所有输入。type="password"
0赞 Srini Kancharla 2/13/2016 #30

不幸的是,似乎没有一个解决方案奏效。我能够使用空白电子邮件(用户名)

                    <!-- 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"/>

技术,但密码仍然填充。

-1赞 Zei 2/25/2016 #31

使用 chrome 时,如果您用标签将输入括起来,并在标签中输入街道、地址或两者兼而有之,它将忽略任何禁用自动填充的尝试。

<label for="searchAddress" class="control-label"> Street Address <input type="text" class="form-control" name="searchAddress></label>

Chrome 会检测标签中的关键字,以确定输入类型。它可能也与其他关键字一起这样做。

102赞 dana 2/26/2016 #32

如果要实现搜索框功能,请尝试将属性设置为如下:typesearch

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

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

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

评论

1赞 Andy King 8/31/2018
是的!:)谢谢!这适用于 Chrome 67.0.3396.99。(我认为您的链接应该是:截至 2018 年 9 月的 w3.org/wiki/HTML/Elements/input/search)。
5赞 Venson 10/2/2018
最后!仍然有效 版本 69.0.3497.100(官方版本)(64 位) 这应该是真正的答案!
2赞 demopix 12/18/2018
每个人都是对的和错的,同时你应该在标签中写 autocomplete=“off” <form autocomplete=“off” >而不是输入,这将停止自动填充行为
2赞 John 1/10/2019
如果您在表单上设置了 autocomplete=“off”(以更改默认的表单范围),然后只需要在<输入上设置 type=“search”,也有效>
9赞 Adheep 3/7/2019
在 Chrome 版本 72.XX 之后,此修复程序不起作用。在此处查找最新的修复程序 stackoverflow.com/a/55045439/1161998
22赞 Fareed Alnamrouti 3/16/2016 #33

这太简单又棘手了:)

Google Chrome 基本上会搜索 中每个第一个可见的密码元素,并标记以启用自动重新填充,因此要禁用此功能,您需要添加一个虚拟密码元素,如下所示:<form><body><iframe>

    • 如果您的密码元素位于标签中,您需要在打开标签后立即将虚拟元素作为表单中的第一个元素<form><form>

    • 如果您的密码元素不在标记中,请将虚拟元素作为 HTML 页面中第一个元素,紧跟在打开标记之后<form><body>

  1. 您需要在不使用 css 的情况下隐藏虚拟元素,因此基本上使用以下内容作为虚拟密码元素。display:none

    <input type="password" style="width: 0;height: 0; visibility: hidden;position:absolute;left:0;top:0;"/>
    

评论

1赞 3/18/2016
干得好,你是怎么发现Chrome的算法的?我刚刚发现,在使用 setTimeout 计时器加载页面后,我的旧方法使用 JS 更改值不再有效。但这效果很好!
0赞 eYe 3/31/2016
不幸的是,不适用于常规的 TextBox 输入。
1赞 Fareed Alnamrouti 4/1/2016
实际上,它正在工作,只需将 name 属性设置为;)
0赞 cristiancastrodc 6/2/2017
在 Chrome 58 上,这不起作用。使用 width:1px。如果密码字段完全隐藏,则 Chrome 会正常自动填充密码字段。此外,z-index:-999 可能很有用,因此它不会与任何内容重叠。
1赞 Junior Mayhé 7/20/2018
适用于 Chrome 67.0 的 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">...
1赞 Colin Wiseman 3/29/2016 #34

因此,显然,最好的修复/黑客现在不再起作用了。我使用的 Chrome 版本是 49.0.2623.110 m,我的帐户创建表单现在显示已保存的用户名和密码,与表单无关。谢谢Chrome!其他黑客看起来很可怕,但这个黑客不那么可怕......

为什么我们需要这些黑客工作是因为这些表格通常是帐户创建表格,即而不是应该允许填写密码的登录表格。帐户创建表单,您不希望删除用户名和密码的麻烦。从逻辑上讲,这意味着密码字段永远不会在渲染时填充。因此,我使用文本框和一些 javascript 代替。

<input type="text" id="password" name="password" />

<script>
    setTimeout(function() {
        $("#password").prop("type", "password");
    }, 100); 
    // time out required to make sure it is not set as a password field before Google fills it in. You may need to adjust this timeout depending on your page load times.
</script>

我发现这是可以接受的,因为用户不会在短时间内访问密码字段,如果该字段是密码字段,则回发到服务器没有区别,因为它无论如何都会发回纯文本。

警告: 如果像我一样,你使用与更新表单相同的创建表单,事情可能会变得棘手。我使用 mvc.asp c#,当我使用 @Html.PasswordFor() 时,密码不会添加到输入框中。这是一件好事。我已经围绕这个进行了编码。但是使用 @Html.TextBoxFor() 和密码会被添加到输入框中,然后作为密码隐藏。但是,由于我的密码是经过哈希处理的,因此输入框中的密码是经过哈希处理的密码,不应回发到服务器 - 意外保存经过哈希处理的散列密码对于尝试登录的人来说会很痛苦。基本上。。。如果使用此方法,请记住在呈现输入框之前将密码设置为空字符串。

评论

0赞 Robert 12/2/2018
对我来说效果最好。谢谢你。
-1赞 MikeC 4/8/2016 #35

以为我会发布我的修复程序。发现你不能使用display:none,所以我想出了一个快速而肮脏的解决方案,只是让假输入变小,然后把它移到视线之外。到目前为止一切顺利,直到他们再次打破它。

                    <input id="FakePassword" type="password" style="float:left;position:relative;height:0;width:0;top:-1000px;left:-1000px;" />

90赞 Tauras 4/13/2016 #36

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

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

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

评论

0赞 Tauras 4/26/2016
更新了我的 chrome,它仍然对我有用。50.0.2661.87(64 位)
0赞 sibbl 6/9/2016
不幸的是,在提交表单时(或隐藏/删除输入字段时),Chrome 会要求保存更改后的登录信息。
0赞 Geoffrey Hale 6/15/2016
作品版本: 51.0.2704.79 m
0赞 Joe RR 6/27/2016
天哪,为什么会这样?这是一个错误吗?因为我在这里测试了它,只把它放在一个输入中,并且同时适用于输入登录名和密码,但我只把它放在密码中
4赞 Rob 10/29/2020
目前唯一有效的答案仍然有效。
0赞 typocoder 5/6/2016 #37

如果表单是通过 javascript 生成的,则通过在输入中添加“display: none;”来隐藏它的方法对我不起作用。

因此,我通过将它们放在视线之外来使它们不可见:

<input style="width:0;height:0;opacity:0;position:absolute;left:-10000px;overflow:hidden;" type="text" name="fakeusernameremembered"/>
<input style="width:0;height:0;opacity:0;position:absolute;left:-10000px;overflow:hidden;" type="password" name="fakepasswordremembered"/>
8赞 mccainz 5/31/2016 #38

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

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

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

评论

0赞 Denis 6/29/2016
至于 2016 年 6 月和 Chrome 51.0.2704.106 m,这是这里唯一有效的解决方案
0赞 AlexioVay 7/3/2016
但是,表单会选择您需要的正确(可见)输入字段吗?因为它是同一个名字。
0赞 mccainz 9/14/2016
@Vaia,将 disabled 属性添加到重复元素将阻止其提交。
4赞 CodeSimian 7/16/2016 #39

添加到密码字段的最新解决方案非常适合防止 Chrome 自动填充密码字段。autocomplete="new-password"

但是,正如 sibbl 指出的那样,这并不妨碍 Chrome 在表单提交完成后要求您保存密码。从 Chrome 51.0.2704.106 开始,我发现您可以通过添加一个不可见的虚拟密码字段来实现此目的,该字段也具有属性。请注意,“display:none”在这种情况下不起作用。例如,在真实密码字段之前添加如下内容:autocomplete="new-password"

<input type="password" autocomplete="new-password" 
style="visibility:hidden;height:0;width:1px;position:absolute;left:0;top:0">`

这仅在我将宽度设置为非零值时对我有用。感谢 tibalt 和 fareed namrouti 的原始答案。

评论

0赞 danjarvis 10/19/2016
这个解决方案之所以有效,是因为它做了两件事:1.防止Chrome在真实密码字段下显示“使用密码”,以及2。阻止 Chrome 询问您是否要保存更新的密码(因为标记为“new-password”的隐藏密码字段没有值)
14赞 Avindu Hewa 8/18/2016 #40
<input readonly onfocus="this.removeAttribute('readonly');" type="text">

将 readonly 属性添加到标记以及删除 onfocus 事件可解决此问题

56赞 Kuf 9/3/2016 #41

对我来说,很简单

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

做到了。

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

评论

0赞 Kuf 3/1/2017
添加@ArnoldRoa版本,从我发布它的那天起,它就一直在我们的网站上,并且很少有版本可以正常工作。您使用的是哪个版本?PC/Mac?
1赞 Kuf 3/22/2017
@Dummy我现在在 chrome latest (57) 上测试了它,它仍然对我有用。你对输入字段做了什么特别的事情吗?cap 你把你的代码放在我可以尝试重现的地方?
3赞 billy jean 3/22/2018
版本 64.0.3282.186(官方版本)(64 位)Windows。2018-03-01 禁用自动填充不起作用。
2赞 Olex Ponomarenko 2/2/2019
可以肯定的是,这消除了辅助技术的形式/输入 w3c.github.io/using-aria/#ariapresentation
1赞 Oleg Abrazhaev 4/15/2021
这是目前 Mac 上 chrome 88 中唯一有效的功能。
1赞 michalzuber 9/6/2016 #42

在 Chromium 53.0.2785.92(64 位)上,以下工作有效

<div style="visibility:hidden">
    <input type="text" name="fake_username_remembered">
    <input type="password" name="fake_password_remembered">
</div>

display:none不起作用

3赞 Isaac Limón 10/14/2016 #43

尝试在值中留一个空格:

<input type="email" name="email" value="&nbsp;">
<input type="password" name="password" value="&nbsp;">

铬 54.0.2840.59

评论

0赞 ivan_pozdeev 8/5/2018
这会将该不间断空格插入到输入中。
33赞 Hitesh Kalwani 10/21/2016 #44

您必须添加以下属性:

autocomplete="new-password"

来源链接 : 全文

评论

0赞 AlexioVay 10/24/2016
你有什么来源可以解决这个问题吗?
0赞 Robin Andrews 1/17/2017
有效,但不是语义的,因为可以在用户名和其他字段上使用。
2赞 Justinas 11/27/2017
文档页面:developer.mozilla.org/en-US/docs/Web/Security/...
0赞 yurenchen 8/29/2022
2022 年,Android Chrome 104。还是不遵守规则
0赞 MiVvlt 12/5/2016 #45

由于显示无似乎不再起作用 添加

<input type="text" name="fakeusernameremembered"/>
<input type="password" name="fakepasswordremembered"/>

在隐藏了溢出的 div 中,max-width 和 max-height 0px

所以它变成这样:

<div style="overflow: hidden; max-width: 0px; max-height: 0px;">
    <input type="text" name="fakeusernameremembered"/>
    <input type="password" name="fakepasswordremembered"/>
</div>

评论

1赞 Arnold Roa 2/28/2017
这是行不通的,输入,假的和新的都是黄色的自动完成的:(
0赞 MiVvlt 3/1/2017
不过仍然对我有用,你能提供更多关于你在做什么的细节吗?另外:您是否将带有隐藏输入的 div 放在可见输入之前?
-2赞 hass. 1/13/2017 #46

上次我检查 Google 在 2017 年 1 月更新了他们的自动填充时,对我有用的解决方案是添加另一个输入并在填充后将其隐藏。

 <input type="text" id="phone_number" name="phone_number" value="">
 <input type="text" id="dummy_autocomplete">


<script type="text/javascript">
        $('#dummy_autocomplete').hide();
</script>
0赞 kofifus 1/20/2017 #47

1 月 20 日 chrome 更新

上述解决方案(包括添加虚假字段或设置 autocomplete=new-password)均无效。是的,使用这些 chrome 不会自动完成,但当您输入密码字段时,它会再次建议密码。

我发现,如果您删除密码字段,然后在没有 id 的情况下再次添加它,那么 chrome 不会自动填充它,也不会在输入时建议密码。

使用类获取 get 密码值而不是 id。

对于 firefox,仍然需要添加一个虚拟元素。

此解决方案还允许允许/禁止基于标志的自动完成:

html格式:

<!-- form is initially hidden, password field has a dummy id and a class 'id' -->
<form id="loginForm" style="display:none;">
   <span>email:</span><input type="text" placeholder="Email" id="loginEmailInputID"/>
   <span>Password:</span><input class="loginPasswordInput" type="password" placeholder="Password" id="justForAutocomplete"/>
</form>

页面加载:

function hideAutoComplete(formId) {
    let passwordElem=$('#'+formId+' input:password'), prev=passwordElem.prev();
    passwordElem.remove();
    prev.after($('<input type="password" style="display:none">'), passwordElem.clone().val('').removeAttr('id'));
}

if (!allowAutoComplete) hideAutoComplete('loginForm');
$('#loginForm').show();

当您需要密码时:

$('.loginPasswordInput').val();
0赞 tutak 2/12/2017 #48

如果您使用的是 Symfony 表单,如果从 twig 模板应用该属性而不是使用 .autocomplete=offFormBuilder

使用这个:

....
->add('field-name', TextType::class, array(
  'attr' => array(
      'autocomplete' => 'off'
  )
)
....

而不是:

....
{{ form_widget(form.field-name, {'attr': {'autocomplete':'off'}})
....
-1赞 Fstarocka Burns 4/7/2017 #49

我最终通过在输入字段中放置一个非重复变量来解决这个问题 - 我像这样使用了 php time():

<input type="text" name="town['.time().']" >

这主要干扰了 n android。我在服务器端所做的就是对输入名称进行 foreach 循环 - 问题是如果 chrome 识别名称属性,它将自动填充。

没有其他任何东西对我有用。

评论

0赞 ivan_pozdeev 8/5/2018
为每个收到的请求检查 DOM 超过 10 亿次?暂无评论。
0赞 ChrisDeDavidMindflowAU 11/30/2018
实际上这适用于 PHP: ''' <input type=“text” name=“whatever” autocomplete=“off_<?php echo time() ?>”> ''' 这在 2018 年 11 月 30 日禁用了 Chrome 上的自动填充
0赞 J0ANMM 7/5/2017 #50

这些问题的其他解决方案都不适合我。

唯一有效的想法是这个

它从元素中删除“name”和“id”属性并分配它们 1 毫秒后返回。把它放在文件中,准备好。

$(document).ready(function() {
    $('form[autocomplete="off"] input, input[autocomplete="off"]').each(function () {

                var input = this;
                var name = $(input).attr('name');
                var id = $(input).attr('id');

                $(input).removeAttr('name');
                $(input).removeAttr('id');

                setTimeout(function () {
                    $(input).attr('name', name);
                    $(input).attr('id', id);
                }, 1);
            });
});
1赞 Jeffrey Holmes 9/8/2017 #51

Boom、Google Chrome 和其他任何人都试图击败它。

我能够在 2017 年 9 月 7 日今天实现它,但使用在我的 MVC 视图中生成的随机字符串的 FormCollection。

我首先会在登录页面的索引控制器中获取一个新的随机密钥,加密并创建一个新的完全唯一的随机字符串(我实际上使用了一个 256 位密码来执行此操作,以及一个唯一的密码和身份验证密钥),然后我在每个字符串的末尾附加纯文本“用户名”和“密码”,以帮助我从回复视图控制器中识别用户名和密码。您也可以将该普通字符串更改为任何内容,只要您知道该模式并且它是唯一的。

在我看来,我随后适当地使用了这些变量,然后在响应控制器中搜索了 FormCollection 并找到了匹配的变量,然后使用该项目的键值作为相应的用户名和密码进行适当处理。

我遇到的另一个我认为是 Chrome 偷偷摸摸的问题,是任何

有什么想法吗?

<style>
    @@font-face {
      font-family: 'password';
      font-style: normal;
      font-weight: 400;
      src: url(https://jsbin-user-assets.s3.amazonaws.com/rafaelcastrocouto/password.ttf);
    }
</style>

<input type="text" name="@Model.UsernameRandomNameString" />
<input style="font-family: 'password'" type="text" name="@Model.PasswordRandomNameString" />

LogOnModel model = new LogOnModel()
            {
                UsernameRandomNameString = Cryptography.SimpleEncrypt("Username", UniqueGeneratorKey, UniqueGeneratorKey) + "Username",
                PasswordRandomNameString = Cryptography.SimpleEncrypt("Password", UniqueGeneratorKey, UniqueGeneratorKey) + "Password",
            };

我认为这是一个地狱般的解决方法,但是嘿,它有效,我认为它也可能是未来的证明,除非谷歌确定页面的 URL 中有关键字,然后适当地在任何输入字段的顶部添加其愚蠢的扩展 - 但这有点激烈。

1赞 Rikku121 9/14/2017 #52

如果不起作用,这也是可能的,并且似乎正在工作(Chrome v60.0.3112.113):display: none

.hidden-fields {
    opacity: 0;
    float: left;
    height: 0px;
    width: 0px;
}

<input type="text" name="username" class="hidden-fields"> 
<input type="password" name="password" class="hidden-fields">

<your actual login fields></your actual login fields>

评论

1赞 Palaniichuk Dmytro 1/18/2018
就我而言,我只需要经过测试的 Chrome v63 <input type=“password” name=“password” class=“hidden-fields”>
0赞 alehro 9/25/2017 #53

Jobin Jose 的回答给了我一个开始。这是对我有用的东西:

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

请确保不要有 autocomplete=“off”,这会破坏解决方案。

评论

0赞 PellucidWombat 1/14/2018
自 2018 年 1 月 13 日起,这适用于我 版本 63.0.3239.132(官方版本)(64 位)
0赞 coder9 10/2/2017 #54

没有一个解决方案对我有用。最后,在拔掉我的头发好几个小时后,我想出了这个 ReactJS 的解决方案。

在 FireFox 54.0.1、Chrome 61.0.3163.100、Mac OS 10.13 上进行测试

我保留并将其更改为事件中的相关类型。type="text"onChange

前任: HTML格式:

<input type="text" onChange={this.setAttributes} placeholder="Email" />

JS:

setAttr2: function(e){
    var value = e.target.value;
    if(value.length){
      e.target.setAttribute('type', 'email')
    } else {
      e.target.setAttribute('type', 'text')
    }
  }
7赞 MagicSux 10/22/2017 #55

好吧,既然我们都有这个问题,我花了一些时间为这个问题编写了一个有效的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 与测试

1赞 w3jimmy 11/30/2017 #56

纯 HTML 解决方案

(无需javascript,无需css,也无需隐藏输入)

<form autoComplete="new-password" ... >
        <input name="myInput" type="text" autoComplete="off" id="myInput" placeholder="Search field" />
</form>

笔记:

  • form 不一定需要是 input 元素的直接父元素
  • 输入需要 name 属性

评论

0赞 5/31/2018
这是行不通的。我正在尝试使用 Chrome 67。无。我仍然需要一个假输入!非常疯狂!display: none
0赞 Alex Stephens 6/29/2021
就像将您的输入放入表单中一样简单。
0赞 frin 12/20/2017 #57

我的问题是 Chrome 会通过 Bootstrap 自动完成界面自动填充邮政编码,因为我会自动建议数据库中的可能值。

我必须做的事情:

  • 将输入字段的属性更改为“邮政编码”以外的其他属性id
  • 将输入字段的值更改为autocompletefalse
  • 调用后,我不得不重置自动完成属性,因为 Boostrap 的自动完成插件将其更改为自动。$('#postcode_field').autocomplete(...)$('#postcode_field').prop('autocomplete', 'false');off
0赞 Gyürüs Máté 12/25/2017 #58

我已经尝试了所有提到的建议,但没有一个奏效。我在指定的输入上使用谷歌位置自动完成,如果谷歌位置自动完成列表上方有一个谷歌浏览器自动填充,那就太难看了。即使设置 autocomplete=“anything” 也没用,因为自动完成插件本身将此 attr 设置为“off”,并且 chrome 完全忽略了它。

所以我的解决方案是:

var fixAutocomplete = window.setInterval(function(){
    if ($('#myinput').attr('autocomplete') === 'false') {
        window.clearInterval(fixAutocomplete);  
    }

    $('#myinput').attr('autocomplete', 'false');
}, 500);
20赞 Stiffels 1/17/2018 #59

使用 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;
}

评论

0赞 scipper 2/1/2018
到目前为止,我发现的最好的方法!好吧,至少对于 Chrome 64 :/
0赞 Doug McLean 11/21/2018
就我而言,这是完美的,谢谢!Chrome 不会自动填充或自动完成它,也不会提供保存它,而且它不仅从视图中模糊不清,而且从剪贴板中也被遮挡了 - 我复制了我输入的内容并将其粘贴到记事本中,然后得到了“•••••明!
0赞 ddruganov 10/8/2020
截至 2020 年 10 月,“text-security”不是有效的 CSS 属性
17赞 Denis Brezhitskiy 3/1/2018 #60

在某些情况下,即使自动完成属性设置为关闭,浏览器也会继续建议自动完成值。对于开发人员来说,这种意外行为可能非常令人费解。真正强制无自动完成的诀窍是为属性分配一个随机字符串,例如:

autocomplete="nope"

评论

0赞 Regular Jo 3/10/2018
回复:“意外行为”这种行为是由谷歌推动的,谷歌认为它比开发人员更了解每个页面应该如何工作。有时我只想要一个原始密码输入,零装饰。
4赞 billy jean 3/22/2018
这个组合终于对我有用了:role=“presentation” autocomplete=“nope” 在 Chrome 版本 64.0.3282.186(官方版本)(64 位)上进行了测试。真是一场噩梦!
2赞 ChronoFish 7/12/2018
随机字符串适用于 chrome,但不适用于 firefox。为了完整起见,我同时使用了“autocomplete='off-no-complete'”,并使用 onfocus=“this.readOnly=false” 设置了 readonly 属性。我的应用程序是一个企业应用程序,用户使用它来输入数千个地址,因此控制它的用例是真实的 - 我还可以保证使用 Javascript,所以至少我已经做到了这一点
0赞 Iwan Ross 3/21/2018 #61

我所做的是将输入 type=“text” 更改为多行输入,即。

 overflow-x:hidden;
 overflow-y:hidden;
 vertical-align:middle;
 resize: none;

代码的快速解释:隐藏的 overflow-x 和 -y 将禁用 textarea 框右侧的滚动按钮。垂直藻胶会将标签垂直中间与文本区域和调整大小对齐:none 将禁用文本区域右下角的调整大小抓取器。

从本质上讲,这意味着您的文本区域将看起来像一个文本框,但关闭了镶边自动填充功能。

评论

1赞 L. Guthardt 3/21/2018
虽然这个代码片段可能是解决方案,但包括一个解释确实有助于提高你的帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。
0赞 SantiBailors 4/6/2018
第 2 行的第一个冒号可能是错别字。
0赞 Johannes 4/9/2018
我同意 L. Guthardt 的观点。请提供一个完整的示例来展示您的解决方案,最好是在 jsfiddle、jsbin、codepen 或类似的演示网站上。
1赞 Karan Vyas 4/23/2018 #62

对于 Angular 用户:

由于新的 chrome 版本忽略了这一点,chrome 开发人员建议 autocomplete= 'false |random-string',因此 google chrome/modern browsers 有 2 种类型的用户助手 -autocomplete = 'off'

  1. autocomplete='off'(这会阻止上次缓存的建议)。
  2. autocomplete = 'false | random-string'(这阻止了自动填充设置,因为浏览器不知道“随机字符串”)。

那么,如果禁用这两个烦人的建议怎么办? 这是诀窍:-

  1. 添加每个输入字段。 (或简单的 Jquery)。autocomplete = 'off'

示例$("input").attr('autocomplete', 'off');

  1. 从 HTML 代码中删除标记并添加到容器中。 添加还将保留您的所有验证。<form name='form-name'>ng-form = 'form-name'<div>ng-form="form-name"
3赞 lufc 5/2/2018 #63

我的解决方法,因为以上方法似乎都不适用于 Chrome 63 及更高版本

我在我的网站上修复了这个问题,将有问题的输入元素替换为

<p class="input" contenteditable="true">&nbsp;</p>

并在提交之前使用 jQuery 填充隐藏字段。

但这是一个真正可怕的黑客攻击,因为 Chromium 的一个错误决定是必要的。

-7赞 Edvard Åkerberg 5/3/2018 #64

这是我使用过的最新解决方案。

$('#email').prop('autocomplete', true);
1赞 EngineerCoder 5/9/2018 #65

自动完成功能已通过此技巧成功禁用。它有效!

[HTML格式]

<div id="login_screen" style="min-height: 45px;">
   <input id="password_1" type="text" name="password">
</div>

[J奎里]

$("#login_screen").on('keyup keydown mousedown', '#password_1', function (e) {
    let elem = $(this);

    if (elem.val().length > 0 && elem.attr("type") === "text") {
        elem.attr("type", "password");
    } else {
        setTimeout(function () {
            if (elem.val().length === 0) {
                elem.attr("type", "text");
                elem.hide();
                setTimeout(function () {
                    elem.show().focus();
                }, 1);
            }
        }, 1);
    }

    if (elem.val() === "" && e.type === "mousedown") {
        elem.hide();
        setTimeout(function () {
            elem.show().focus();
        }, 1);
    }

});
2赞 SaidbakR 5/21/2018 #66

我的解决方案取决于三件事:

  1. KeyDown 事件
  2. 屏蔽字段名称
  3. 提交时清空字段值

首先,我们需要防止用户名和密码的自动完成,因此,最初我们将设置两个标志,i -> username 和 j -> passowrd 具有 true 值,因此无需对字段进行任何键键,i 和 j 都将为 true。

在服务器端发生字段掩码的情况下,通过传递随机字符串,也可以使用客户端轻松进行。

代码如下:

$(document).ready(function(){
   i= true; //username flag
   j= true; // password flag
   $("#username{{$rand}}").keydown(function(e){
          // {{$rand}} is server side value passed in blade view
          // keyboard buttons are clicked in the field
            i = false;       
    });
   $("#passowrd{{$rand}}").keydown(function(e){
          // {{$rand}} is server side value passed in blade view
          // keyboard buttons are clicked in the field
            j = false;       
    });
    // Now we will use change event,
   $("#username{{$rand}}").change(function(){
    if($(this).val() != ''){ //the field has value
        if(i){ // there is no keyboard buttons clicked over it
            $(this).val(''); // blank the field value
        }

    }
})
$("#password{{$rand}}").change(function(){
    if($(this).val() != ''){ // the same as username but using flag j
        if(j){
            $(this).val('');
        }

    }
})

   $("#sForm").submit(function(e){ // the id of my form
      $("#password-s").val($("#password{{$rand}}").val());
        $("#username-s").val($("#username{{$rand}}").val());
        // Here the server will deal with fields names `password` and `username` of the hidden fields
       $("#username{{$rand}}").val('');
        $("#password{{$rand}}").val(''); 

 })
})

以下是 HTML:

<form class="form-horizontal" autocomplete="off" role="form" id="sForm" method="POST" action="https://example.com/login">

                        <input type="hidden" name="password" id="password-s">
                        <input type="hidden" name="username" id="username-s">

                            <label for="usernameTDU3m4d3I5" class="col-md-3 control-label" style="white-space: nowrap">Username</label>

                                <input id="usernameTDU3m4d3I5" placeholder="Username" autocomplete="off" style="border-bottom-left-radius: 10px; border-top-right-radius: 10px; font-family: fixed; font-size: x-large;" type="text" class="form-control" name="usernameTDU3m4d3I5" value="" required="required" autofocus="">                                

                            <label for="passwordTDU3m4d3I5" class="col-md-3 control-label" style="white-space: nowrap">Password</label>
                                <input id="passwordTDU3m4d3I5" placeholder="Password" autocomplete="off" type="password" class="form-control" name="pa-TDU3m4d3I5" required="">


                                <button type="submit" class="btn btn-success">
                                    <i class="fox-login" style="text-shadow: 0px 1px 0px #000"></i><strong>Login</strong>&nbsp;&nbsp;
                                </button>

                                </form>

事实上,上述解决方案不会消除或阻止用户名和密码的自动完成,但它会使自动完成变得毫无用处。即在不点击字段上的键盘按钮的情况下,字段值在提交前将为空,因此将要求用户输入它们。

更新

我们还可以使用单击事件来防止自动完成出现在字段下的用户列表,如下所示:

 $("#username{{$rand}}").click(function(){

            $(this).val('');
            i = true;

})
$("#password{{$rand}}").click(function(){

            $(this).val('');
            j = true;

})

局限性:

此解决方案可能无法在触摸屏设备中按预期工作。

最终更新

我已经完成了以下干净的实现,如下所示:

preventAutoComplete = true; // modifier to allow or disallow autocomplete
trackInputs = {password:"0", username:"0"}; //Password and username fields ids as object's property, and "0" as its their values
// Prevent autocomplete
    if(preventAutoComplete){
        $("input").change(function(e){ // Change event is fired as autocomplete occurred at the input field 
            trackId = $(this).attr('id'); //get the input field id to access the trackInputs object            
            if (trackInputs[trackId] == '0' || trackInputs[trackId] != $(this).val()){ //trackInputs property value not changed or the prperty value ever it it is not equals the input field value
                $(this).val(''); // empty the field
            }
        });
        $("input").keyup(function(e){
            trackId = $(this).attr('id');
            trackInputs[trackId] = $(this).val(); //Update trackInputs property with the value of the field with each keyup.
        });
    } 
6赞 eug 5/21/2018 #67

我终于在使用 .对于密码字段,有一个事件处理程序,用于替换键入的每个字符“•”。textarea

10赞 norekhov 5/31/2018 #68

2016 年,谷歌浏览器开始忽略它,尽管它在 W3C 中。他们发布的答案autocomplete=off

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

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

他们打开了另一个错误,以在需要 autocomplete=off 时发布有效的用例

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

如果屏幕上有任何密码字段,甚至是隐藏的密码字段,则自动填充。 要打破这种逻辑,你可以把每个密码字段放到它自己的形式中,如果它不破坏你自己的页面逻辑。

<input type=name >

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

评论

5赞 Douwe de Haan 6/21/2018
由于您的答案是最新的答案,您能否补充一下,添加或其他一些胡言乱语似乎也可以解决问题?至少,在我这边做到了!autocomplete="pineapple"
1赞 digout 1/7/2019
@DouwedeHaan在保存表单之前这很好,那么自动完成将为保存的“菠萝”字段提供建议。但是,例如,也许使用随机哈希值作为自动完成值可以解决这个问题?
0赞 Douwe de Haan 1/7/2019
@digout我同意。一个很好的例子是将 UUID 用于此类事情。只要确保字符串是唯一的!
0赞 Nuno Ribeiro 7/8/2022
用 autocomplete=“pineapple” 解决我的问题啊哈!!我一生中最愚蠢的解决方法:D谢谢很多!:D