禁用Chrome自动填充


620

我一直在遇到几种形式的Chrome自动填充行为问题。

表单中的所有字段都有非常通用且准确的名称,例如“电子邮件”,“名称”或“密码”,并且它们也已autocomplete="off"设置。

自动完成标志已成功禁用了自动完成行为,该行为会在您开始键入时出现一个下拉列表,但未更改Chrome自动将字段填充为的值。

除了chrome不能正确填充输入(例如用电子邮件地址填充电话输入)之外,这种行为是可以的。客户对此有所抱怨,因此已证实它是在多种情况下发生的,而不是我在计算机上本地完成的操作的某种结果。

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


6
这不是重复的。这是一个禁用自动填充功能,而一个是设置自动填充颜色的样式...
Nicu Surdu

17
按照Kaszoni Ferencz的回答,使用autocomplete =“ false”代替autocomplete =“ off”,为它投票。
roughcoder

7
查看这个问题的答案数量-它应该告诉您一些信息:您正在与一场失败的战斗搏斗。这不再是Chrome的问题,Firefox和其他公司也纷纷效仿。不管喜欢与否,您需要接受浏览器行业的决定,即表单自动完成是用户的选择-您可以与之抗争,但会失败。归根结底,您应该问的问题不是,我该如何颠覆自动完成功能,而是如何创建与自动完成功能配合良好的表单。您对安全性的担心不是您要担心的,而是用户。
mindplay.dk

21
抱歉,@ mindplay.dk的回复适得其反。我的情况是,我有一些用户登录了我的网站,并且该网站上的页面供他们输入其他系统的帐户/密码信息。当我为他们设置一个对话框以输入一个新的对话框时,他们在我网站上的登录信息就会被填写,这是完全错误的,如果/如果用户不慎输入了该信息,将会导致问题。二者无关。彼此。在这种情况下,浏览器正在做与用户想要的相反的事情。
Mike K

8
@ mindplay.dk-我的Web应用程序是用于工作场所的工作流管理应用程序,因此,不,最高管理层要求我担心安全性,并且所有员工(也就是“用户”)都必须遵守。 ” 但是,要求他们设置Chrome,IE或任何其他浏览器本身将在身份验证过程中留下空白,因为他们可以有意或无意地使用自动填充功能。答:并非所有Web应用程序都是相同类型的,具有相同类型的用户或关注点。
PoloHoleSet

Answers:


904

对于新的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中修复其自动填充信息可能是他们采取的必要措施。


115
“ new-password”在尝试了“ off”和“ false”后为我工作
Kevin Kevin

26
这是目前唯一的解决方法。错误,关闭,不再起作用。现在应该是正确的答案。
大卫

5
之所以可行,是因为Chrome小组正在尝试创建建议的自动填充值,如@ developers.google.com/ web/fundamentals/design-and-ui/input/…所示 。“新密码”值是很少有围绕它的附加逻辑,在这种情况下,它暂停自动填充,但仍允许自动填充建议
Deminetix 2016年

30
从1.13.2018版本63.0.3239.132(正式版本)(64位)开始
不起作用-PellucidWombat

36
我只是想说..在绊倒这个问题之后.. Chrome是一项真正的工作。因此,现在我们必须跳过障碍,以禁用应该保留为可选功能的功能。在哪种情况下,地址每次都是新的/不同的业务应用程序都需要自动填充地址。谷歌变得和微软一样糟糕。
埃迪·霍华德

700

我刚刚发现,如果您记得某个网站的用户名和密码,则当前版本的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刚添加的一个可能值得进一步调查:

如我所知,autocomplete="off"如果中的元素少于3个,则可在Chrome 80上使用<form>。我不知道逻辑是什么,或有关它的相关文档在哪里。

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

非常感谢您的窍门,但请更新答案,因为display:none;它不再起作用,但position: fixed;top:-100px;left:-100px; width:5px;:)

更新2020年4月

此属性的chrome特殊值正在执行此工作:(已在输入中测试-但不是由我测试) autocomplete="chrome-off"


