23

I have tried using autocomplete false and also auto complete off. The cache is removed from the field, but iam still seeing chrome autofill data. Is there a way to disable chrome autofill option in angular forms? Any suggestions would be appreciated. Thanks

1

14 Answers 14

46

Please check the autocomplete="new-password":

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

It worked for me. Found in Google documentation

4
  • Thanks! It worked perfectly for me, even though I do not like that we are playing with pre-designed semantics here :-\ Commented Jul 10, 2019 at 8:26
  • 2
    Does work in Angular 8 for me @Matheno, 8.1.3 to be exact.
    – CularBytes
    Commented Nov 14, 2019 at 20:26
  • Worked in Angular 11! Thanks! Commented Mar 26, 2021 at 11:32
  • I used autocomplete="no-autocomplete-thanks" in all fields of an Angular 12 reactive form, some of them with matAutocomplete managed on my own, works perfectly fine, thanks! Commented Feb 9, 2022 at 14:16
24

The autocomplete="off" is effectively respected by Chrome, but what you're experiencing is the Chrome autofill functionality that takes over, ignoring autocomplete="off": https://developers.google.com/web/updates/2015/06/checkout-faster-with-autofill.

In the past, many developers would add autocomplete="off" to their form fields to prevent the browser from performing any kind of autocomplete functionality. While Chrome will still respect this tag for autocomplete data, it will not respect it for autofill data.

One workaround is to put an unknown value in the autocomplete, e.g. <input type="text" name="somethingAutofillDoesntKnow" autocomplete="doNotAutoComplete" />. When testing this it worked for me most of the time, but for some reason didn't work anymore afterwards.

My advise is not to fight against it and use it's potential by properly using the autocomplete attribute as explained here: https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill

6
  • Thanks, I will have a try Commented Sep 2, 2018 at 17:04
  • "not to fight against it" is a good advice indeed. If Chrome do, probably it's good feature. Thank you for sharing. Commented Mar 13, 2019 at 12:10
  • 4
    But in case of "autocomplete" field it lead to 2 panels (autofill + standard one), which is crazy. Commented Mar 19, 2019 at 16:41
  • 1
    I managed to disable autofill on Chrome by setting any meaningless value for autocomplete. For instance autocomplete="no". I also successfully tried "no", "*", "nope", "sdjlf", "!". It doesn't seem reasonable to me, but it worked.
    – Max Oriola
    Commented Apr 24, 2019 at 16:29
  • 15
    There are instances where you "need to fight against it" the perfect example is when you are an admin creating a user account for another user or an HR manager onboarding a new employee and Chrome insists on jamming all the Admin's address details etc into fields that are not actually specific to them
    – Rob
    Commented Jun 27, 2019 at 10:28
12

Through some trial and error testing, it appears that if you set the input name and autocomplete attributes to a random string, Chrome's autofill is prevented from appearing. I created a small directive to achieve this.

import { Directive, ElementRef, Renderer2, AfterViewInit } from '@angular/core';

@Directive({
  selector: '[appDisableAutofill]'
})
export class DiableAutofillDirective implements AfterViewInit {

  constructor(private readonly el: ElementRef, private readonly renderer: Renderer2) { }

  ngAfterViewInit() {
    const randomString = Math.random().toString(36).slice(-6);
    this.renderer.setAttribute(this.el.nativeElement, 'name', randomString);
    this.renderer.setAttribute(this.el.nativeElement, 'autocomplete', randomString);
  }

}
2
  • This works really well! I additionally added a simple user agent check to detect that it is in fact Chrome, so as to leave the attributes untouched in other browsers that don't have this insane autocomplete logic that Chrome uses. Edit: I'm another Marcus than the Marcus who posted this answer... :D
    – Marcus
    Commented Feb 27, 2020 at 9:50
  • not great if you are referencing form elements by name for validation
    – owlyfool
    Commented May 31, 2022 at 7:08
10

Just change your input from type TEXT to type SEARCH.

<input type="search" name="your_address" autocomplete="nope" />

Chrome fill work with text fields but it's ignored on search type.

0
7

Chrome seems to ignore all practical/clean attempts to stop this - so we need to get a little hacky. I prevented this using 2 honeypot inputs. They can NOT be "display:none" or they will get skipped. So I wrapped them in a div that's height:0; overflow:hidden; and gave them opacity 0 (just to be double sure). Your real inputs must come AFTER the honeypots. See below

