是否有一种W3C有效的方法来禁用HTML表单中的自动完成功能?

mat*_*t b 421 html forms standards w3c

使用xhtml1-transitional.dtddoctype时,使用以下HTML收集信用卡号

<input type="text" id="cardNumber" name="cardNumber" autocomplete='off'/>
Run Code Online (Sandbox Code Playgroud)

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

没有属性"自动完成".

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

Nic*_*sta 419

是来自MDC的一篇好文章,它解释了形成自动完成的问题(和解决方案).微软也在这里发布了类似的东西.

说实话,如果这对您的用户来说很重要,那么以这种方式"打破"标准似乎是合适的.例如,亚马逊使用'autocomplete'属性相当多,而且似乎运行良好.

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

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

更新

由于这个答案仍然有很多赞成,我只是想指出,在HTML5中,您可以在表单元素上使用'autocomplete'属性.有关它的信息,请参阅W3C 的文档.

  • 看起来Firefox并没有关闭https上的自动完成功能,但这是一个有用的知识.谢谢! (41认同)
  • Safari不尊重autocomplete ="off"属性.见http://stackoverflow.com/questions/22817801/how-to-disable-auto-fill-in-safari-7 (3认同)

Hen*_*aul 63

如果W3C提出了一种适用于(X)HTML4的方法,我会感到非常惊讶.自动完成功能完全基于浏览器,并在过去几年(在编写HTML4标准之后)推出.

但是,如果HTML5有一个,也不会感到惊讶.

编辑:我认为,HTML5 确实有这个功能.要将页面定义为HTML5,请使用以下doctype(即:将此作为源代码中的第一个文本).请注意,并非所有浏览器都支持此标准,因为它仍处于草稿形式.

<!DOCTYPE html>
Run Code Online (Sandbox Code Playgroud)

  • 所有浏览器都希望旧版本的Konqueror支持它.甚至IE6也支持它.这是要去的文件类型. (7认同)

Ruu*_*Kok 56

HTML 4:没有

HTML 5:是的

autocomplete属性是枚举属性.该属性有两种状态.在关键字映射到导通状态,并且关闭 关键字映射到关断状态.该属性也可以省略.缺省值default是on状态.该关闭状态表示在默认情况下,在形式表单控件都会有自己的自动填充字段名称设置为关闭 ; on状态表示默认情况下,表单中的表单控件的autofill字段名称将设置为"on".

参考:W3


Pha*_*son 32

不,但浏览器自动完成通常由具有与name先前填写的字段相同属性的字段触发.如果您可以通过巧妙的方式获得随机字段名称,则自动完成功能将无法为该字段提取任何先前输入的值.

如果你给输入字段一个像" email_<?= randomNumber() ?>" 这样的名字,然后让脚本通过POST或GET变量接收这个数据循环寻找匹配模式" email_[some number]"的东西,你可以把它拉掉,这样就可以了(实际上)保证成功,无论浏览器如何.

  • 只有当您的测试软件无法应对检查/读取可能附加随机数字段的字段时,才会使自动测试更加困难.可能是时候升级您的自动化测试软件了. (14认同)
  • 自动完成信息仍会保存在浏览器的数据目录中,不是吗? (8认同)
  • 这会使自动测试变得更难. (6认同)
  • 想必.但预计不会再向用户显示. (2认同)

Dav*_*ers 31

不,Mozila Wiki上有一篇好文章.

我会继续使用无效的attribute.我认为这是实用主义应该胜过验证的地方.


Gre*_*reg 23

用JavaScript设置它怎么样?

var e = document.getElementById('cardNumber');
e.autocomplete = 'off'; // Maybe should be false
Run Code Online (Sandbox Code Playgroud)

它并不完美,但您的HTML将是有效的.

  • 使用javascript作为验证错误的解决方法就像在地毯下扫除灰尘.虽然HTML文档可能有效,但生成的HTML + JS页面不会生效. (8认同)

Mal*_*tre 19

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

$('form,input,select,textarea').attr("autocomplete", "off");
Run Code Online (Sandbox Code Playgroud)

参考:

  • 也可以使用`:input` (2认同)

小智 11

如果你使用jQuery,你可以这样做:

$(document).ready(function(){$("input.autocompleteOff").attr("autocomplete","off");});
Run Code Online (Sandbox Code Playgroud)

并在您想要的位置使用autocompleteOff类:

<input type="text" name="fieldName" id="fieldId" class="firstCSSClass otherCSSClass autocompleteOff" />
Run Code Online (Sandbox Code Playgroud)

如果你想要所有的输入autocomplete=off,你可以简单地使用它:

$(document).ready(function(){$("input").attr("autocomplete","off");});
Run Code Online (Sandbox Code Playgroud)

  • 这不是真正有效的html,它只是以不同于html的方式设置(无效)`autocomplete`属性 (5认同)
  • 使用javascript作为验证错误的解决方法就像在地毯下扫除灰尘.虽然HTML文档可能有效,但生成的HTML + JS页面不会生效. (5认同)
  • 只使用HTML5 doctype更容易,更好. (4认同)

Eni*_*lus 8

另一种方式 - 这也有助于提高安全性,每次显示输入框时都会调用输入框:就像一个captha.这样,会话可以读取一次性输入,而自动完成则无需继续.

关于rmeador关于您是否应该干扰浏览器体验的问题,我们提出了一个观点:我们开发了联系人管理和CRM系统,当您在表单中键入其他人的数据时,您不希望它经常建议您自己的详细信息.

这适用于我们的需求,但是我们可以告诉用户获得一个体面的浏览器:)

autocomplete='off' 
Run Code Online (Sandbox Code Playgroud)


Emi*_*ort 8

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

<form name="form1" id="form1" method="post" autocomplete="off"
   action="http://www.example.com/form.cgi">
  [...]
</form>
Run Code Online (Sandbox Code Playgroud)

在当前版本的Gecko浏览器中,自动完成属性非常有效.对于早期版本,返回Netscape 6.2,它使用带有"地址"和"名称"的表单的例外

更新

在某些情况下,即使autocomplete属性设置为off,浏览器也会继续建议自动完成值.对于开发人员来说,这种意想不到的行为非常令人费解 真正强制非自动完成的技巧是为属性分配一个随机字符串,例如:

autocomplete="nope"
Run Code Online (Sandbox Code Playgroud)

由于此随机值不是a valid one,浏览器将放弃.

Documetation


小智 6

使用随机的"名称"属性对我有用.

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


kra*_*etz 5

请注意,自动完成属性的位置存在一些混淆.它既可以应用于整个FORM标签,也可以应用于单个INPUT标签,这在HTML5之前并未真正标准化(明确允许两个 位置).较旧的文档,尤其是这篇Mozilla文章,只提到了FORM标签.同时,一些安全扫描程序将只寻找在INPUT标记自动完成,如果缺少投诉(即使在父窗体).此处发布了对此混乱的更详细分析:HTML表单中的AUTOCOMPLETE = OFF属性的混淆.