7
我非常确定这可以正常工作,因为您可以完美地解释我在密码字段之前输入时遇到的启发式自动填充。不幸的是,它对我不起作用,我在表单和所有输入上都输入了autocomplete =“ off”,它们仍然被填充。唯一对我有用的解决方案是在上面的goodeye链接中。(在密码取消chrome的启发式检查之前,放置第二个隐藏的type =“ password”输入)
议会

19
过去这个方法工作正常,我也曾经使用过,但是由于Chrome在一段时间之前(从那时到5月5日)进行了升级,因此Chrome会忽略form属性:(
Tominator

13
Google在(Chrome v34)中做出了决定,使其始终执行政策,现在忽略了autocomplete =“ off”,包括表单级指令...如果实际上正确地处理了该死的字段,那会很好。
Jammer 2014年

10
尝试autocomplete =“ false”而不是autocomplete =“ off”
粗糙编码器

241
此属性也是必需的:autocomplete="I told you I wanted this off, Google. But you would not listen."
rybo111

265

经过数月的努力,我发现解决方案比您想象的简单得多:

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

就这么简单,它在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
为我工作!但是有一个重要的说明:我的网页中有5个字段:姓名,地址,邮政编码,电话和电子邮件。当我在表单和“名称”字段中包含autocomplete ='false'时,它仍然有效。但是,当我还在地址字段中包含autocomplete ='false'时,它最终停止了自动填充它们!因此,您需要将autocomplete属性不放在登录名或名称字段上,而是放在以下字段上!(从2015
Dvd Franco

45
如果这对您不起作用:请记住,Chrome有两种“帮助”用户的方式。AUTOCOMPLETE将根据以前提交的相同表单提示进行提示,并且会影响多次使用该表单的人。通过autocomplete =“ off”禁用自动完成功能。AUTOFILL将根据通讯录中以前填写的其他页面上类似表格的提示进行提示。它还将突出显示正在更改的字段。可以使用autocomplete =“ false”禁用自动填充。
genkilabs

4
这对我不起作用(版本43.0.2357.124 m)。这可能是Google的疏忽,现已解决。他们似乎在想“用户永远是对的”,因为他们想自动填充所有内容。问题是,我的注册表单像登录表单一样保存用户数据,这绝对不是用户想要的……
rybo111 2015年

3
是的,它可以在Chrome 43.0.2357中使用!Chrome中的这种行为非常令人讨厌,而这种解决方法使我花了一段时间才弄清楚。感谢您的回答。
阿德里亚诺·罗莎

3
不适用于Chrome 44.0.2403.157。此功能如何起作用,而不同版本不起作用。这太荒谬了
Mattijs

120

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

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

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

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/

// UpdateEnd

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

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

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

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


12
多么好的解决方案:)您应该用以下代码替换jquery:this.removeAttribute(“ class”)
Roey

我用它来阻止dropdwonlist自动填充。但是还重新设置了只读样式,因此它看起来没有。好主意!
ComfortableNumb

1
@Clint:上面的代码片段在用户输入字段后(通过单击鼠标或Tab键)立即删除了只读属性。我想,您指的是一个字段,该字段是自动填充保护的,但用户未触摸过。该领域的目的是什么-它真的需要受到保护吗?根据情况,可以选择删除提交时的所有只读属性。您可以针对您的问题添加更具体的评论吗?也许我可以为您提供帮助 :)
dess 2015年

1
如果您使用的是JavaScript。为什么不只是将值设置为dummy,然后再次删除该值?添加和删​​除只读声音听起来很危险-如果浏览器不希望您专注于该怎么办?
rybo111

1
显然Google在这里为我们所有人做出决定,他们关闭了有关autocomplete =“ off”的通知单bugs.chromium.org/p/chromium/issues/detail?id = 468153。但是,还有另一张用于收集禁用自动填充的有效用户案例的票证,请在此处答复此票证以提高对此问题的认识:bugs.chromium.org/p/chromium/issues/detail?id=587466
Norman Xu

