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

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

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

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

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


当前回答

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

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

其他回答

有时即使autocomplete=off也不能防止在错误的字段中填写凭据。

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

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

焦点事件发生在鼠标单击和通过字段的选项卡时。

更新:

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

上面的这个即时修复对我来说是有效的。

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

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

我发现,添加这个到表单阻止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已经决定它比开发人员更了解何时自动完成。有微软的感觉。

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

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

唯一适合我的方法是:(jQuery要求)

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