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

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

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

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

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


当前回答

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

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

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

其他的都对我没用。

其他回答

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

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

我不知道为什么,但autocomplete="new-password"禁用自动填充。它在最新的49.0.2623.112 chrome版本中工作。

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

将readonly属性添加到标记中,同时删除onfocus事件,可以修复该问题

我遇到了“现在登录或注册”模式窗口的问题,如果用户已经将他们的凭据保存到浏览器中,这是一个问题。sign in和register字段都被填充了,所以我可以用下面的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的一些答案相同,但以一种角度的方式完成。

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

[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 readonly onfocus="this.removeAttribute('readonly');" type="text">

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