有没有W3C有效的方式来禁用HTML表单中的自动完成?
使用xhtml1-transitional.dtd文档types时,使用以下HTML收集信用卡号码
<input type="text" id="cardNumber" name="cardNumber" autocomplete='off'/>
将在W3Cvalidation器上标记警告:
没有属性“自动完成”。
是否有一个W3C /标准的方式来禁用浏览器自动完成在一个窗体中的敏感领域?
这是MDC的一篇很好的文章,它解释了形成自动完成的问题(和解决scheme)。 微软在这里也发表了类似的东西。
说实话,如果这对用户来说很重要,那么以这种方式“打破”标准似乎是合适的。 例如,亚马逊使用“自动完成”属性相当多,它似乎运作良好。
如果要完全删除警告,可以使用JavaScript将属性应用到支持它的浏览器(IE和Firefox是重要的浏览器),使用someForm.setAttribute( "autocomplete", "off" ); someFormElm.setAttribute( "autocomplete", "off" );
someForm.setAttribute( "autocomplete", "off" ); someFormElm.setAttribute( "autocomplete", "off" );
最后,如果您的网站使用的是HTTPS,则IE会自动closures自动完成function(就我所知,其他浏览器也一样)。
更新
由于这个答案仍然有很多upvotes,我只是想指出,在HTML5中,您可以使用您的表单元素“autocomplete”属性。 请参阅W3C上的文档 。
如果W3C会提出一种可以与(X)HTML4一起工作的方法,我会感到非常惊讶。 自动完成function完全是基于浏览器的,在过去几年(在HTML4标准写完之后)被引入。
但是,如果HTML5会有一个,那么不会感到惊讶。
编辑:正如我所想, HTML5 确实有这个function。 要将页面定义为HTML5,请使用以下文档types(即:将其作为源代码中的第一个文本)。 请注意,并非所有浏览器都支持此标准,因为它仍处于草稿状态。
<!DOCTYPE html>
HTML 4 :没有
HTML 5 :是的
autocomplete属性是一个枚举属性。 该属性有两个状态。 on关键字映射到on状态, off关键字映射到off状态。 该属性也可以省略。 缺less的值默认是on状态。 off状态表示默认情况下,表单中的表单控件将其自动填充字段名称设置为off ; on状态表示默认情况下,表单中的表单控件将
autofill
字段名称设置为“on”。
参考: W3
不, Mozila Wiki中有一篇很好的文章。
我会继续使用无效的attribute
。 我认为这是实用主义胜过validation的地方。
不,但是浏览器自动完成通常是由与先前填写的字段具有相同name
属性的字段触发的。 如果您可以巧妙地使用随机字段名称 ,自动填充function将无法为该字段提取任何先前input的值。
如果你要给一个input字段命名为“ email_<?= randomNumber() ?>
”,然后让脚本通过POST或GETvariables接收这个数据循环,寻找匹配模式“ email_[some number]
“,你可以把这个关掉,这将(实际上)保证成功, 无论浏览器 。
如何使用JavaScript设置?
var e = document.getElementById('cardNumber'); e.autocomplete = 'off'; // Maybe should be false
这不是完美的,但你的HTML将是有效的。
我build议抓住所有4种types的input:
$('form,input,select,textarea').attr("autocomplete", "off");
参考:
如果你使用jQuery,你可以这样做:
$(document).ready(function(){$("input.autocompleteOff").attr("autocomplete","off");});
并使用你想要的autocompleteOff类:
<input type="text" name="fieldName" id="fieldId" class="firstCSSClass otherCSSClass autocompleteOff" />
如果你想要所有的input是autocomplete=off
,你可以简单地使用:
$(document).ready(function(){$("input").attr("autocomplete","off");});
autocomplete="off"
这应该解决所有现代浏览器的问题。
<form name="form1" id="form1" method="post" autocomplete="off" action="http://www.example.com/form.cgi"> [...] </form>
在当前版本的Gecko浏览器中,autocomplete属性完美运行。 对于早期的版本,回到Netscape 6.2,它处理与“地址”和“名称”的表单exception
Documetation
另一种方式 – 这也将有助于安全性,每次显示input框都会有所不同,就像captha一样。 这样,会话可以读取只有一次性input,自动完成没有任何进展。
关于rmeador是否应该干扰浏览器体验的问题只是一个问题:我们开发联系人pipe理和CRM系统,当您将其他人的数据input到表单中时,您不希望它不断地提出自己的细节。
这适用于我们的需求,但是,我们有奢侈的告诉用户得到一个体面的浏览器:)
autocomplete='off'
使用随机的“名称”属性适用于我。
发送表单时,我重置了名称属性,所以您仍然可以在发送表单时通过名称来访问它。 (使用id属性来存储名称)
请注意,关于autocomplete属性的位置有一些困惑。 它可以应用于整个FORM标签或单独的INPUT标签,在HTML5(明确允许这两个 位置 )之前,它并没有真正标准化。 较老的文档最值得注意的是这个Mozilla文章只提到FORM标签。 同时,一些安全扫描程序只会在INPUT标签中查找自动完成,并且如果缺失(即使它在父窗体中),也会投诉。 对此混乱的更详细的分析发布在这里: 对AUTOCOMPLETE = OFF属性在HTML表单中的混乱 。
不是很理想,但是每次渲染时都可以更改文本框的ID和名称 – 您必须跟踪服务器端,才能获取数据。
不知道这是否有效,只是一个想法。
我认为有一个更简单的方法。 用一个随机的名字(通过javascript)创build一个隐藏的input,并设置用户名。 重复密码。 这样,您的后端脚本就可以确切知道相应的字段名称,同时在黑暗中保持自动完成。
我可能是错的,但这只是一个想法。
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”); } } }
有效的自动完成closures
<script type="text/javascript"> /* <![CDATA[ */ document.write('<input type="text" id="cardNumber" name="cardNumber" autocom'+'plete="off"/>'); /* ]]> */ </script>