Y a-t-il un moyen valide W3C pour désactiver autocomplete dans un format HTML?
Lorsqu'on utilise le type de document xhtml1-transitional.dtd
, collecte d'un numéro de carte de crédit avec le code HTML suivant
<input type="text" id="cardNumber" name="cardNumber" autocomplete='off'/>
marquera un avertissement sur le validateur W3C:
il n'y a pas d'attribut"autocomplete".
y a-t-il un moyen W3C / standards pour désactiver le navigateur Auto-complete sur les champs sensibles dans un formulaire?
16 réponses
ici est un bon article du MDC qui explique les problèmes (et les solutions) pour former autocompletion. Microsoft a publié quelque chose de similaire ici , ainsi.
pour être honnête, si c'est quelque chose d'important pour vos utilisateurs, "briser" les normes de cette façon semble approprié. Par exemple, Amazon utilise l'attribut 'autocomplete' assez souvent, et il semble bien fonctionner.
si vous voulez pour supprimer entièrement L'avertissement, vous pouvez utiliser JavaScript pour appliquer l'attribut aux navigateurs qui le prennent en charge (IE et Firefox sont les navigateurs importants) en utilisant someForm.setAttribute( "autocomplete", "off" ); someFormElm.setAttribute( "autocomplete", "off" );
enfin, si votre site utilise HTTPS, C'est-à-dire qu'il éteint automatiquement autocomplete (comme le font certains autres navigateurs, pour autant que je sache).
mise à Jour
comme cette réponse reçoit encore pas mal d'éloges, je voulais juste faire remarquer qu'en HTML5, vous pouvez utiliser l'attribut 'autocomplete' sur votre élément de formulaire. Voir la documentation sur W3C pour it.
je serais très surpris si le W3C avait proposé une méthode qui fonctionnerait avec le (X)HTML4. La fonctionnalité autocomplete est entièrement basée sur le navigateur, et a été introduite au cours des dernières années (bien après que la norme HTML4 ait été écrite).
ne serait pas surpris si HTML5 en avait un.
Edit: Comme je le pensais, HTML5 ne . Pour définir votre page comme HTML5, utilisez le doctype suivant(I. e: mettez ceci comme le tout premier texte dans votre code source). Notez que tous les navigateurs ne supportent pas cette norme, car elle est toujours sous forme de brouillon.
<!DOCTYPE html>
HTML 4 : No
HTML 5 : Oui
L'attribut autocomplete est un attribut énuméré. Attribut a deux états. Le sur correspond à l'état on, et le off mots clés cartes à l'état off. L'attribut peut aussi être omis. Le la valeur manquante par défaut est l'état sur . Le off l'état indique que par par défaut, les contrôles de forme dans le formulaire auront leur nom de champ auto-remplir défini à off ; l'état on indique que par défaut, form controls in le nom du champ
autofill
du formulaire sera "on".
Référence: W3
non, un bon article est ici dans Mozila Wiki .
je continuerais à utiliser le attribute
invalide . Je pense que c'est là que le pragmatisme devrait l'emporter sur la validation.
Non, mais le navigateur Auto-complete est souvent déclenché par le champ ayant le même attribut name
que les champs précédemment remplis. Si vous pouviez mettre en place une façon intelligente d'avoir un nom de champ aléatoire , autocomplete ne serait pas en mesure de tirer n'importe quelles valeurs précédemment entrées pour le champ.
si vous deviez donner à un champ input un nom comme " email_<?= randomNumber() ?>
", et ensuite avoir le script qui reçoit cette boucle de données par L'intermédiaire de la poste ou Obtenir des variables à la recherche de quelque chose qui correspond au modèle " email_[some number]
", vous pourriez tirer cela, et cela aurait (pratiquement) garanti le succès, indépendamment du navigateur .
Que Diriez-vous de le configurer avec JavaScript?
var e = document.getElementById('cardNumber');
e.autocomplete = 'off'; // Maybe should be false
ce N'est pas parfait, mais votre HTML sera valide.
je suggère d'attraper les 4 types d'entrées:
$('form,input,select,textarea').attr("autocomplete", "off");
référence:
si vous utilisez jQuery, vous pouvez faire quelque chose comme ça:
$(document).ready(function(){$("input.autocompleteOff").attr("autocomplete","off");});
et utilisez la classe autocompleteOff où vous voulez:
<input type="text" name="fieldName" id="fieldId" class="firstCSSClass otherCSSClass autocompleteOff" />
si vous voulez que toutes vos entrées soient autocomplete=off
, vous pouvez simplement utiliser cela:
$(document).ready(function(){$("input").attr("autocomplete","off");});
une autre façon - qui aidera aussi avec la sécurité est d'appeler la boîte d'entrée quelque chose de différent chaque fois que vous l'affichez: tout comme un captha. De cette façon, la session peut lire les entrées uniques seulement et Auto-remplir n'a rien à faire.
juste un point concernant la question de rmeador de savoir si vous devez interférer avec l'expérience du navigateur: nous développons des systèmes de gestion des contacts et de CRM, et lorsque vous tapez des données d'autres personnes dans un formulaire vous ne voulez suggérant constamment vos propres détails.
cela fonctionne pour nos besoins, mais alors nous avons le luxe de dire aux utilisateurs d'obtenir un navigateur décent:)
autocomplete='off'
autocomplete="off"
cela devrait corriger le problème pour tous les navigateurs modernes.
<form name="form1" id="form1" method="post" autocomplete="off"
action="http://www.example.com/form.cgi">
[...]
</form>
dans les versions actuelles des navigateurs Gecko, l'attribut autocomplete fonctionne parfaitement. Pour les versions précédentes, en remontant à Netscape 6.2, il a fonctionné avec l'exception pour les formulaires avec "adresse" et" nom
mise à Jour
dans certains cas, le navigateur continuera de suggérer des valeurs d'autocomplétion même si le l'attribut autocomplete est défini à off. Ce comportement inattendu peut être assez déroutant pour les développeurs. L'astuce pour vraiment forcer la non-autocompletion est de assigner une chaîne aléatoire à l'attribut , par exemple:
autocomplete="nope"
Puisque cette valeur aléatoire n'est pas un valid one
, le navigateur va donner.
L'utilisation d'un attribut aléatoire "name" fonctionne pour moi.
j'ai réinitialisé l'attribut name lors de l'envoi du formulaire pour que vous puissiez toujours y accéder par nom lors de l'envoi du formulaire. (en utilisant l'attribut id pour stocker le nom)
notez qu'il y a une certaine confusion quant à l'emplacement de l'attribut autocomplete. Il peut être appliqué soit à la balise complète du formulaire, soit aux balises d'entrée individuelles, et cela n'a pas vraiment été standardisé avant HTML5 (qui autorise explicitement à la fois ). Plus anciens docs plus notamment ce Mozilla article ne mentionne étiquette de forme. En même temps, certains scanners de sécurité ne chercheront autocomplete dans la balise D'entrée et se plaindre si elle est manquante (même si elle est dans la forme de parent). Une analyse plus détaillée de ce mess est publiée ici: Confusion au sujet des attributs AUTOCOMPLETE=OFF dans les formulaires HTML .
pas idéal, mais vous pouvez changer l'id et le nom de la boîte de texte à chaque fois que vous le rendez - vous-vous devez suivre le côté du serveur it trop afin que vous puissiez obtenir les données.
Je ne sais pas si cela va marcher ou pas, était juste une pensée.
je pense qu'il y a un moyen plus simple. Créez une entrée cachée avec un nom aléatoire (via javascript) et définissez le nom d'utilisateur à cela. Répéter l'opération avec le mot de passe. De cette façon, votre script d'arrière-plan sait exactement quel est le nom du champ approprié, tout en gardant autocomplete dans l'obscurité.
j'ai probablement tort, mais c'est juste une idée.
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”);
}
}
}
Valide la saisie semi-automatique off
<script type="text/javascript">
/* <![CDATA[ */
document.write('<input type="text" id="cardNumber" name="cardNumber" autocom'+'plete="off"/>');
/* ]]> */
</script>