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

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


将在W3C验证器上标记警告:


没有属性“自动完成”。


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

评论

您确定要弄乱用户的自动完成设置吗?如果将其打开,他们可能会喜欢。自动完成功能是一种完全在浏览器端的功能,就像允许用户更改字体大小的按钮等。您不应干扰他们的意愿。

即使对于像信用卡号这样敏感的东西?我想不出想记住这些的人-尤其是因为大多数浏览器默认情况下都自动启用自动完成功能。如果他们希望它记得很糟糕,可以使用填写Google工具栏之类的表格。

我的用例略有不同-我正在滚动自己的自动完成功能,但又不想与浏览器冲突。我只是发现autocomplete =“ off”是无效的,但是似乎没有其他简单的解决方案(用js注入只是愚蠢的)

@rmeador,因为有时我们想提供一种比标准自动建议框更用户友好的替代方法。 @corydoras,请不要增加OSX的权重,这对于解决此问题没有帮助。

问题是,即使发生欺诈性交易,银行也将追究商人的责任,即使客户的过失是100%。因此,在某些情况下,为客户禁用该功能是合法的。

#1 楼

这是MDC上的一篇很好的文章,解释了形成自动完成的问题(和解决方案)。
Microsoft在这里也发布了类似的内容。

老实说,如果这是某件事对于您的用户而言很重要,以这种方式“突破”标准似乎是适当的。例如,亚马逊使用了'autocomplete'属性很多,它似乎运行良好。

如果您想完全删除警告,则可以使用JavaScript将该属性应用于支持以下功能的浏览器最后,如果您的站点使用的是HTTPS,则IE会自动关闭自动补全功能(据我所知,其他一些浏览器也会自动补全)。


,IE和Firefox是重要的浏览器。 />
更新

由于此答案仍然有很多争议,我只想指出,在HTML5中,您可以在form元素上使用'autocomplete'属性。请参阅W3C上的文档。

评论


看起来Firefox不会关闭https上的自动完成功能,但这是有用的知识。谢谢!

–马特b
09年2月24日在16:17

Safari不尊重autocomplete =“ off”属性。参见stackoverflow.com/questions/22817801/…

– Skurpi
2014年6月9日14:01

自动完成不仅可以在表单元素上使用,而且off值至少在铬40.0.2214.115中有效

–x-yuri
2015年3月3日在21:29



w3c似乎正在扩展HTML5.1中自动完成的标准(在此评论中为草案)w3c.github.io/html/…

–贾斯汀·纳夫(Justin Nafe)
16年4月19日在17:23

如果没有任何效果,请使用textarea而非文本框关闭自动完成功能。

– Bsienn
16年5月11日在12:56

#2 楼

如果W3C提出一种可与(X)HTML4一起使用的方法,我将感到非常惊讶。自动完成功能完全基于浏览器,并且是在最近几年(在编写HTML4标准之后很久才引入的)。

如果HTML5有一个功能,也不会感到惊讶。 >
编辑:正如我所想,HTML5确实具有该功能。要将页面定义为HTML5,请使用以下doctype(即,将其作为源代码中的第一个文本)。请注意,并非所有浏览器都支持此标准,因为它仍处于草稿形式。

<!DOCTYPE html>


评论


所有浏览器都希望Konqueror的旧版本支持它。甚至IE6也支持它。这是文档类型。

– BalusC
10-8-10,16:48



#3 楼

HTML 4:否

HTML 5:是


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


参考:W3

评论


@ freestock.tk是的,它比其他所有符号都清晰。简单很重要。

–OverCoder
16年5月5日在16:38

#4 楼

否,但是浏览器自动完成通常是由与先前填写的字段具有相同name属性的字段触发的。如果您可以采用一种巧妙的方法来获得一个随机的字段名,则自动完成功能将无法提取该字段的任何先前输入的值。

如果您要给输入字段起一个类似的名称“ email_<?= randomNumber() ?>”,然后让脚本通过POST或GET变量接收此数据循环,以查找与模式“ email_[some number]”匹配的内容,您可以执行此操作,并且(实际上)可以保证成功,无论使用哪种浏览器。

评论


这将使自动测试更加困难。

–大卫·沃特斯
09年2月24日在16:16

仅当您的测试软件无法应对检查/读取可能附加了随机数的字段时,才会使自动测试更加困难。可能是时候升级您的自动化测试软件了。

– corydoras
09年11月23日在6:15

自动完成信息仍将保存在浏览器的数据目录中,不是吗?

–乔伊·亚当斯(Joey Adams)
2011年1月3日,21:39

想必。但是不会期望它再次出现在用户面前。

–幻影沃森
2011年1月5日17:25

Chrome现在为特定网站使用type =“ password”属性,而不是name属性。我有name =“ newpassword” autocomplete ='off'type =“ password”,它会自动填充!如果我更改类型,则不会自动填充

– Enigma Plus
2014年4月28日14:57



#5 楼

不,Mozilla Wiki中的一篇好文章。

我将继续使用无效的attribute。我认为这是实用主义胜过验证的地方。

#6 楼

如何使用JavaScript进行设置?

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


这不是完美的方法,但是您的HTML将是有效的。

评论


