Disabling Chrome Autofill
Disabling Chrome Autofill
I have been running into issues with the chrome autofill behavior on several forms.
The fields in the form all have very common and accurate names, such as "email", "name", or "password", and they also have autocomplete="off" set.
The autocomplete flag has successfully disabled the autocomplete behavior, where a dropdown of values appear as you start typing, but has not changed the values that Chrome auto-populates the fields as.
This behavior would be ok except that chrome is filling the inputs incorrectly, for example filling the phone input with an email address. Customers have complained about this, so it's verified to be happening in multiple cases, and not as some some sort of result to something that I've done locally on my machine.
The only current solution I can think of is to dynamically generate custom input names and then extract the values on the backend, but this seems like a pretty hacky way around this issue. Are there any tags or quirks that change the autofill behavior that could be used to fix this?
Answer by mike nelson for Disabling Chrome Autofill
I've just found that if you have a remembered username and password for a site, the current version of Chrome will autofill your username/email address into the field before any type=password
field. It does not care what the field is called - just assumes the field before password is going to be your username.
Old Solution
Just use
followed by:
Simply break this process by invalidating this:
Answer by Yared Rodriguez for Disabling Chrome Autofill
Finally I think I came with a decent solution. Understanding better how the dropdown works with Chrome helped :) Basically, the dropdown will be displayed when you focus the input and when you generate a mouse down event when you are typing an entry which matches with what Chrome has in memory. Keeping that in mind, and that Chrome does it for certain inputs when they have default names like "name", "email", etc. then we just need to remove the name when the dropdown is going to be displayed and add it back after :) I wanted to use a solution which can make it work just by adding the attribute autocomplete off. I thought it made sense. This is the code:
Solution 1
jQuery('body').on('mousedown','[name="name"][autocomplete="off"], [name="email"][autocomplete="off"]',function(e){ e.stopImmediatePropagation(); if(typeof this.currentName =="undefined") this.currentName=jQuery(this).attr('name'); jQuery(this).attr('name',''); }); jQuery('body').on('blur','[autocomplete="off"]',function(e){ e.stopImmediatePropagation(); jQuery(this).attr('name',this.currentName); });
Solution 2 (My Favourite One)
The solution I described above will remove the name of the input until we remove the focus (blur), in that moment it will put the original name back. But might happen that we are interested on having access to the input through its name attribute while we are typing. Which means that we need to put the name back right after each input. This solution, basically is based on the first solution. In this case, we will add the name on key down, and put it back on keyup. I think this is more neat for compatibility with what the "autocomplete off" behaviour should be. Anyway this is the code:
jQuery('body').on('mousedown keydown','[name="name"][autocomplete="off"], [name="email"][autocomplete="off"]',function(e){ e.stopImmediatePropagation(); if(typeof this.currentName =="undefined") this.currentName=jQuery(this).attr('name'); jQuery(this).attr('name',''); }); jQuery('body').on('blur keyup','[autocomplete="off"]',function(e){ e.stopImmediatePropagation(); if(typeof this.currentName !="undefined") jQuery(this).attr('name',this.currentName); });
Please notice that for Solution 1 and 2, I just took the cases where the input name is "name" and "email". For any other case where this attribute makes Chrome generate the dropdown you will have to add it in the selector for the mouse down event.
Solution 3
This solution is a lot more messy. I did not realize that the behaviour we are trying to correct is just based on those inputs with a specific name like "name, email, etc". The approach of this solution was for that case that Chrome display for other names that we don't know a priori. It would be a very generic solution. I do not like as much as the other 2, basically because there could be a small flicker when we press on the delete key. I will explain that bellow.
I found out that the dropdown was appearing after a second click on the input but not on the first click when you focus the first time on the input. I bind a "mousedown" event for all this elements where the handler basically detect if it is already focused on the input and in case it detects another "mouse down", force a .blur() and then .focus() after, preventing the dropdown on the second click once it is focused. I hope, it is clear, just in case here is the code that I used:
jQuery('body').on('mousedown','[autocomplete="off"]',function(e){ e.stopImmediatePropagation(); if(jQuery(this).is(':focus')) { jQuery(this).blur(); jQuery(this).focus(); } });
In the other hand, in order to prevent the dropdown while you are typing in case it matches with Chrome suggestions... This is a little bit tricky. I just decided to replace the default behaviour of an input while user types. The dropdown evaluates the input on mouse down, so I prevent the default behaviour for alphanumerics, space, etc. The only problem is with Command,Ctrl and delete. For this case I had to bind also an event on mouse up. It allows the default behaviour in the first two cases so you can make copy, and paste, or select all. In the case of the delete, I have to allow the default behaviour, but if after deleting a character the input matches with Chrome suggestions, then again it was showing the dropdown. For this case I had to use the same trick of blur and focus. The only inconvenience I found on this is that since we are cancelling the behaviour on keyup, and chrome tries to show it on keydown, there is a small flicker. Anyway, this is the best I could do. Probably it will require for filtering of characters at one point. I just added the conditions made more sense for now. This is the second part of the code:
jQuery('body').on('keydown','[autocomplete="off"]',function(e){ e.stopImmediatePropagation(); var ctrlKey = 17,cmKey = 91; var charCode = e.which || e.keyCode; if(charCode!=16 && this.commandDown != true && this.ctrlDown != true && ((charCode>47 && charCode<58)||(charCode>64 && charCode<91)||(charCode>96 && charCode<123)||charCode==0 || charCode==32)){ e.preventDefault(); var charStr = String.fromCharCode(charCode); if(!e.shiftKey) charStr = charStr.toLowerCase(charStr); $(this).val($(this).val() + charStr); }else{ if (charCode == cmKey) this.commandDown = true; if (charCode == ctrlKey) this.ctrlDown = true; } }); jQuery('body').on('keyup','[autocomplete="off"]',function(e){ e.stopImmediatePropagation(); var allowed=[8];//Delete var ctrlKey = 17,cmKey = 91; var charCode = e.which || e.keyCode; if (charCode == cmKey) {this.commandDown = false}; if (charCode == ctrlKey) {this.ctrlDown = false}; if(allowed.indexOf(charCode)>=0 || (this.commandDown!=false && this.ctrlDown!=false)){ jQuery(this).blur(); jQuery(this).focus(); }
As I said this solution is much more messy. It was the first one I used until I realized that the dropdown just appeared for certain input names.
Sorry for writing so much, I just wanted to be sure everything was clear. I hope it helps.
Answer by Kaszoni Ferencz for Disabling Chrome Autofill
After months and months of struggle, I have found that the solution is a lot simpler than you could imagine:
Instead of autocomplete="off"
use autocomplete="false"
;)
As simple as that, and it works like a charm in Google Chrome as well!
Answer by David Adams for Disabling Chrome Autofill
I was having this problem with a "sign in now or register" modal window, and was a problem if the user had saved their credentials to the browser. Both the sign in and register fields were populated, so I was able to clear them with the following angular js directive:
(function () { "use strict"; var directive = function ($timeout) { return { restrict: "A", link: function (scope, element, attrs) { $timeout(function () { element.val(" "); $timeout(function () { element.val(""); }); }); } }; }; angular.module("app.directives").directive("autofillClear", ["$timeout", directive]); }());
It's basically the same as some of the previous answers that would use jquery, but done in an angular way.
Answer by rybo111 for Disabling Chrome Autofill
Here are my proposed solutions, since Google are insisting on overriding every work-around that people seem to make.
Option 1 - select all text on click
Set the values of the inputs to an example for your user (e.g. your@email.com
), or the label of the field (e.g. Email
) and add a class called focus-select
to your inputs:
And here's the jQuery:
$(document).on('click', '.focus-select', function(){ $(this).select(); });
I really can't see Chrome ever messing with values. That'd be crazy. So hopefully this is a safe solution.
Option 2 - set the email value to a space, then delete it
Assuming you have two inputs, such as email and password, set the value of the email field to " "
(a space), and give it a class of autocomplete-off
, then clear this with JavaScript. You can leave the password value empty.
If the user doesn't have JavaScript for some reason, ensure you trim their input server-side (you probably should be anyway), in case they don't delete the space.
Here's the jQuery:
$(document).ready(function() { setTimeout(function(){ $('.autocomplete-off').val(''); }, 15); });
I set a timeout to 15
because 5
seemed to work occasionally in my tests, so trebling this number seems like a safe bet.
Failing to set the initial value to a space results in Chrome leaving the input as yellow, as if it has auto-filled it.
Option 3 - hidden inputs
Put this at the beginning of the form:
CSS:
.hide{ display:none; }
Ensure you keep the HTML note so that your other developers don't delete it!
Answer by tibalt for Disabling Chrome Autofill
For new Chrome versions you can just put autocomplete="new-password"
in your password field and that's it. I've checked it, works fine.
Got that tip from Chrome developer in this discussion: https://code.google.com/p/chromium/issues/detail?id=370363#c7
P.S. don't forget to use unique names for different fields to prevent autofilling.
Answer by Hemant_Negi for Disabling Chrome Autofill
I know this is not exactly relevant but here is what i did. The auto filled fields raise a 'change' event but only if you bind it to them as early as possible.
so i put this inside the head section.
$(document).ready(function(){ $('input').on('change',function(){$(this).val('')}) });
and it worked for me.
0 comments:
Post a Comment