81

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

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

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

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


是! :) 谢谢!这适用于Chrome 67.0.3396.99。(我认为您的链接应该是:截至 2018年9月的w3.org/wiki/HTML/Elements/input/search)。
安迪·金

4
最后!仍然可以使用69.0.3497.100版(正式版本)(64位)。这应该是真正的答案!
Venson

1
每个人都是对与错,同时您应该在输入时在标签<form autocomplete =“ off”>内写入autocomplete =“ off”,这将停止自动填充行为
demopix

2
如果您在表单上设置autocomplete =“ off”(以更改默认的整个表单范围),然后只需要在<input>上设置type =“ search”,则该方法也适用
约翰

9
Chrome版本72.XX之后,此修复程序不起作用。在这里找到最新的
修复程序

65

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

我还注意到问题刚好超出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
这个为我工作(目前)。我发现随着时间的流逝,我使用了大约六种不同的骇客,不久之后Chrome决定要击败该骇客。因此需要一个新的,例如这个。在我的应用程序中,我有一个配置文件更新表单,其中包含电子邮件和密码字段,除非用户想要进行更改,否则将保留为空白。但是当Chrome自动填充时,会将用户ID放在“电子邮件确认”字段中,从而导致各种错误情况,导致进一步的错误情况,因为用户会误解要做正确的事情。
杰弗里·西蒙

2
关于此黑客为何起作用的简要说明(目前):Chrome浏览器会看到第一个type = password输入并自动填充,并假定此字段之前的字段必须为userhame字段,并使用用户名自动填充该字段。@JeffreySimon,这应该可以解释电子邮件确认字段中的userid现象(我在表单上看到的是同一件事)。
MrBoJangles 2014年

1
@kentcdodds-不确定您不再工作的意思。您的jsbin没有密码字段,因此情况有所不同。我使用该解决方案已有多年了,最近我注意到它是必需的,并且上周(2015年3月)它对我有用。
mike nelson

1
万岁!似乎可行的解决方案!我建议给该字段起一个名称password,并actual_password为合法字段指定名称,因为Google现在似乎正在使用name。但是,这意味着Chrome不会再保存密码,而这正是我真正想要的功能。AAAAARRRRGHH!
rybo111

2
更新:自上次实施以来,此方法在一年多的时间内一直有效。我们可能在这里有一个坚实的赢家。
MrBoJangles 2015年

48

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

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

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


更新了我的Chrome,仍然对我有用。50.0.2661.87(64位)
Tauras '16

不幸的是,在提交表单时(或在隐藏/删除输入字段时),Chrome会要求保存更改后的登录名。
sibbl

版本51.0.2704.79 m的作品
Geoffrey Hale

神圣的f ***为什么行得通?那是个错误吗?因为我在这里进行了测试并将其仅放置在一个输入中,并且可以同时用于输入登录名和密码,但是我仅将其放在了密码中
Leandro RR

我不知道。我认为这是由开发人员制作的镀铬“物件”。也许我误会了。
Tauras

46

对我来说,简单

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

做到了。

经过多个版本测试,最后一次尝试是56.0.2924.87


添加了@ArnoldRoa版本,自从我发布它的那一天起,它就一直在我们的网站上,并且很少有版本可以正常工作。您正在使用哪个版本?PC / Mac?
库夫

无法在57.0.2987.110上运行。Chrome浏览器将其突出显示为黄色,并用我保存的密码预先填写该字段。但是该页面是用户管理页面,而不是登录页面。

1
@Dummy我现在在chrome上最新测试了它(57),它仍然对我有用。您对输入字段做了什么特别的事情吗?上限,您将代码放在可以重现的地方?
库夫

3
版本64.0.3282.186(官方内部版本)(64位)Windows。2018-03-01不适用于禁用自动填充。
比利·简

2
相当确定这会从辅助技术中删除表格/输入w3c.github.io/using-aria/#ariapresentation
Olex Ponomarenko


19

