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


当前回答

定义输入的属性type=“text”和autocomplete=“off”足以为我关闭自动完成。

除了type=“password”之外,我尝试使用JavaScript钩住别人的建议中的onfocus/onfocuout事件来切换只读属性,效果很好,但当密码字段编辑开始为空时,自动完成密码再次出现。

我建议除了上述工作正常的解决方法之外,还可以使用JavaScript挂钩oninput事件来切换关于密码长度的类型属性。。

<input id="pwd1" type="text" autocomplete="off" oninput="sw(this)" readonly onfocus="a(this)" onfocusout="b(this)" />
<input id="pwd2" type="text" autocomplete="off" oninput="sw(this)" readonly onfocus="a(this)" onfocusout="b(this)" />

和JavaScript。。

function sw(e) {
    e.setAttribute('type', (e.value.length > 0) ? 'password' : 'text');
}
function a(e) {
    e.removeAttribute('readonly');
}
function b(e) {
    e.setAttribute('readonly', 'readonly');
}

其他回答

正如其他人所说,答案是autocomplete=“off”。

然而,我认为有必要说明为什么在某些情况下使用此选项是一个好主意,因为对此问题和重复问题的一些答案表明,最好不要关闭此选项。

停止存储信用卡号的浏览器不应该留给用户。太多的用户甚至不会意识到这是一个问题。

在信用卡安全码字段上关闭它尤为重要。如本页所述:

“永远不要存储安全码……它的价值取决于这样一种假设,即提供安全码的唯一方法是从实体信用卡中读取安全码,以证明提供该安全码的人实际上持有该卡。”

问题是,如果是公共计算机(网吧、图书馆等),其他用户很容易窃取您的卡信息,甚至在您自己的计算机上,恶意网站也可能窃取自动完成的数据。

多年来我一直在为自动完成而奋斗。我尝试了每一个建议,但都没有奏效。通过jQuery 2添加属性效果良好:

$(document).ready( function () {
    setTimeout(function() {
        $('input').attr('autocomplete', 'off').attr('autocorrect', 'off');
    }, 10);
}); 

将生成HTML

<input id="start_date" name="start_date" type="text" value="" class="input-small hasDatepicker" autocomplete="off" placeholder="Start date" autocorrect="off">

这是自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,但浏览器将被欺骗,无法识别该字段!

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

其想法是创建一个与原始字段同名的不可见字段。这将使浏览器自动填充隐藏字段。

我使用以下jQuery片段:

// Prevent input autocomplete
$.fn.preventAutocomplete = function() {
    this.each(function () {
        var $el = $(this);
        $el
            .clone(false, false) // Make a copy (except events)
            .insertBefore($el)   // Place it before original field
            .prop('id', '')      // Prevent ID duplicates
            .hide()              // Make it invisible for user
        ;
    });
};

然后只需$(“#登录表单输入”).prpreventAutocomplete();

<script language="javascript" type="text/javascript">
    $(document).ready(function () {
        try {
            $("input[type='text']").each(
                function(){
                   $(this).attr("autocomplete", "off");
                });
        }
        catch (e) {
        }
    });
</script>