使用javascript作为验证错误的解决方法就像在地毯下扫灰尘。尽管HTML文档可能有效,但是生成的HTML + JS页面将无效。

–fregante
2012年9月3日在1:43



#7 楼

我建议捕获所有4种类型的输入:

$('form,input,select,textarea').attr("autocomplete", "off");


参考:


http://www.w3.org/提交/ web-forms2 /#the-autocomplete
http://dev.w3.org/html5/markup/input.html


评论


也可以使用:input

–寻宝者
2014年6月1日21:18

#8 楼

如果您使用jQuery,则可以执行以下操作:

$(document).ready(function(){$("input.autocompleteOff").attr("autocomplete","off");});


,并在需要的地方使用autocompleteOff类:

<input type="text" name="fieldName" id="fieldId" class="firstCSSClass otherCSSClass autocompleteOff" />


如果要将所有输入都设为autocomplete=off,则可以简单地使用它:

$(document).ready(function(){$("input").attr("autocomplete","off");});


评论


仅使用HTML5 doctype更容易,更好。

– BalusC
2010年8月10日16:46

无论如何这并不是真正有效的html,它只是以不同于html的方式设置了(invalid)autocomplete属性

–马特b
2010年8月10日20:35

该代码对我不起作用;我用过$('input.autocompleteOff')。val('');这似乎还可以。

– dqd
11年8月31日在11:50

使用javascript作为验证错误的解决方法就像在地毯下扫灰尘。尽管HTML文档可能有效,但是生成的HTML + JS页面将无效。

–fregante
2012年9月3日,下午1:44

#9 楼

另一种方式-这也将有助于提高安全性,每次显示时都将输入框称为不同的名称:就像captha。这样一来,会话就只能读取一次输入,而“自动完成”则无事可做。

关于rmeador的问题,即您是否应该干扰浏览器的体验,这一点很重要:我们开发联系管理和CRM系统,当您以表格形式输入其他人的数据时,您不希望它不断地提出您自己的详细信息。

这可以满足我们的需求,但是我们却可以告诉用户获得一个不错的浏览器:)

autocomplete='off' 


#10 楼

autocomplete="off"这应该可以解决所有现代浏览器的问题。

<form name="form1" id="form1" method="post" autocomplete="off"
   action="http://www.example.com/form.cgi">
  [...]
</form>


在当前版本的Gecko浏览器中,autocomplete属性可以完美工作。对于早期版本,回到Netscape 6.2,它可以处理带有“地址”和“名称”的表单的异常。

Update

在某些情况下,浏览器将保留即使autocomplete属性设置为off也会建议自动补全值。对于开发人员而言,这种意外行为可能会令人困惑。真正强制不自动补全的技巧是为属性分配一个随机字符串,例如:

autocomplete="nope"


由于此随机值不是valid one,因此浏览器会放弃的。

吻合

评论


现代浏览器不选择自动完成功能。 :/不幸的是。

– Alexus
17年11月23日在23:28

@Alexus添加了一些更新...互联网变化非常快

– Emilio Gort
17年11月27日在15:31

#11 楼

使用随机的'name'属性对我有用。

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

#12 楼

请注意,关于自动完成属性的位置有些困惑。它既可以应用于整个FORM标记,也可以应用于单个INPUT标记,而且在HTML5之前还没有真正标准化(明确允许这两个位置)。最值得注意的是旧版文档,该Mozilla文章仅提及FORM标签。同时,某些安全扫描程序将仅在INPUT标签中查找自动完成功能,并抱怨缺少自动完成功能(即使它位于父FORM中)。有关此混乱的更详细分析,请参见此处:HTML表单中对AUTOCOMPLETE = OFF属性的困惑。

#13 楼

不太理想,但是您每次渲染文本框时都可以更改其ID和名称-您也必须在服务器端对其进行跟踪,这样才能获取数据。

不确定是否会不会工作,只是一个想法。

#14 楼

我认为有一种更简单的方法。
创建一个具有随机名称的隐藏输入(通过javascript)并将用户名设置为该名称。重复输入密码。这样,您的后端脚本就可以准确地知道适当的字段名称,同时又可以在黑暗中保持自动完成。

我可能错了,但这只是个主意。

#15 楼

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


#16 楼

我在2020年完成了这项工作!
我基本上创建了一个CSS类,将-webkit-text-security应用于我的输入。
这里是最近的讨论的链接:
https:// stackoverflow.com/a/64471795/8754782

#17 楼

此解决方案适用于我:

$('form,input,select,textarea').attr("autocomplete", "nope");


如果要在该区域中使用自动填充:在元素中添加autocomplete="false"
例如:

<input id="search" name="search" type="text" placeholder="Name or Code" autcomplete="false">


#18 楼

有效的自动完成功能关闭

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


评论


当然,如果用户关闭了JS,他们将无法完成订单,因为他们无法输入卡号?最好通过JS补充属性-最坏的情况是,JS关闭使卡号字段具有自动完成的潜力,但至少他们可以下订单...只是一个想法:)

– Terry_Brown
2010年5月19日,11:25

这甚至不好笑。

–里卡多·皮珀(Ricardo Pieper)
2013年6月26日19:55