Chrome ignore la saisie semi-automatique = "désactivé"

445

J'ai créé une application Web qui utilise une liste déroulante de balises. Cela fonctionne très bien dans tous les navigateurs, à l'exception du navigateur Chrome (version 21.0.1180.89).

Malgré les inputchamps ET le formchamp ayant l' autocomplete="off"attribut, Chrome insiste pour afficher un historique déroulant des entrées précédentes pour le champ, ce qui efface la liste des balises.

Mr Fett
la source
10
Techniquement, cette question a été posée environ 5 mois avant celle référencée "Cette question a déjà une réponse ici". Celui-ci est le double tel qu'il est venu après celui-ci.
user3071434

Réponses:

318

MISE À JOUR

Il semble maintenant que Chrome ignore les attributs style="display: none;"or style="visibility: hidden;.

Vous pouvez le changer en quelque chose comme:

<input style="opacity: 0;position: absolute;">
<input type="password" style="opacity: 0;position: absolute;">

D'après mon expérience, Chrome ne complète automatiquement que la première <input type="password">et la précédente <input>. J'ai donc ajouté:

<input style="display:none">
<input type="password" style="display:none">

Au sommet de <form>l'affaire et l'affaire a été résolue.

Diogo Cid
la source
54
cela ne fonctionne plus chrome 40 ne fonctionne pas cette solution
user881703
8
Non seulement c'est moche, mais je ne trouve toujours pas d'explication à la question Pourquoi ??
Augustin Riedinger
4
Il semble que Chrome les ignore maintenant en cas d'affichage: aucun n'est utilisé, j'ai donc déplacé les champs hors de la vue avec un positionnement absolu ...
Christoph Leiter
2
display: none;disparaîtra l'élément, rien sur la saisie semi-automatique.
Sandun Perera
277

Empêcher la saisie semi-automatique du nom d'utilisateur (ou e-mail) et du mot de passe:

<input type="email" name="email"><!-- Can be type="text" -->
<input type="password" name="password" autocomplete="new-password">

Empêcher la saisie semi-automatique d'un champ ( peut ne pas fonctionner ):

<input type="text" name="field" autocomplete="nope">

Explication:

autocompletefonctionne toujours sur un <input>malgré avoir autocomplete="off", mais vous pouvez changer offpour une chaîne aléatoire, comme nope.


Autres "solutions" pour désactiver la saisie semi-automatique d'un champ (ce n'est pas la bonne façon de le faire, mais ça marche):

1.

HTML:

<input type="password" id="some_id" autocomplete="new-password">

JS (onload):

(function() {
    var some_id = document.getElementById('some_id');
    some_id.type = 'text';
    some_id.removeAttribute('autocomplete');
})();

ou en utilisant jQuery:

$(document).ready(function() {
    var some_id = $('#some_id');
    some_id.prop('type', 'text');
    some_id.removeAttr('autocomplete');
});

2.

HTML:

<form id="form"></form>

JS (onload):

(function() {
    var input = document.createElement('INPUT');
    input.type = 'text';
    document.getElementById('form').appendChild(input);
})();

ou en utilisant jQuery:

$(document).ready(function() {
    $('<input>', {
        type: 'text'
    }).appendTo($('#form'));
});

Pour ajouter plusieurs champs à l'aide de jQuery:

function addField(label) {
  var div = $('<div>');
  var input = $('<input>', {
    type: 'text'
  });
  
  if(label) {
    var label = $('<label>', {
      text: label
    });
    
    label.append(input);
    div.append(label);    
  } else {
    div.append(input);    
  }  
  
  div.appendTo($('#form'));
}