它是如此简单和棘手:)

谷歌浏览器基本上搜索,和标签内的每个第一个可见密码元素<form>,以对其进行自动填充,因此要禁用此功能,您需要添加一个虚拟密码元素,如下所示:<body><iframe>

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

    • 如果您的密码元素不在<form>标签内,则在<body>打开标签后立即将虚拟元素作为html页面中的第一个元素

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

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

1
出色的工作,您如何找到Chrome的算法?我刚刚发现,用setTimeout计时器加载页面后,用JS更改值的旧方法不再起作用。但这很完美!

不幸的是,不适用于常规TextBox输入。

1
实际上,它只是在设置name属性
才起作用

在Chrome 58上,此功能无效。使用宽度:1px。如果密码字段完全隐藏,则Chrome会正常自动填充。另外z-index:-999可能很有用,因此它不会与任何内容重叠。
cristiancastrodc

1
可在有角html组件的Chrome 67.0上使用<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">...
JuniorMayhé18年

19

这是我建议的解决方案,因为Google坚持要覆盖人们似乎做出的所有解决方法。

选项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-将电子邮件值设置为空格,然后将其删除

假设您有两个输入,例如email和password,请将email字段的值设置为" "(空格)并添加attribute / value 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-您是否尝试过导航到另一个页面,然后按返回按钮?我得到的结果好坏参半-可能需要调整。
rybo111 2015年

如果您那样说,我还没有尝试过选项1。另外,我只需要在不会用“后退”按钮调用的ajax加载模式上禁用自动填充。但是,如果还有其他结果,我会告诉您。@ rybo111
AlexioVay 2015年

@Vaia我的意思是选项2-如果遇到任何问题,请在这里回复。谢谢。
rybo111

15

使用css text-security:光盘而不使用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:/
scipper

对我来说,这很完美,谢谢!Chrome不会自动填充或自动完成它,不提供保存功能,不仅从视图中而且从剪贴板中都将其遮盖住了-我复制了键入的内容并将其粘贴到记事本中,才得到“••• ••••••••”。辉煌!
Doug McLean

15

在某些情况下,即使将autocomplete属性设置为off,浏览器也会继续建议自动补全值。对于开发人员而言,这种意外行为可能会令人困惑。真正强制不自动补全的技巧是为属性分配一个随机字符串,例如:

autocomplete="nope"

RE:“意外行为”由Google推动,他认为它比开发人员更了解每个页面的工作方式。有时我只想要原始密码输入,零装饰。

3
这种组合最终对我有用:role =“ presentation” autocomplete =“ nope”在Chrome版本64.0.3282.186(正式版本)(64位)上进行了测试。什么样的恶梦!
比利·简

2
随机字符串适用于chrome,但不适用于Firefox。为了完整起见,我同时使用了“ autocomplete ='off-no-complete'”并使用onfocus =“ this.readOnly = false”设置readonly属性。我的应用是用户用来输入数千个地址的企业应用,因此控制它的用例是真实的-我也可以保证使用Javascript,因此至少我已经明白了这一点
ChronoFish

13

我发现将其添加到表单会阻止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应用于两个不同的输入。非常奇怪...
Joe Heyming 2015年


9

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

<input type="text">

其次是:

<input type="password">

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

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

不幸的是,这不仅适用于用户名/密码类型的事情。Chrome浏览器会查看占位符文本以推断出建议内容。例如:jsbin.com/jacizu/2/edit
kentcdodds

如示例所示,您仍然可以在浏览器中填写字段,这是有效的,因此这并不能真正解决OP的问题。此解决方案只是防止浏览器“自动”填充用户名和密码组合,如示例中最佳答案所示。这可能对某些人有用,但不是禁用自动完成功能的最终解决方案,而必须由Google提供。
伯内斯托2015年

4
但是,如果在占位符文本之前添加空格,也会禁用基于占位符的自动建议。绝对是一个hack,尽管仅是其他建议。jsbin.com/pujasu/1/edit
Bernesto 2015年

