我遇到了chrome自动填充行为的几个形式的问题。

表单中的字段都有非常常见和准确的名称,例如“email”、“name”或“password”,并且它们还设置了autocomplete=“off”。

自动完成标志已经成功禁用了自动完成行为,当你开始输入时,会出现一个下拉的值,但没有改变Chrome自动填充字段的值。

这种行为是可以的,除了chrome填充输入不正确,例如填充电话输入与电子邮件地址。客户抱怨过这个问题,所以它被证实在很多情况下都发生了,而不是我在我的机器上本地操作的某种结果。

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


当前回答

我真的不喜欢做隐藏字段,我觉得这样做很快就会让人很困惑。

在您想要停止自动完成的输入字段上,这将起作用。将字段设置为只读并集中,像这样删除该属性

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

这所做的是,你首先要删除只读属性,选择字段,在那个时候,最有可能的是,你将填充与您自己的用户输入和弯腰自动填充接管

其他回答

这是如此简单和棘手:)

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

if your password element inside a <form> tag you need to put the dummy element as the first element in your form immediately after <form> open tag if your password element not inside a <form> tag put the dummy element as the first element in your html page immediately after <body> open tag You need to hide the dummy element without using css display:none so basically use the following as a dummy password element. <input type="password" style="width: 0;height: 0; visibility: hidden;position:absolute;left:0;top:0;"/>

通过这个技巧,自动完成功能已经成功禁用。 它的工作原理!

[HTML]

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

(JQuery)

$("#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);
    }

});

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

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

如果您曾经用用户输入的值填充用户名,如果没有用户输入的值,则编码输入' '。

编辑:我还不得不改变'用户名'字段有一个其他的名字,而不是'用户名',例如。“nameofuser”

我的黑客测试在Chrome 48:

由于Chrome试图找出字段的类型,它是通过查看诸如id或名称属性的<输入>,但也在相关的<标签>内容,你只需要找到这些无意义的名字。

对于id和名称,很容易选择这里没有列出的其他内容。

对于标签,我在中间插入了一个不可见的<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>

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

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

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

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

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

如果屏幕上有任何密码字段,即使是隐藏的,自动填充步骤。 要打破这种逻辑,如果不打破自己的页面逻辑,可以将每个密码字段放入自己的表单中。

<input type=name >

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