<!-- honeypot prevents chrome user autofill bs-->
<div style="height:0; overflow:hidden">
    <input style="opacity:0;" type="email" value="" class="" />
    <input style="opacity:0;" type="password" value=""  class="d-" />
</div>
<!-- end honeypot -->

<!-- ... then put your real inputs after-->
<input type="email" name="email" value="" class="" />
<input type="password" name="password" value=""  class="d-" />
<!-- end honeypot -->
1
  • It worked for email but not for password
    – Analyst
    Commented Aug 3, 2022 at 7:34
3

Disabling autocompletion

To disable autocompletion in forms, you can set the autocomplete attribute to "off": You can do this either for an entire form, or for specific input elements in a form:

<form [formGroup]="exampleForm" autocomplete="off">
 ...
</form>
// or
<form [formGroup]="exampleForm">
 <div>
  <label >Credit card:</label>
  <input type="text" id="cc" name="cc" autocomplete="off">
 </div>
</form>

To Disable in Login Fields: many modern browsers do not support autocomplete="off" for login fields:

to prevent autofilling of password fields, you can use

autocomplete="new-password"
3

I had similar issue, I was not able to resolved it with any of the solution maybe because I was using third party for Google places Autocomplete ngx-google-places-autocomplete where autofill overlapping google suggested address. I was able to resolve it using focus event as shown below

<input ngx-google-places-autocomplete [options]='options' #placesRef="ngx-places" (onAddressChange)="handleAddressChange($event)"
      type="text" class="form-control"  id="address1"
        formControlName="address1" placeholder="Street address, P.O. box" required (focus)="setAutoFillOff($event)">

  setAutoFillOff(event: any) {
    if (event) {
      event.target.attributes['autocomplete'].value = 'chrome-off';
    }
  }

I am putting out this to helps who might be in similar situation.

1
  • This works but how can I set event.target.attributes of the auto complete of ngx-google-places-autocomplete before focus?
    – Ste
    Commented Dec 6, 2021 at 15:52
2

Please check the autocomplete="off webauthn"

I came up with this method after reading the documentation https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill

<input matInput type="password" formControlName="pwd" autocomplete="off webauthn">
1

TLDR; Don't label your inputs with obvious names or Chrome will pick that up and autofill the input.

I often use a form-group class to wrap my labels and inputs together, pretty common practice. So much so the only way I found to get around AutoFill in Chrome (Angular 8, Chrome v80) was to change the value of my label for the input.

Turns Off AutoFill:

<div class="form-group">
  <label for="aRandomPlace" class="form-group-label">Pickup Location</label>
  <input type="text" name="aRandomPlace" [(ngModel)]="data.address" class="form-group-input">
</div>

Does Not Turn Off AutoFill:

<div class="form-group">
 <label for="address" class="form-group-label">Pickup Address</label>
 <input type="text" name="address" [(ngModel)]="data.address" class="form-group-input">
</div>
1

Just add to all the HTML input tag which is being auto filled within a form tag as bellow:

<input type="text" class="form-control" id="inputId"
               name="inputName" autocomplete="new-inputName"  
               [(ngModel)]="model">

Note: Use "new-form_element_name" as autocomplete property as shown above.

It worked for me!!!

0

It appears that autocomplete="off" can be used directly on form tag. Useful when you have a lot of text inputs

<form [formGroup]="vmForm" autocomplete="off">
  • Google Chrome Version 78.0.3904.108
0

I believe we are discussing to disable 'autosuggestions' not 'autocomplete' "Autocomplete=off" works for the text type input field but the browser ignores it if it is password type. there are lot many suggestions to use "Autocomplete='chrome-off', 'new-password'" but these are not meant to disable autosuggestions.

for these, I prefer masking technique to mask the content.

.autocompleteOff{
   -webkit-text-security: disc;
}
<input class='autocompleteOff' type=text>

0

Usually what I do is I change type of input dynamically for example in Angular:

[type]="(field.length > 0)? 'password' : 'text'"

In this manner, the browser is unable to recognise the password field the first time you click it and will not provide a suggestion. However, if the field value has been input once and then erased, the browser will provide a suggestion. (At least it is not providing suggestion for the first time).

-2

I found the answer in documentation and it works like a charm. You can find more about it here.

    <input type="text" autocomplete="off" name="one-time-code" id="one-time-code">

Not the answer you're looking for? Browse other questions tagged or ask your own question.