html - type - 禁止chrome自动填充




有没有W3C有效的方式来禁用HTML表单中的自动完成? (11)

有效的自动完成关闭

<script type="text/javascript">
    /* <![CDATA[ */
    document.write('<input type="text" id="cardNumber" name="cardNumber" autocom'+'plete="off"/>');
    /* ]]> */ 
</script>

使用xhtml1-transitional.dtd文档类型时,使用以下HTML收集信用卡号码

<input type="text" id="cardNumber" name="cardNumber" autocomplete='off'/>

将在W3C验证器上发出警告:

没有属性“自动完成”。

是否有W3C /标准的方式来禁用浏览器在表单中的敏感字段上自动完成?


Here是MDC的一篇很好的文章,它解释了形成自动完成的问题(和解决方案)。 微软也在here发布了类似的内容。

说实话,如果这对用户来说很重要,那么以这种方式“打破”标准似乎是适当的。 例如,亚马逊使用'autocomplete'属性相当多,它似乎运作良好。

如果要完全删除警告,可以使用JavaScript将属性应用于支持它的浏览器(IE和Firefox是重要的浏览器),方法是使用someForm.setAttribute( "autocomplete", "off" ); someFormElm.setAttribute( "autocomplete", "off" ); someForm.setAttribute( "autocomplete", "off" ); someFormElm.setAttribute( "autocomplete", "off" );

最后,如果您的网站使用HTTPS,IE会自动关闭自动完成功能(就我所知,其他浏览器也一样)。

更新

由于这个答案仍然有不少赞扬,我只想指出,在HTML5中,你可以在你的表单元素上使用'autocomplete'属性。 请参阅W3C上的documentation


HTML 4 :没有

HTML 5 :是的

autocomplete属性是一个枚举属性。 该属性有两个状态。 on关键字映射到on状态, off关键字映射到off状态。 该属性也可以省略。 缺少的值默认为打开状态。 关闭状态表示默认情况下,表单中的表单控件将其自动填充字段名称设置为关闭 ; on状态表示默认情况下,表单中的表单控件将其autofill字段名称设置为“on”。

参考: W3


不理想,但是每次渲染时都可以更改文本框的ID和名称 - 您必须跟踪服务器端,以便可以获取数据。

不知道这是否会起作用,只是一个想法。


不,但浏览器自动完成通常是由与之前填写的字段具有相同name属性的字段触发的。 如果您可以巧妙地使用随机字段名称 ,自动填充将无法为该字段提取任何先前输入的值。

如果您要为输入字段输入一个名称,例如“ email_<?= randomNumber() ?> ”,然后让脚本通过POST或GET变量接收此数据循环,以寻找匹配模式“ email_[some number] “,你可以把它关闭,而且无论浏览器如何,这都会(实际上)保证成功。


使用随机的“名称”属性适用于我。

发送表单时我重置了名称属性,因此您仍可以在发送表单时按名称访问它。 (使用id属性来存储名称)


如何使用JavaScript进行设置?

var e = document.getElementById('cardNumber');
e.autocomplete = 'off'; // Maybe should be false

这不是完美的,但你的HTML将是有效的。


如果W3C会提出一种可以与(X)HTML4一起使用的方法,我会非常惊讶。 自动完成功能完全基于浏览器,在过去的几年(在HTML4标准写完之后)被引入。

但是,如果HTML5会有一个,那么不会感到惊讶。

编辑:正如我的想法, HTML5 确实有这个功能。 要将页面定义为HTML5,请使用以下文档类型(即:将其作为源代码中的第一个文本)。 请注意,并非所有浏览器都支持此标准,因为它仍处于草稿状态。

<!DOCTYPE html>


我认为有一个更简单的方法。 用一个随机的名字创建一个隐藏的输入(通过javascript)并设置用户名。 重复输入密码。 这样,您的后端脚本就可以确切知道相应的字段名称,同时在黑暗中保持自动填充。

我可能是错的,但这只是一个想法。


if (document.getElementsByTagName) {

    var inputElements = document.getElementsByTagName(“input”);

    for (i=0; inputElements[i]; i++) {

        if (inputElements[i].className && (inputElements[i].className.indexOf(“disableAutoComplete”) != -1)) {

            inputElements[i].setAttribute(“autocomplete”,”off”);

        }

    }

}




w3c