实际上...它似乎对您的示例有效,但是由于某种原因它对我
不起作用

哈!这就是为什么它被称为骇客(hack)...您是否有一个示例可以分享它无法正常工作的地方?
伯内斯托2015年

8

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,这是此处唯一可行的解​​决方案
Denis

但是,表单会选择您需要的正确(可见)输入字段吗?因为它是同一个名字。
AlexioVay'7

@Vaia,将disabled属性添加到重复元素将阻止其提交。
mccainz

8

在2016年,Google Chrome浏览器开始忽略autocomplete=off它是否在W3C中。他们发布的答案

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

本质上说:我们更了解用户的需求。

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

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

如果屏幕上有任何密码字段(甚至是隐藏的密码字段),则自动填充功能会介入。要打破这种逻辑,可以将每个密码字段设置为自己的形式(如果它不违反自己的页面逻辑)。

<input type=name >

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

4
由于您的答案是最新的答案,您能否补充一下添加autocomplete="pineapple"或其他一些乱码似乎也可以解决此问题?至少,对我而言确实如此!
杜威·德·汉

1
@DouwedeHaan在保存表单之前可以使用,然后自动完成功能将为已保存的“菠萝”字段提供建议。但是,例如,使用随机哈希作为自动完成值会避免这种情况吗?
挖出

@digout我同意。一个很好的例子是将UUID用于此类内容。只要确保字符串是唯一的!
杜威·德·汉

7

如果您在保留占位符但禁用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
路易·帕特里斯·贝塞特

7

我真的不喜欢制作隐藏字段,我认为这样做会很快使人迷惑。

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

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

它的作用是,您首先必须通过选择字段来删除只读属性,届时,您很有可能会用自己的用户输入填充并弯腰自动填充以接管


1
不幸的是,这不再起作用:-( jsbin.com/sobise/edit?html,css,output
kentcdodds

7

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

在输入html字段中,以下两项将同时关闭。

Role="presentation" & autocomplete="off"

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

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

Chrome浏览器还会在标签元素上考虑“ for”属性。它可用于中断chrome的解析顺序。


我爱你。此页面上唯一有效的解决方案。
Day Davis Waterbury

在2020
Kai Noack

7

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

(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与测试


6

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

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

很棒的解决方案
DKR

您可以只添加autocomplete="off"到输入字段,而不使用jquery。顺便说一句,这是行不通的。Chrome密码建议仍在显示。
Kai Noack

6

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

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


这个答案的第一部分似乎不再是真的:Chrome Bug
Joshua Drake

我不确定你在做什么。该“错误”只是Chromium收集人们用例的占位符autocomplete="off"。这是可能的意图是将其删除,但是这不是曾经明确表示,肯定没有什么要求的精神飞跃。他们可能只是想考虑替代或更好的方法来治疗它。无论如何,它仍然是规范的一部分,同样也没有迹象表明它将离开规范。而且,据我所知,它仍然适用于所有浏览器,包括Chrome。
克里斯·普拉特

在有些情况下,Chrome无法使用autocomplete =“ off”。
约书亚·德雷克

1.几个轶事案件并不构成证据。2.正如我在回答中所说的那样,填写表格的扩展名之类的内容可能并不会,而且常常不尊重。最终,像所有事物一样,它取决于客户,也取决于用户。您所能做的就是建议不要将其自动填充。
克里斯·普拉特


6

通过设置autocompleteoff应该可以在这里工作,我有一个Google在搜索页中使用的示例。我从检查元素中发现了这一点。

在此处输入图片说明

编辑:如果off不起作用,请尝试falsenofill。就我而言,它适用于Chrome版本48.0


5

这是一个肮脏的骇客-

您的元素在此处(添加disabled属性):

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

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

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

5

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

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

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

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

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


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

4

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

$(document).ready(function(e) {
    if ($.browser.webkit) {
        $('#input_id').val(' ').val('');
    }
});

4

我也遇到过同样的问题。这是在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的方法:)
Jacka
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.