如何在主要浏览器中禁用特定输入(或表单字段)的自动完成?


当前回答

不要使用JAVASCRIPT修复此问题!!

首先使用HTML解决此问题,以防浏览器未使用脚本、无法使用您的脚本版本或脚本已关闭。请始终在HTML之上最后一层脚本。

对于具有“text”类型属性的常规输入表单字段,请在元素上添加autocomplete=“off”。由于用户浏览器覆盖设置,这可能在现代HTML5浏览器中不起作用,但它会照顾到许多旧浏览器,并停止大多数浏览器中的自动完成下拉选项。注意,我还包括了所有其他可能会让用户感到不快的自动完成选项,如autocapitalize=“off”、autocorrect=“off”和spellcheck=“false”。许多浏览器不支持这些功能,但它们增加了额外的“附加”功能,这会让数据输入人员感到烦恼。注意,例如,如果用户的浏览器设置为启用了自动填充,Chrome会忽略“关闭”。因此,实现浏览器设置可以覆盖此属性。

例子:

<input type="text" id="myfield" name="myfield" size="20" value="" autocomplete="off" autocapitalize="off" autocorrect="off" spellcheck="false" tabindex="0" placeholder="Enter something here..." title="Enter Something" aria-label="Something" required="required" aria-required="true" />

对于用户名和密码输入类型字段,对于触发“关闭”功能的更具体的自动完成属性,浏览器的支持有限。用于登录的文本输入上的autocomplete=“username”将迫使某些浏览器重置并删除自动完成功能。autocomplete=“new password”将尝试使用“password”类型输入字段对密码执行相同操作。(见下文)。然而,这些是特定浏览器的专有技术,在大多数情况下都会失败。不支持这些功能的浏览器包括Internet Explorer 1-11、许多Safari和Opera桌面浏览器,以及一些版本的iPhone和Android默认浏览器。但它们提供了额外的力量来尝试并强制删除自动完成。

例子:

<input type="text" id="username" name="username" size="20" value="" autocomplete="username" autocapitalize="off" autocorrect="off" spellcheck="false" tabindex="0" placeholder="Enter username here..." title="Enter Username" aria-label="Username" required="required" aria-required="true" />
<input type="password" id="password" name="password" size="20" minlength="8" maxlength="12" pattern="(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,12}" value="" autocomplete="new-password" autocapitalize="off" autocorrect="off" spellcheck="false" tabindex="0" placeholder="Enter password here..." title="Enter Password: (8-12) characters, must contain one number, one uppercase and lowercase letter" aria-label="Password" required="required" aria-required="true" />

现在寻找更好的解决方案!

由于标准机构和浏览器对HTML5的支持分散,许多现代HTML5属性在许多浏览器中都失败了。所以,一些孩子转向脚本来填补这些漏洞。但这是懒惰的编程。使用JavaScript隐藏或重写HTML会使情况变得更糟,因为您现在有一层又一层的脚本依赖关系,再加上HTML补丁。避免这种情况!

要在表单和字段中永久禁用此功能,最好的方法是每次在“input”元素上创建一个自定义的“id”/“name”值,使用一个唯一的值,如连接到字段id和name属性的日期或时间,并确保它们匹配(例如“name=password_{date}”)。

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

这破坏了愚蠢的浏览器自动完成选择算法,该算法会嗅探触发这些字段过去值的匹配名称。通过这样做,浏览器无法将以前表单数据的缓存与您的匹配。它将强制关闭“自动完成”,或显示空白列表,并且不再显示任何以前的密码!在服务器端,您可以创建这些自定义输入“命名”字段,并通过简单地解析id/name的第一部分,从用户浏览器的响应中识别和提取正确的字段。例如“password_”或“username_”等。当字段的“name”值出现时,只需解析第一部分(“password_{date}”)并忽略其余部分,然后在服务器上提取值。

容易的

其他回答

为了解决这个问题,我使用了一些CSS技巧和以下工作。

input {
    text-security:disc;
    -webkit-text-security:disc;
    -mox-text-security:disc;
}

请阅读本文了解更多详情。

只需每次将输入元素中的name属性更改为唯一的属性,它就不会再次自动完成!

一个例子可能是结尾处添加的时间tic。您的服务器只需要解析文本名称的第一部分即可检索回值。

<input type="password" name="password_{DateTime.Now.Ticks}" value="" />

将输入保留为文本类型并隐藏。在DOMContentLoaded上,调用一个函数来更改密码类型并显示字段,延迟1秒。

document.addEventListener('DOMContentLoaded',changeInputsType);函数更改InputsType(){setTimeout(函数){$(/*selector*/).prop(“type”,“password”).show();}, 1000);}

这是自2021 5月起适用于所有浏览器的完美解决方案!

TL;博士

将输入字段名和字段ID重命名为非相关的名称,如“data_input_field_1”。然后添加&#8204;将字符插入标签的中间。这是一个非打印字符,因此您不会看到它,但它会诱使浏览器无法识别需要自动完成的字段,因此不会显示内置的自动完成小部件!

详细信息

几乎所有浏览器都使用字段的名称、id、占位符和标签的组合来确定字段是否属于一组地址字段,这些字段可以从自动完成中受益。因此,如果您有一个类似<input type=“text”id=“address”name=“street_address”>的字段,几乎所有浏览器都会将该字段解释为地址字段。因此,浏览器将显示其内置的自动完成小部件。梦想是使用属性autocomplete=“off”可以工作,不幸的是,现在大多数浏览器都不遵守请求。

因此,我们需要使用一些技巧来使浏览器不显示内置的自动完成小部件。我们这样做的方式是欺骗浏览器,使其相信该字段根本不是地址字段。

首先,将id和name属性重命名为不会泄露您正在处理的地址相关数据的属性。因此,与其使用<input type=“text”id=“city input”name=“city”>,不如使用类似的方式。浏览器不知道data_input_field_3代表什么。但你知道。

如果可能,不要使用占位符文本,因为大多数浏览器也会考虑到这一点。如果你必须使用占位符文本,那么你就必须发挥创意,确保你没有使用任何与地址参数本身相关的单词(如City)。使用类似“输入位置”的方法可以实现此目的。

最后一个参数是附加到字段的标签。然而,如果你像我一样,你可能希望保持标签完整,并向用户显示可识别的字段,如“地址”、“城市”、“州”、“国家”。好吧,好消息:你可以!实现这一点的最佳方法是插入零宽度非联接字符&#8204;,作为标签中的第二个字符。因此,将<label>City</label>替换为<label>C&#8204;城市</label>。这是一个非打印字符,因此您的用户将看到City,但浏览器将被欺骗,无法识别该字段!

任务完成!如果一切顺利,浏览器应该不再在这些字段上显示内置的地址自动完成小部件!

当我自己尝试时,事情已经改变了,旧的答案不再有效。

我确信它会奏效。我在Chrome、Edge和Firefox中测试了这一功能,它确实做到了这一点。你也可以尝试一下,告诉我们你的经历。

set the autocomplete attribute of the password input element to "new-password"

<form autocomplete="off">
....other element
<input type="password" autocomplete="new-password"/>
</form>

这是根据MDN

如果您正在定义一个用户管理页面,用户可以在该页面中为另一个人指定新密码,因此您希望防止自动填充密码字段,则可以使用autocomplete=“新密码”

这是一个提示,哪些浏览器不需要遵守。然而,由于这个原因,现代浏览器已经停止使用autocomplete=“new password”自动填充<input>元素。