$(document).ready(function() {
  addField();
  addField('Field 1: ');  
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form id="form"></form>


Travaille dans:

  • Chrome: 49+

  • Firefox: 44+

Cava
la source
Il n'y a pas de code, comment votre réponse empêche-t-elle réellement la saisie semi-automatique si la saisie semi-automatique = "" est supposée accepter un booléen
Tallboy
autocomplete = "nouveau-mot de passe" lorsqu'il est affecté au champ de mot de passe, a fonctionné pour moi en chrome. autocomplete = "off" sur le formulaire ne l'a pas fait.
Second2None
2
Le plus important (et la seule chose qui a fonctionné pour moi) était de s'assurer absolument que votre propriété ID et Nom de votre champ <input> ne contenait pas "Nom d'utilisateur" ou "Mot de passe". Cela a effectivement arrêté toute saisie semi-automatique pour moi sur autocomplete = "off".
GONeale
new-passwordest une bonne prise pour toute entrée cachée qui n'est en fait pas un mot de passe, merci
antongorodezkiy
Lol a autocomplete="nope"réellement fonctionné pour moi, sauf si je l'ajoute à mes deux champs de formulaire. Comme je peux l'avoir sur l'un ou l'autre champ, puis ce champ ne sera pas rempli automatiquement, mais l'autre champ sera toujours rempli automatiquement, mais dès que je le mettrai sur les deux champs, les deux recommenceront la saisie automatique.
PrintlnParams
147

Il semble que Chrome ignore maintenant, autocomplete="off"sauf s'il se trouve sur la <form autocomplete="off">balise.

crème glacée
la source
Pour React, utilisez «autoComplete = off».
zero_cool
Pour une explication des raisons pour lesquelles Chrome a apporté cette modification, consultez cette réponse: stackoverflow.com/a/39689037/1766230 - Ils donnent la priorité aux utilisateurs par rapport aux développeurs.
Luke
13
Si vous souhaitez fournir à l'équipe Chrome des raisons valables d'utiliser autocomplete = "off", veuillez le faire ici: bugs.chromium.org/p/chromium/issues/detail?id=587466
Chris
@Digggid Chrome 71 n'ignore pas l'attribut, mais dans certains cas, il ignore la valeur "off". Utiliser une valeur comme "country" fonctionne toujours pour moi.
Burak
1
Juste une clarification sur ce qui précède car il y a des rapports contradictoires. Sur la balise de formulaire, ajoutez autocomplete = "off" et sur les balises d'entrée individuelles, ajoutez autocomplete = "new-password". Fonctionne à partir de Chrome 75
AndyP9
83

Approche moderne

Faites simplement votre entrée readonly, et sur le focus, supprimez-la. Il s'agit d'une approche très simple et les navigateurs ne rempliront pas les readonlyentrées. Par conséquent, cette méthode est acceptée et ne sera jamais remplacée par les futures mises à jour du navigateur.

<input type="text" onfocus="this.removeAttribute('readonly');" readonly />

La partie suivante est facultative. Donnez un style à votre entrée en conséquence afin qu'elle ne ressemble pas à une readonlyentrée.

input[readonly] {
     cursor: text;
     background-color: #fff;
}

EXEMPLE DE TRAVAIL

Fizzix
la source
50
@Basit - Et c'est pourquoi je l'ai appelé a modern approach. Moins de 1% des utilisateurs dans le monde ont désactivé Javascript. Donc, honnêtement, cela ne vaut la peine de temps pour personne pour un public aussi restreint quand une grande majorité de sites Web s'appuient sur Javascript. Je développe des sites Web depuis très longtemps maintenant, et 100% de mes sites utilisent Javascript et en dépendent fortement. Si les utilisateurs ont désactivé Javascript, c'est leur propre problème et choix, pas le mien. Ils ne seront pas en mesure de visiter ou d'utiliser au moins 90% des sites Web en ligne sans que cela soit désactivé ... Votre vote négatif est complètement hors de propos.
Fizzix
19
Cela ne fonctionne pas aujourd'hui en 49. Les "développeurs" de Chrome surveillent les solutions stackoverflow et les suppriment.
puchu
7
Cette réponse de septembre 2015 est essentiellement une copie de la réponse de novembre 2014 ci-dessous.
dsuess
5
2019 - ne fonctionne pas.
user2060451
1
Cela briserait les lecteurs d'écran
Greg
80

Pour une solution de contournement fiable, vous pouvez ajouter ce code à votre page de mise en page:

<div style="display: none;">
 <input type="text" id="PreventChromeAutocomplete" 
  name="PreventChromeAutocomplete" autocomplete="address-level4" />
</div>

Chrome respecte la saisie semi-automatique = désactivée uniquement lorsqu'il existe au moins un autre élément d'entrée dans le formulaire avec une autre valeur de saisie semi-automatique.

Cela ne fonctionnera pas avec les champs de mot de passe - ceux-ci sont traités très différemment dans Chrome. Voir https://code.google.com/p/chromium/issues/detail?id=468153 pour plus de détails.

MISE À JOUR: Bug corrigé comme "ne sera pas corrigé" par l'équipe Chromium le 11 mars 2016. Voir le dernier commentaire dans mon rapport de bug initialement déposé , pour une explication complète. TL; DR: utilisez des attributs sémantiques de saisie semi-automatique tels que autocomplete = "new-street-address" pour éviter que Chrome ne remplisse automatiquement.

JT Taylor
la source
2
@Jonathan Cowley-Thom: essayez ces pages de test que j'ai mises en place contenant ma solution de contournement. Sur hub.securevideo.com/Support/AutocompleteOn , vous devriez voir des suggestions de saisie semi-automatique de Chrome. Ensuite, essayez les mêmes entrées sur hub.securevideo.com/Support/AutocompleteOff . Vous ne devriez pas voir les suggestions de saisie semi-automatique de Chrome. Je viens de tester cela sur Chrome 45.0.2454.101m et 46.0.2490.71m, et cela a fonctionné comme prévu sur les deux.
JT Taylor
Encore une mise à jour à ce sujet: je viens de recevoir une notification de l'équipe Chrome que cela a été corrigé. Donc, espérons que cette solution de contournement ne sera très bientôt plus nécessaire!
JT Taylor
Voir mon article ci-dessus: "Cela ne fonctionnera pas avec les champs de mot de passe - ceux-ci sont traités très différemment dans Chrome. Voir code.google.com/p/chromium/issues/detail?id=468153 pour plus de détails."
JT Taylor
46

Eh bien, un peu tard pour la fête, mais il semble qu'il y ait un peu de malentendu sur la façon dont cela autocompletedevrait et ne devrait pas fonctionner. Selon les spécifications HTML, l'agent utilisateur (dans ce cas, Chrome) peut remplacer autocomplete:

https://www.w3.org/TR/html5/forms.html#autofilling-form-controls:-the-autocomplete-attribute

Un agent utilisateur peut permettre à l'utilisateur de remplacer le nom du champ de remplissage automatique d'un élément, par exemple de le changer de "off" à "on" pour permettre aux valeurs d'être mémorisées et préremplies malgré les objections de l'auteur de la page, ou de toujours "off", sans jamais se souvenir valeurs. Cependant, les agents utilisateurs ne doivent pas permettre aux utilisateurs de remplacer de manière triviale le nom du champ de remplissage automatique de "off" par "on" ou d'autres valeurs, car il y a des implications de sécurité importantes pour l'utilisateur si toutes les valeurs sont toujours mémorisées, quelles que soient les préférences du site.

Donc, dans le cas de Chrome, les développeurs ont essentiellement dit "nous laisserons à l'utilisateur le soin de décider dans ses préférences s'il veut autocompletetravailler ou non. Si vous ne le voulez pas, ne l'activez pas dans votre navigateur" .

Cependant, il semble que ce soit un peu trop zélé de leur part à mon goût, mais c'est comme ça. La spécification discute également des implications potentielles pour la sécurité d'un tel mouvement:

Le mot-clé "off" indique soit que les données d'entrée du contrôle sont particulièrement sensibles (par exemple le code d'activation d'une arme nucléaire); ou qu'il s'agit d'une valeur qui ne sera jamais réutilisée (par exemple une clé unique pour une connexion bancaire) et l'utilisateur devra donc saisir explicitement les données à chaque fois, au lieu de pouvoir compter sur l'UA pour le pré-remplissage la valeur pour lui; ou que le document fournit son propre mécanisme de saisie semi-automatique et ne souhaite pas que l'agent utilisateur fournisse des valeurs de saisie semi-automatique.

Donc, après avoir vécu la même frustration que tout le monde, j'ai trouvé une solution qui fonctionne pour moi. Il est similaire dans la veine à laautocomplete="false" réponses.

Un article Mozilla parle exactement de ce problème:

https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion

Dans certains cas, le navigateur continuera de suggérer des valeurs de saisie semi-automatique même si l'attribut de saisie semi-automatique est désactivé. Ce comportement inattendu peut être assez déroutant pour les développeurs. L'astuce pour forcer vraiment le non-achèvement est d'attribuer une chaîne aléatoire à l'attribut

Le code suivant devrait donc fonctionner:

autocomplete="nope"

Et il en va de même pour chacun des éléments suivants:

autocomplete="false"
autocomplete="foo"
autocomplete="bar"

Le problème que je vois est que l'agent de navigateur pourrait être assez intelligent pour apprendre l' autocompleteattribut et l'appliquer la prochaine fois qu'il verra le formulaire. S'il le fait, la seule façon dont je peux voir pour contourner le problème serait de changer dynamiquement leautocomplete valeur d'attribut lorsque la page est générée.

Un point à noter est que de nombreux navigateurs ignoreront les autocompleteparamètres des champs de connexion (nom d'utilisateur et mot de passe). Comme l'indique l'article de Mozilla:

Pour cette raison, de nombreux navigateurs modernes ne prennent pas en charge autocomplete = "off" pour les champs de connexion.

  • Si un site définit autocomplete = "off" pour un formulaire et que le formulaire comprend des champs de saisie de nom d'utilisateur et de mot de passe, le navigateur proposera toujours de se souvenir de cette connexion, et si l'utilisateur accepte, le navigateur remplira automatiquement ces champs la prochaine fois que le l'utilisateur visite cette page.
  • Si un site définit autocomplete = "off" pour les champs de saisie du nom d'utilisateur et du mot de passe, le navigateur proposera toujours de se souvenir de cette connexion, et si l'utilisateur accepte, le navigateur remplira automatiquement ces champs la prochaine fois que l'utilisateur visitera cette page.

C'est le comportement de Firefox (depuis la version 38), Google Chrome (depuis la 34) et Internet Explorer (depuis la version 11).

Enfin une petite information sur l'appartenance de l'attribut à l' formélément ou à l' inputélément. La spécification a de nouveau la réponse:

Si l'attribut de saisie semi-automatique est omis, la valeur par défaut correspondant à l'état de l'attribut de saisie semi-automatique du propriétaire du formulaire de l'élément est utilisée à la place ("on" ou "off"). S'il n'y a pas de propriétaire de formulaire, la valeur "on" est utilisée.

Donc. Le mettre sur le formulaire devrait s'appliquer à tous les champs de saisie. Le mettre sur un élément individuel devrait s'appliquer à cet élément uniquement (même s'il n'y en a pas sur le formulaire). S'il autocompleten'est pas défini du tout, il est par défaut on.

Sommaire

Pour désactiver autocompletesur l'ensemble du formulaire:

<form autocomplete="off" ...>

Ou si vous avez besoin de le faire dynamiquement:

<form autocomplete="random-string" ...>

Pour désactiver autocompletesur un élément individuel (quel que soit le paramètre de formulaire présent ou non)

<input autocomplete="off" ...>

Ou si vous avez besoin de le faire dynamiquement:

<input autocomplete="random-string" ...>

Et rappelez-vous que certains agents utilisateurs peuvent remplacer même vos tentatives de désactivation les plus difficiles autocomplete.

Hooligancat
la source
1
2019 - ne fonctionne pas. Version
76.0
1
@ user2060451 - qu'est-ce qui ne fonctionne pas? Je viens de le tester dans 76.0.3809.87 sur Windows et Mac. - les deux fonctionnent selon les spécifications. comme décrit ci-dessus. Si vous pouviez fournir un peu plus de description que «ne fonctionne pas», je pourrais peut-être vous aider.
Hooligancat
1
Je viens d'essayer de donner (à partir de la console après tout chargé et de le définir côté serveur) une chaîne aléatoire pour la saisie semi-automatique de l'élément d'entrée, cela n'a pas fonctionné. Donner autocomplete = "off" à l'élément de formulaire n'a pas fonctionné non plus.
Nuryagdy Mustapayev
29

La version 34 de Chrome ignore maintenant le autocomplete=off, voyez ceci .

Beaucoup de discussions pour savoir si c'est une bonne ou une mauvaise chose? Quel est votre point de vue?

Peter Kerr
la source
7
désolé pour le downvote ... ce n'est pas un site de discussion (essayez plutôt quora), et vous ne fournissez pas de réponse. Merci pour le lien.
commonpike
25

Le navigateur ne se soucie pas de la saisie semi-automatique = désactivée ou remplit même les informations d'identification dans un mauvais champ de texte?

Je l'ai corrigé en définissant le champ de mot de passe en lecture seule et en l'activant, lorsque l'utilisateur clique dessus ou utilise la touche de tabulation de ce champ.

correction du remplissage automatique du navigateur: lecture seule et mise en écriture sur le focus (au clic de la souris et tabulation dans les champs)

 <input type="password" readonly  
     onfocus="$(this).removeAttr('readonly');"/>

Mise à jour: Mobile Safari place le curseur dans le champ, mais n'affiche pas le clavier virtuel. Le nouveau correctif fonctionne comme avant mais gère le clavier virtuel:

<input id="email" readonly type="email" onfocus="if (this.hasAttribute('readonly')) {
    this.removeAttribute('readonly');
    // fix for mobile safari to show virtual keyboard
    this.blur();    this.focus();  }" />

Démo en direct https://jsfiddle.net/danielsuess/n0scguv6/

// UpdateEnd

Au fait, plus d'informations sur mon observation:

Parfois, je remarque ce comportement étrange sur Chrome et Safari, quand il y a des champs de mot de passe sous la même forme. Je suppose que le navigateur recherche un champ de mot de passe pour insérer vos informations d'identification enregistrées. Ensuite, il remplit automatiquement le nom d'utilisateur dans le champ de saisie de texte le plus proche, qui apparaît avant le champ de mot de passe dans DOM (deviner simplement en raison de l'observation). Comme le navigateur est la dernière instance et que vous ne pouvez pas le contrôler, parfois même la saisie semi-automatique = off n'empêcherait pas de remplir les informations d'identification dans des champs incorrects, mais pas le champ utilisateur ou surnom.

dsuess
la source
2
plutôt que d'utiliser onfocus, j'utilise un setTimeout pour effacer la lecture seule, afin que mes utilisateurs ne voient pas l'entrée en lecture seule et ne la concentrent jamais!
Hippyjim
23

Vous pouvez utiliser autocomplete="new-password"

<input type="email" name="email">
<input type="password" name="password" autocomplete="new-password">

Travaille dans:

  • Chrome: 53, 54, 55
  • Firefox: 48, 49, 50
Steffi
la source
Cela ne peut pas fonctionner, car la chaîne de saisie semi-automatique est fixe. Les navigateurs se souviendront du nouveau mot de passe pour la prochaine fois.
étape
23

TL; DR: dites à Chrome qu'il s'agit d'une nouvelle entrée de mot de passe et qu'elle ne fournira pas d'anciennes suggestions de saisie semi-automatique:

<input type="password" name="password" autocomplete="new-password">

autocomplete="off" ne fonctionne pas en raison d'une décision de conception - de nombreuses recherches montrent que les utilisateurs ont beaucoup plus de temps et plus à pirater les mots de passe s'ils peuvent les stocker dans un navigateur ou un gestionnaire de mots de passe.

La spécification de autocomplete a changé et prend désormais en charge diverses valeurs pour faciliter la saisie automatique des formulaires de connexion:

<!-- Auto fills with the username for the site, even though it's email format -->
<input type="email" name="email" autocomplete="username">

<!-- current-password will populate for the matched username input  -->
<input type="password" autocomplete="current-password" />

Si vous ne fournissez pas ces Chrome essaie toujours de deviner, et quand il le fait, il ignore autocomplete="off".

La solution est que des autocompletevaleurs existent également pour les formulaires de réinitialisation de mot de passe:

<label>Enter your old password:
    <input type="password" autocomplete="current-password" name="pass-old" />
</label>
<label>Enter your new password:
    <input type="password" autocomplete="new-password" name="pass-new" />
</label>
<label>Please repeat it to be sure:
    <input type="password" autocomplete="new-password" name="pass-repeat" />
</label>

Vous pouvez utiliser ce autocomplete="new-password"drapeau pour dire à Chrome de ne pas deviner le mot de passe, même s'il en a un stocké pour ce site.

Chrome peut également gérer les mots de passe des sites directement à l'aide de l' API d'informations d'identification , qui est une norme et aura probablement un support universel à terme.

Keith
la source
5
Pas une raison vraiment convaincante. Le fait que l'utilisateur veuille quelque chose ne signifie pas que c'est une idée intelligente. C'est presque aussi mauvais que de dire que vous autoriserez les mots de passe à un seul caractère dans votre application, car l'utilisateur le trouve plus pratique. Parfois, la sécurité l'emporte sur la commodité ...
Daniel Kotin
J'ai un champ appelé "ContactNoAlt" que Chrome insiste pour remplir avec une adresse e-mail. L'activation / la désactivation de la saisie semi-automatique est préférable, mais une solution de contournement est nécessaire au niveau pratique car Chrome est défaillant. Plus précisément, la saisie semi-automatique = "off" est une norme - donc ce qui rend les développeurs de Chrome si bons qu'ils sentent qu'ils peuvent ignorer les normes - peut-être qu'un jour Chrome décidera qu'un autre morceau de HTML n'est pas pratique ... (cela commence se sentir comme IE5 / 6 de-ja-vu)
dunxz
Je suis un utilisateur Chrome et je ne souhaite pas ce comportement. Il ne m'a même pas demandé avant de remplir automatiquement la boîte de mot de passe qui apparaissait pour m'assurer que je pouvais seulement accéder à l'application Web concernée. L'enregistrement de certains mots de passe ne doit pas signifier la saisie automatique de tous les mots de passe.
Hippyjim
3
Cette réponse (et le comportement de Google) ignorent le fait que l'une des principales raisons pour lesquelles vous pouvez le faire est d'implémenter vos propres comportements de saisie semi-automatique (par exemple, la liste à partir de la base de données).
squarelogic.hayden
vous essayez de défendre une décision clairement mauvaise prise par le chrome. Je mets en œuvre la politique de l'entreprise que je ne peux pas changer. Alors maintenant, je dois insérer des hacks pour Chrome. Ils travaillent actuellement. S'ils cessent de fonctionner, notre entreprise changera le navigateur par défaut pour les employés. Alors maintenant, nous avons le même comportement mais avec des hacks et éventuellement des pages cassées dans les futures mises à niveau. Et en voyant toutes ces réponses ici, beaucoup de développeurs utilisent ces hacks. Chrome bien fait.
Claudiu Creanga
23

J'ai résolu le combat sans fin avec Google Chrome avec l'utilisation de caractères aléatoires. Lorsque vous effectuez toujours un rendu de saisie semi-automatique avec une chaîne aléatoire, il ne se souviendra de rien.

<input name="name" type="text" autocomplete="rutjfkde">

J'espère que cela aidera d'autres personnes.

étape
la source
12

Autocomplete="Off" ne fonctionne plus.

Essayez d'utiliser uniquement une chaîne aléatoire au lieu de "Off" , par exempleAutocomplete="NoAutocomplete"

J'espère que ça aide.

marco burrometo
la source
5
Ne fonctionne pas dans Chrome 73
just_user
10

Vu chrome ignorer le autocomplete="off" , je le résous d'une manière stupide qui utilise la "fausse entrée" pour tromper le chrome pour le remplir au lieu de remplir le "vrai".

Exemple:

<input type="text" name="username" style="display:none" value="fake input" /> 
<input type="text" name="username" value="real input"/>

Chrome remplira la «fausse entrée» et, lors de la soumission, le serveur prendra la valeur de la «vraie entrée».

Chang
la source
10

Je poste cette réponse pour apporter une solution mise à jour à ce problème. J'utilise actuellement Chrome 49 et aucune réponse donnée ne fonctionne pour celui-ci. Je recherche également une solution fonctionnant avec d'autres navigateurs et versions précédentes.

Mettez ce code au début de votre formulaire

<div style="display: none;">
    <input type="text" autocomplete="new-password">
    <input type="password" autocomplete="new-password">
</div>

Ensuite, pour votre véritable champ de mot de passe, utilisez

<input type="password" name="password" autocomplete="new-password">

Commentez cette réponse si cela ne fonctionne plus ou si vous rencontrez un problème avec un autre navigateur ou une autre version.

Approuvé le:

  • Chrome: 49
  • Firefox: 44, 45
  • Bord: 25
  • Internet Explorer: 11
Loenix
la source
1
Malheureusement, la version Chrome 49.0.2623.87 et cela ne fonctionne pas pour TextBox, je vois toujours la saisie semi-automatique apparaître.
eYe
8

à tous ceux qui recherchent une solution à cela, je le trouve enfin.

Chrome n'obéit à la saisie semi-automatique = "off" que si la page est une page HTML5 (j'utilisais XHTML).

J'ai converti ma page en HTML5 et le problème a disparu (facepalm).

Mr Fett
la source
6

Remplacez l'attribut de type d'entrée par type="search" .

Google n'applique pas le remplissage automatique aux entrées avec un type de recherche.

Matas Vaitkevicius
la source
1
Je vais downvote: testé sur chrome 60: cela n'empêche pas la saisie semi-automatique ..
boly38
6

Jusqu'à la semaine dernière, les deux solutions ci-dessous semblaient fonctionner pour Chrome, IE et Firefox. Mais avec la sortie de la version 48 de Chrome (et toujours en 49), ils ne fonctionnent plus:

  1. Les éléments suivants en haut du formulaire:
<input style="display:none" type="text" name="fakeUsername"/>
<input style="display:none" type="password" name="fakePassword"/>
  1. Les éléments suivants dans l'élément d'entrée de mot de passe:

    autocomplete = "off"

Donc, pour résoudre ce problème rapidement, j'ai d'abord essayé d'utiliser un hack majeur en définissant initialement l'élément d'entrée de mot de passe sur désactivé, puis j'ai utilisé un setTimeout dans la fonction de document prêt pour le réactiver.

setTimeout(function(){$('#PasswordData').prop('disabled', false);}, 50);

Mais cela semblait si fou et j'ai fait plus de recherches et trouvé la réponse @tibalts dans Désactiver le remplissage automatique de Chrome . Sa réponse est d'utiliser autocomplete = "new-password" dans l'entrée des mots de passe et cela semble fonctionner sur tous les navigateurs (j'ai conservé mon correctif numéro 1 ci-dessus à ce stade).

Voici le lien dans la discussion des développeurs Google Chrome: https://code.google.com/p/chromium/issues/detail?id=370363#c7

prajna
la source
@JorgeSampayo Fonctionne uniquement sur les entrées de mot de passe mais pas sur les entrées de texte.
eYe
6

autocomplete=off est largement ignoré dans les navigateurs modernes - principalement en raison des gestionnaires de mots de passe, etc.

Vous pouvez essayer d'ajouter ceci, autocomplete="new-password"il n'est pas entièrement pris en charge par tous les navigateurs, mais cela fonctionne sur certains

Mahdi Afzal
la source
6

autocomplete="off"fonctionne généralement, mais pas toujours. Cela dépend namedu champ de saisie. Des noms comme "adresse", "e-mail", "nom" - seront complétés automatiquement (les navigateurs pensent qu'ils aident les utilisateurs), lorsque des champs comme "code", "pin" - ne seront pas complétés automatiquement (s'il autocomplete="off"est défini)

Mes problèmes étaient - la saisie semi-automatique dérangeait l' aide de l'adresse Google

Je l'ai corrigé en le renommant

de

<input type="text" name="address" autocomplete="off">

à

<input type="text" name="the_address" autocomplete="off">

Testé en chrome 71.

Yevgeniy Afanasyev
la source
1
Je pense que c'est la dernière façon de supprimer la saisie semi-automatique. travailler en 2020 mai sur chrome 81
NIKHIL CM
5

Je ne sais pas pourquoi cela a fonctionné dans mon cas, mais sur Chrome, j'ai utilisé autocomplete="none"et Chrome a cessé de suggérer des adresses pour mon champ de texte.

Chris Sprague
la source
4

À partir de Chrome 42, aucune des solutions / hacks de ce fil (à partir de 2015-05-21T12:50:23+00:00) ne fonctionne pour désactiver la saisie semi-automatique pour un champ individuel ou le formulaire entier.

EDIT: J'ai constaté que vous n'avez en fait besoin d'insérer qu'un seul champ de courriel factice dans votre formulaire (vous pouvez le masquer avec display: none) avant les autres champs pour empêcher la saisie semi-automatique. Je suppose que Chrome stocke une sorte de signature de formulaire avec chaque champ rempli automatiquement et l'inclusion d'un autre champ de courrier électronique corrompt cette signature et empêche la saisie semi-automatique.

<form action="/login" method="post">
    <input type="email" name="fake_email" style="display:none" aria-hidden="true">
    <input type="email" name="email">
    <input type="password" name="password">
    <input type="submit">
</form>

La bonne nouvelle est que puisque la "signature de formulaire" est corrompue par cela, aucun des champs n'est rempli automatiquement, donc aucun JS n'est nécessaire pour effacer les faux champs avant la soumission.

Ancienne réponse:

La seule chose que j'ai trouvée encore viable est d'insérer deux champs fictifs de type email et mot de passe avant les vrais champs. Vous pouvez les configurer display: nonepour les cacher (ce n'est pas assez intelligent pour ignorer ces champs):

<form action="/login" method="post">
    <input type="email" name="fake_email" style="display:none" aria-hidden="true">
    <input type="password" name="fake_password" style="display:none" aria-hidden="true">
    <input type="email" name="email">
    <input type="password" name="password">
    <input type="submit">
</form>

Malheureusement, les champs doivent être dans votre formulaire (sinon les deux ensembles d'entrées sont remplis automatiquement). Donc, pour que les faux champs soient vraiment ignorés, vous aurez besoin de JS à exécuter sur le formulaire de soumission pour les effacer:

form.addEventListener('submit', function() {
    form.elements['fake_email'].value = '';
    form.elements['fake_password'].value = '';
});

Notez ci-dessus que la suppression de la valeur avec Javascript fonctionne pour remplacer la saisie semi-automatique. Donc, si perdre le bon comportement avec JS désactivé est acceptable, vous pouvez simplifier tout cela avec un "polyfill" de saisie semi-automatique JS pour Chrome:

(function(document) {

    function polyfillAutocomplete(nodes) {

        for(var i = 0, length = nodes.length; i < length; i++) {

            if(nodes[i].getAttribute('autocomplete') === 'off') {

                nodes[i].value = '';
            }
        }
    }

    setTimeout(function() {

        polyfillAutocomplete(document.getElementsByTagName('input'));
        polyfillAutocomplete(document.getElementsByTagName('textarea'));

    }, 1);

})(window.document);
Bailey Parker
la source
4

J'ai eu un problème similaire où le champ de saisie prenait un nom ou un e-mail. J'ai mis autocomplete = "off" mais Chrome a quand même forcé les suggestions. Il s'avère que c'est parce que le texte de l'espace réservé contenait les mots «nom» et «e-mail».

Par exemple

<input type="text" placeholder="name or email" autocomplete="off" />

Je l'ai contourné en mettant un espace de largeur nulle dans les mots de l'espace réservé. Plus de saisie semi-automatique de Chrome.

<input type="text" placeholder="nam&#8203;e or emai&#8203;l" autocomplete="off" />
WDuffy
la source
4

Dans Chrome 48+, utilisez cette solution:

  1. Mettez les faux champs avant les vrais champs:

    <form autocomplete="off">
      <input name="fake_email"    class="visually-hidden" type="text">
      <input name="fake_password" class="visually-hidden" type="password">
    
      <input autocomplete="off" name="email"    type="text">
      <input autocomplete="off" name="password" type="password">
    </form>
  2. Masquer les faux champs:

    .visually-hidden {
      margin: -1px;
      padding: 0;
      width: 1px;
      height: 1px;
      overflow: hidden;
      clip: rect(0 0 0 0);
      clip: rect(0, 0, 0, 0);
      position: absolute;
    }
  3. Tu l'as fait!

Cela fonctionnera également pour les anciennes versions.

yivo
la source
@yivo On dirait que la seule différence entre urs et og answer est les balises! important, donc je les ai ajoutées, mais ça ne fonctionne toujours pas. dropbox.com/s/24yaz6ut7ygkoql/…
Mike Purcell
@MikePurcell Vous n'avez pas autocomplete="off"sur le formtag. Essayez également de mettre de fausses entrées immédiatement après la formbalise.
yivo
@Yivo: J'ai essayé vos suggestions, cela a bien fonctionné pour le champ de courrier électronique, mais la liste déroulante de remplissage automatique se produit toujours pour le champ de mot de passe. dropbox.com/s/5pm5hjtx1s7eqt3/…
Mike Purcell
3

Après le chrome v.34, la définition autocomplete="off"de la <form>balise ne fonctionne pas

J'ai fait les changements pour éviter ce comportement ennuyeux:

  1. Supprimer le nameet le idde l'entrée de mot de passe
  2. Mettez une classe dans l'entrée (ex .: passwordInput)

(Jusqu'à présent, Chrome ne mettra pas le mot de passe enregistré sur l'entrée, mais le formulaire est maintenant cassé)

Enfin, pour faire fonctionner le formulaire, exécutez ce code lorsque l'utilisateur clique sur le bouton Soumettre, ou chaque fois que vous souhaitez déclencher la soumission du formulaire:

var sI = $(".passwordInput")[0];
$(sI).attr("id", "password");
$(sI).attr("name", "password");

Dans mon cas, j'avais l'habitude de id="password" name="password"saisir le mot de passe, donc je les remets avant de déclencher la soumission.

Renato Lochetti
la source
3

Après avoir essayé toutes les solutions, voici ce qui semble fonctionner pour la version chrome: 45, avec formulaire ayant un champ de mot de passe:

 jQuery('document').ready(function(){
        //For disabling Chrome Autocomplete
        jQuery( ":text" ).attr('autocomplete','pre'+Math.random(0,100000000));
 });
anshuman
la source
3

Je viens de passer à Chrome 49 et la solution de Diogo Cid ne fonctionne plus.

J'ai fait une solution de contournement différente en masquant et en supprimant les champs au moment de l'exécution après le chargement de la page.

Chrome ignore désormais la solution de contournement d'origine en appliquant les informations d'identification au premier champ affiché type="password" et à son type="text"champ précédent , j'ai donc masqué les deux champs à l'aide de CSS visibility: hidden;

<!-- HTML -->
<form>
    <!-- Fake fields -->
    <input class="chromeHack-autocomplete">
    <input type="password" class="chromeHack-autocomplete">

    <input type="text" placeholder="e-mail" autocomplete="off" />
    <input type="password" placeholder="Password" autocomplete="off" />
</form>

<!-- CSS -->
.chromeHack-autocomplete {
    height: 0px !important;
    width: 0px !important;
    opacity: 0 !important;
    padding: 0 !important; margin: 0 !important;
}

<!--JavaScript (jQuery) -->
jQuery(window).load(function() {
    $(".chromeHack-autocomplete").delay(100).hide(0, function() {
        $(this).remove();
    });
});

Je sais que ça peut sembler pas très élégant mais ça marche.

Cliff Burton
la source
2

j'ai trouvé cette solution la plus appropriée:

function clearChromeAutocomplete()
{
// not possible, let's try: 
if (navigator.userAgent.toLowerCase().indexOf('chrome') >= 0) 
{
document.getElementById('adminForm').setAttribute('autocomplete', 'off'); 
setTimeout(function () {
        document.getElementById('adminForm').setAttribute('autocomplete', 'on'); 
}, 1500);
}
}

Il doit être chargé après que dom soit prêt ou après le rendu du formulaire.

user2241415
la source
2

Bien que j'accepte la saisie semi-automatique devrait être un choix de l'utilisateur, il y a des moments où Chrome est trop zélé avec cela (d'autres navigateurs peuvent l'être aussi). Par exemple, un champ de mot de passe avec un nom différent est toujours rempli automatiquement avec un mot de passe enregistré et le champ précédent rempli avec le nom d'utilisateur. Cela craint particulièrement lorsque le formulaire est un formulaire de gestion des utilisateurs pour une application Web et que vous ne souhaitez pas que le remplissage automatique le remplisse avec vos propres informations d'identification.

Chrome ignore complètement la saisie semi-automatique = "off" maintenant. Alors que les hacks JS peuvent bien fonctionner, j'ai trouvé un moyen simple qui fonctionne au moment de la rédaction:

Définissez la valeur du champ de mot de passe sur le caractère de contrôle 8 ( "\x08"en PHP ou&#8; en HTML). Cela empêche Chrome de remplir automatiquement le champ car il a une valeur, mais aucune valeur réelle n'est entrée car il s'agit du caractère de retour arrière.

Oui, c'est toujours un hack, mais ça marche pour moi. YMMV.

spikyjt
la source
Ne semble pas fonctionner dans Chrome 40
hotte
Je pense qu'ils ont récupéré ce hack et ignoré les caractères de contrôle dans la valeur, il est donc évalué comme vide. Voir la réponse de @ ice-cream stackoverflow.com/a/16130452/752696 pour la solution correcte et à jour.
spikyjt
Même cas d'utilisation ici: travailler avec la gestion des utilisateurs et avoir les propres informations d'identification remplies automatiquement. Cependant, comme c'est mon propre code et que je réutilise le formpour créer de nouveaux utilisateurs et modifier les utilisateurs existants, simplement remplacer les inputvaleurs via JS a supprimé la saisie automatique.
nuala