Wyłączanie autouzupełniania Chrome


620

Występują problemy z zachowaniem autouzupełniania chrome w kilku formularzach.

Wszystkie pola w formularzu mają bardzo popularne i dokładne nazwy, takie jak „e-mail”, „nazwa” lub „hasło”, a także zostały autocomplete="off"ustawione.

Flaga autouzupełniania skutecznie wyłączyła zachowanie autouzupełniania, w którym po rozpoczęciu pisania pojawia się lista wartości, ale nie zmieniła wartości, które Chrome automatycznie wypełnia pola.

Takie zachowanie byłoby w porządku, gdyby chrom nieprawidłowo wypełniał dane wejściowe, na przykład wypełniał dane telefonu adresem e-mail. Klienci narzekali na to, więc potwierdzono, że dzieje się to w wielu przypadkach, a nie jako jakiś wynik czegoś, co zrobiłem lokalnie na moim komputerze.

Jedynym bieżącym rozwiązaniem, jakie mogę wymyślić, jest dynamiczne generowanie niestandardowych nazw wejściowych, a następnie wyodrębnianie wartości z zaplecza, ale wydaje się to dość hackerskim rozwiązaniem tego problemu. Czy są jakieś tagi lub dziwactwa, które zmieniają zachowanie autouzupełniania, które mogłyby zostać użyte do rozwiązania tego problemu?


6
To nie jest duplikat. Ten obsługuje wyłączanie autouzupełniania, ten stylizuje kolor autouzupełniania ...
Nicu Surdu

17
autocomplete = "false" zamiast autocomplete = "off" zgodnie z odpowiedzią Kaszoni Ferencz, głosujcie na to ludzie.
zgrubny

7
Spójrz na liczbę odpowiedzi na to pytanie - powinno ci coś powiedzieć: toczysz przegraną bitwę. To nie jest już problem z Chrome, Firefox i inni poszli w jego ślady. Czy ci się to podoba, czy nie, musisz zaakceptować decyzję branży przeglądarek, że forma automatycznego uzupełniania jest wyborem użytkownika - możesz z nimi walczyć, ale przegrasz. Na koniec dnia pytanie, które powinieneś zadać, nie brzmi: w jaki sposób mogę obalić autouzupełnianie, ale raczej, jak tworzyć formularze, które działają dobrze z autouzupełnianiem. Twoje obawy dotyczące bezpieczeństwa nie dotyczą twoich obaw, ale użytkowników.
mindplay.dk

21
Przepraszamy, ale odpowiedź @ mindplay.dk przynosi efekt przeciwny do zamierzonego. Moja sytuacja polega na tym, że mam użytkowników, którzy zalogowali się do mojej witryny, a strona w witrynie służy do wprowadzania informacji o koncie / pwd dla innych systemów. Kiedy ustawiam diaog dla nich, aby wprowadzić nowy, ich dane logowania do mojej witryny zostaną wypełnione, co jest całkowicie błędne i spowoduje problemy, jeśli / kiedy użytkownicy przypadkowo wprowadzą te informacje. Obaj nie mają nic wspólnego z wzajemnie. W tym przypadku przeglądarka robi coś sprzecznego z tym, czego chce użytkownik.
Mike K

8
@ mindplay.dk - Moja aplikacja internetowa jest aplikacją do zarządzania przepływem pracy w miejscu pracy, więc nie, moje obawy związane z bezpieczeństwem są niepokojące, zgodnie z wymogami najwyższego kierownictwa i muszą być przestrzegane przez wszystkich pracowników, czyli „użytkowników”. „ Jednak poproszenie ich o ustawienie przeglądarki Chrome, IE lub dowolnej innej przeglądarki pozostawi luki w procesie uwierzytelniania, ponieważ mogą, celowo lub nie, zakończyć się przy użyciu autouzupełniania. ANie wszystkie aplikacje internetowe są tego samego typu, z tymi samymi użytkownikami lub problemami.
PoloHoleSet

Odpowiedzi:


906

W przypadku nowych wersji Chrome wystarczy wpisać autocomplete="new-password"pole hasła i to wszystko. Sprawdziłem to, działa dobrze.

Dostałem tę wskazówkę od programisty Chrome w tej dyskusji: https://bugs.chromium.org/p/chromium/issues/detail?id=370363#c7

PS Pamiętaj, że Chrome będzie próbował wywnioskować zachowanie autouzupełniania na podstawie nazwy, identyfikatora i dowolnej treści tekstowej, którą może otoczyć pole, w tym etykiet i dowolnych węzłów tekstowych. Jeśli istnieje token autouzupełniania, taki jak street-addressw kontekście, Chrome automatycznie go wypełni. Heurystyka może być dość myląca, ponieważ czasami uruchamia się tylko wtedy, gdy w formularzu są dodatkowe pola, lub nie, jeśli w formularzu jest za mało pól. Zauważ też, że autocomplete="no"wydaje się działać, ale autocomplete="off"nie z powodów historycznych. autocomplete="no"czy mówisz przeglądarce, że to pole powinno być automatycznie uzupełniane jako pole o nazwie "no". Jeśli wygenerujesz unikalne losowe autocompletenazwy, wyłącz autouzupełnianie.

Jeśli użytkownicy odwiedzili złe formularze, informacje o autouzupełnianiu mogą być uszkodzone . Konieczne jest ich ręczne wpisanie i poprawienie informacji o autouzupełnianiu w Chrome.


115
„nowe hasło” zadziałało dla mnie po wypróbowaniu „off” i „false”
Kevin

26
To jedyna działająca poprawka teraz. Fałszywe i wyłączone, już nie działają. Powinna być teraz poprawna odpowiedź.
David,

5
Powodem tego jest to, że zespół chrome próbuje utworzyć zalecane wartości autouzupełniania, jak pokazano @ developers.google.com/web/fundamentals/design-and-ui/input/... Wartość „nowe hasło” jest jedną z kilka z nich ma dodatkową logikę, w tym przypadku ma zawiesić autouzupełnianie, ale nadal zezwalać na autouzupełnianie sugestii
Deminetix,

30
Nie działa od 1.13.2018 Wersja 63.0.3239.132 (oficjalna wersja) (64-bitowa)
PellucidWombat

36
Chciałem tylko powiedzieć… Po tym, jak natknąłem się na ten problem… Chrome to prawdziwy kawałek pracy. Więc teraz musimy skakać przez obręcze, aby wyłączyć funkcjonalność, która miała pozostać opcjonalna. W jakim świecie potrzebny byłby autouzupełnianie w aplikacji biznesowej, w której adres jest za każdym razem nowy / inny. Google staje się tak samo zły jak Microsoft.
Eddy Howard,

700

Właśnie odkryłem, że jeśli pamiętasz nazwę użytkownika i hasło do witryny, bieżąca wersja Chrome automatycznie wypełni Twoją nazwę użytkownika / adres e-mail w polu przed dowolnym type=passwordpolem. Nie ma znaczenia, jak nazywa się to pole - po prostu zakłada to pole, zanim hasło stanie się Twoją nazwą użytkownika.

Stare rozwiązanie

Wystarczy użyć <form autocomplete="off">i zapobiega to wpisywaniu hasła, a także heurystycznemu wypełnianiu pól w oparciu o założenia przeglądarki (które często są błędne). W przeciwieństwie do używania, <input autocomplete="off">które wydaje się być prawie ignorowane przez autouzupełnianie hasła (w Chrome to znaczy Firefox go wypełnia).

Zaktualizowane rozwiązanie

Chrome teraz ignoruje <form autocomplete="off">. Dlatego moje oryginalne obejście (które usunąłem) jest teraz modne.

Wystarczy utworzyć kilka pól i ukryć je za pomocą „display: none”. Przykład:

<!-- fake fields are a workaround for chrome autofill getting the wrong fields -->
<input style="display:none" type="text" name="fakeusernameremembered"/>
<input style="display:none" type="password" name="fakepasswordremembered"/>

Następnie umieść pod sobą swoje prawdziwe pola.

Pamiętaj, aby dodać komentarz lub inne osoby w twoim zespole będą się zastanawiać, co robisz!

Aktualizacja z marca 2016 r

Właśnie przetestowane z najnowszym Chrome - wszystko dobrze. To dość stara odpowiedź, ale chcę tylko wspomnieć, że nasz zespół stosuje ją od lat w dziesiątkach projektów. Nadal działa świetnie, pomimo kilku poniższych komentarzy. Nie ma problemów z dostępnością, ponieważ pola display:noneoznaczają, że nie są one aktywne. Jak wspomniałem, musisz postawić je przed swoimi prawdziwymi polami.

Jeśli używasz javascript do modyfikowania formularza, będziesz potrzebować dodatkowej sztuczki. Pokaż fałszywe pola podczas manipulowania formularzem, a następnie ukryj je ponownie milisekundę później.

Przykładowy kod wykorzystujący jQuery (zakładając, że nadajesz fałszywym polom klasę):

        $(".fake-autofill-fields").show();
        // some DOM manipulation/ajax here
        window.setTimeout(function () {
            $(".fake-autofill-fields").hide();
        },1);

Zaktualizuj lipiec 2018 r

Moje rozwiązanie nie działa już tak dobrze, ponieważ eksperci od Chrome w zakresie przeciwdziałania usability ciężko pracowali. Ale rzucili nam kość w postaci:

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

To działa i głównie rozwiązuje problem.

Jednak to nie działa, gdy nie masz pola hasła, a tylko adres e-mail. Może to być również trudne, aby przestał żółknąć i napełniał się. Aby to naprawić, można użyć rozwiązania fałszywych pól.

W rzeczywistości czasami musisz wpaść w dwie partie fałszywych pól i wypróbować je w różnych miejscach. Na przykład miałem już fałszywe pola na początku formularza, ale Chrome niedawno zaczął ponownie wypełniać moje pole „E-mail” - więc wtedy podwoiłem liczbę i wstawiłem więcej fałszywych pól tuż przed polem „E-mail”, i to naprawiło . Usunięcie pierwszej lub drugiej partii pól powoduje powrót do nieprawidłowego nadgorliwego autouzupełniania.

Aktualizacja z marca 2020 r

Nie jest jasne, czy i kiedy to rozwiązanie nadal działa. Wydaje się, że wciąż działa, ale nie cały czas.

W komentarzach poniżej znajdziesz kilka wskazówek. Jeden dodany właśnie przez @anilyeni może być wart dalszego zbadania:

Jak zauważyłem, autocomplete="off"działa na Chrome 80, JEŚLI jest mniej niż 3 elementy <form>. Nie wiem, jaka jest logika ani gdzie jest związana z nią dokumentacja.

Również ten z @dubrox może być odpowiedni, chociaż go nie testowałem:

wielkie dzięki za podstęp, ale proszę zaktualizuj odpowiedź, ponieważ display:none;już nie działa, ale position: fixed;top:-100px;left:-100px; width:5px;działa :)

Zaktualizuj KWIECIEŃ 2020

Specjalną wartością dla chrome dla tego atrybutu jest wykonywanie pracy: (testowane na wejściu - ale nie przeze mnie) autocomplete="chrome-off"


7
Byłem pewien, że to zadziała, ponieważ doskonale wyjaśniłeś heurystyczne autouzupełnianie, którego doświadczam z danymi wejściowymi przed polem hasła. Niestety, nie działało to dla mnie, ustawiłem autocomplete = "off" zarówno na formularzu, jak i na wszystkich danych wejściowych, a one wciąż się zapełniają. Jedyne rozwiązanie, które zadziałało dla mnie, znajduje się w linku goodeye powyżej. (umieszczenie drugiego typu ukrytego = „hasło” przed hasłem odrzuca kontrole heurystyczne Chrome)
parlament

19
To kiedyś działało dobrze, ja też go użyłem, ale od czasu jakiś czas temu (od tego czasu do 5 maja) Chrome uaktualnia Chrome, ignorując właściwość formy :(
Tominator

13
Google podjął decyzję (myślę, że Chrome wer. 34), aby ZAWSZE ignorować autouzupełnianie = „wyłączone”, w tym dyrektywy na poziomie formularza ... byłoby dobrze, gdyby rzeczywiście miał cholerne pola.
Jammer

10
try autocomplete = "false" not autocomplete = "off"
roughcoder

241
Ten atrybut jest również wymagany:autocomplete="I told you I wanted this off, Google. But you would not listen."
rybo111

265

Po miesiącach i miesiącach walki odkryłem, że rozwiązanie jest o wiele prostsze, niż można sobie wyobrazić:

Zamiast autocomplete="off"użycia autocomplete="false";)

To takie proste i działa jak urok w Google Chrome!


Aktualizacja z sierpnia 2019 r. (Kredyt na @JonEdiger w komentarzach)

Uwaga: wiele informacji w Internecie mówi, że przeglądarki traktują teraz autouzupełnianie = „fałsz” tak samo, jak autouzupełnianie = „wyłączone”. Przynajmniej od tej chwili uniemożliwia autouzupełnianie dla tych trzech przeglądarek.

Ustaw na poziomie formularza, a następnie dla danych wejściowych, które chcesz wyłączyć, ustaw niepoprawną wartość, np. „None”:

<form autocomplete="off"> 
  <input type="text" id="lastName" autocomplete="none"/> 
  <input type="text" id="firstName" autocomplete="none"/>
</form>

8
Pracował dla mnie! Ale jest jedna ważna uwaga: mam 5 pól na mojej stronie: imię i nazwisko, adres, kod pocztowy, telefon i e-mail. Gdy dodałem autocomplete = 'false' do formularza i pola Nazwa, nadal działało. Kiedy jednak umieściłem autouzupełnianie = „fałsz” również w polu Adres, ostatecznie przestałem je wypełniać! Musisz więc umieścić właściwość autouzupełniania nie w polu logowania lub w nazwie, ale także w następujących polach! (Działa na Chrome 43.0.2357.81 na dzień 27.05.2015)
Dvd Franco

45
JEŚLI TO NIE DZIAŁA DLA CIEBIE: pamiętaj, że Chrome „pomaga” użytkownikom na 2 sposoby. AUTOCOMPLETE wyświetli monit w oparciu o wcześniejsze przesłanie w tym samym złożonym formularzu i wpłynie na osoby, które korzystają z formularza więcej niż jeden raz. Autouzupełnianie jest wyłączone, a autouzupełnianie = „wyłączone”. AUTOFILL wyświetli monit na podstawie książki adresowej z wcześniej wypełnionych podobnych formularzy na innych stronach. Podświetli także pola, które zmienia. Autouzupełnianie można wyłączyć za pomocą autocomplete = "false".
genkilabs

4
To nie działa dla mnie (wersja 43.0.2357.124 m). Prawdopodobnie był to niedopatrzenie Google, które zostało już rozwiązane. Wydaje się, że myślą „użytkownik ma zawsze rację”, ponieważ chcą automatycznie wypełnić wszystko. Problem w tym, że mój formularz rejestracyjny zapisuje dane użytkownika tak samo, jak robi to formularz logowania, co zdecydowanie nie jest tym, czego chce użytkownik ...
rybo111

3
YEP Działa w Chrome 43.0.2357 !! takie zachowanie w Chrome jest bardzo denerwujące, a obejście tego zajęło mi trochę czasu. Dzięki za odpowiedź.
Adriano Rosa,

3
nie działa z Chrome 44.0.2403.157. Jak ta funkcja może działać i nie działać z różnymi wersjami. To śmieszne
Mattijs,

120

Czasami nawet autocomplete=offnie zapobiegnie wypełnieniu poświadczeń w niewłaściwych polach.

Obejściem tego problemu jest wyłączenie autouzupełniania przeglądarki za pomocą trybu tylko do odczytu i ustawienie fokusu do zapisu:

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

focusZdarzenie przy kliknięć myszką i tabbing przez pola.

Aktualizacja:

Mobile Safari ustawia kursor w polu, ale nie pokazuje wirtualnej klawiatury. To nowe obejście działa jak poprzednio, ale obsługuje wirtualną klawiaturę:

<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();  }" />

Demo na żywo https://jsfiddle.net/danielsuess/n0scguv6/

// UpdateEnd

Objaśnienie: Przeglądarka automatycznie wypełnia poświadczenia w niewłaściwym polu tekstowym?

nieprawidłowe wprowadzanie danych, na przykład wypełnianie danych telefonu adresem e-mail

Czasami zauważam to dziwne zachowanie w Chrome i Safari, gdy pola hasła są w tej samej formie. Myślę, że przeglądarka szuka pola hasła, aby wstawić zapisane poświadczenia. Następnie automatycznie uzupełnia nazwę użytkownika do najbliższego pola tekstowego, które pojawia się przed polem hasła w DOM (zgaduję z powodu obserwacji). Ponieważ przeglądarka jest ostatnią instancją i nie można jej kontrolować,

Ta poprawka tylko do odczytu działała dla mnie.


12
co za świetna poprawka :) powinieneś zastąpić jquery tym: this.removeAttribute ("class")
Roey

Użyłem tego, aby zatrzymać automatyczne wypełnianie dropdwonlist. Ale również zmieniono styl tylko do odczytu, więc nie wyglądało. Fajny pomysł!
Komfortowo

1
@Clint: Mój fragment kodu powyżej usuwa atrybut tylko do odczytu, gdy tylko użytkownik wejdzie w pole (za jednym kliknięciem myszy lub klawiszem Tab). Myślę, że odnosi się do pola, które jest chronione automatycznie , ale nie dotknięte przez użytkownika. Do czego służy ten cel - i czy naprawdę należy go chronić? W zależności od scenariusza usunięcie wszystkich atrybutów tylko do odczytu po przesłaniu może być opcją. Czy możesz dodać bardziej szczegółowy komentarz do swojego problemu? Może mogę ci pomóc :)
dsuess

1
Jeśli używasz JavaScript. dlaczego po prostu nie ustawić wartości, dummya następnie ponownie ją usunąć? Dodawanie i usuwanie tylko do odczytu brzmi jak niebezpieczny ruch - co jeśli przeglądarka nie chce, abyś się na nim skupił?
rybo111

1
Najwyraźniej Google próbuje tutaj podjąć decyzję dla nas wszystkich, zamknęli zgłoszenie dotyczące autocomplete = "off": bugs.chromium.org/p/chromium/issues/detail?id=468153 . Ale otworzono inny bilet do zbierania prawidłowych przypadków użytkowników dotyczących wyłączenia autouzupełniania, odpowiedz na ten bilet, aby zwiększyć świadomość tego problemu tutaj: bugs.chromium.org/p/chromium/issues/detail?id=587466
Norman Xu

81

Jeśli implementujesz funkcję pola wyszukiwania, spróbuj ustawić typeatrybut searchw następujący sposób:

<input type="search" autocomplete="off" />

Działa to dla mnie w Chrome v48 i wydaje się być uzasadnionym znacznikiem:

https://www.w3.org/wiki/HTML/Elements/input/search


Tak! :) Dziękuję Ci! Działa to w Chrome 67.0.3396.99. (Myślę, że twój link powinien być: w3.org/wiki/HTML/Elements/input/search od września 2018 r.).
Andy King

4
Wreszcie! nadal działa Wersja 69.0.3497.100 (oficjalna wersja) (64-bitowa) To powinna być prawdziwa odpowiedź!
Venson

1
wszyscy mają rację i źle, a jednocześnie powinieneś napisać autocomplete = "off" wewnątrz tagu <form autocomplete = "off"> zamiast na wejściu, a to zatrzyma zachowanie autouzupełniania
demopix

2
Działa również w przypadku ustawienia autouzupełniania = „off” na formularzu (to zmienić domyślną formą szerokości), a następnie po prostu trzeba ustawić typ = „szukaj” na <input>
John

9
Po wersji Chrome 72.XX ta poprawka nie działa. Znajdź
ostatnią poprawkę

65

Spróbuj tego. Wiem, że pytanie jest nieco stare, ale jest to inne podejście do problemu.

Zauważyłem też, że problem pojawia się tuż nad passwordboiskiem.

Próbowałem obu metod, takich jak

<form autocomplete="off">a <input autocomplete="off">jednak żaden z nich nie pracował dla mnie.

Naprawiłem to za pomocą poniższego fragmentu - właśnie dodałem kolejne pole tekstowe tuż nad polem typu hasła i zrobiłem to display:none.

Coś takiego:

<input type="text" name="prevent_autofill" id="prevent_autofill" value="" style="display:none;" />
<input type="password" name="password_fake" id="password_fake" value="" style="display:none;" />
<input type="password" name="password" id="password" value="" />

Mam nadzieję, że to komuś pomoże.


1
Ten działał dla mnie (na razie). Odkryłem, że z czasem użyłem około pół tuzina różnych hacków i po chwili Chrome decyduje, że chce pokonać ten hack. Potrzebny jest więc nowy, taki jak ten. W mojej aplikacji mam formularz aktualizacji profilu z polami adresu e-mail i hasła, które należy pozostawić puste, chyba że użytkownik chce wprowadzić zmiany. Ale gdy Chrome automatycznie się wypełnia, umieszcza identyfikator użytkownika w polu „potwierdzenie e-mailem”, co powoduje różnego rodzaju błędy, które prowadzą do dalszych błędów, ponieważ użytkownik ma ochotę postąpić właściwie.
Jeffrey Simon

2
Szybkie wyjaśnienie, dlaczego ten hack działa (na razie): Chrome widzi pierwszy typ = hasło i automatycznie je wypełnia i zakłada, że ​​pole bezpośrednio przed tym MUSI być polem nazwy użytkownika i automatycznie wypełnia to pole nazwą użytkownika. @JeffreySimon powinno to wyjaśniać fenomen identyfikatora użytkownika w polu potwierdzenia e-maila (widziałem to samo w formularzu).
MrBoJangles

1
@kentcdodds - nie jestem pewien, co masz na myśli mówiąc o przestaniu działać. Twój jsbin nie ma pola hasła, więc jest inna sytuacja. Korzystam z tego rozwiązania od lat, a ostatnio zauważyłem, że jest potrzebne i zadziałało w zeszłym tygodniu (marzec 2015).
Mike Nelson

1
Brawo! Rozwiązanie, które wydaje się działać! Radziłbym podać nazwę pola passwordi mieć actual_passwordprawidłowe pole, ponieważ Google wydaje się teraz patrzeć na name. Oznacza to jednak, że Chrome nie zapisze hasła, a tego właśnie potrzebuję . AAAAARRRRGHH!
rybo111

2
Aktualizacja: To działa przez ponad rok od ostatniego wdrożenia. Możemy mieć tutaj solidnego zwycięzcę.
MrBoJangles,

48

Nie wiem dlaczego, ale pomogło mi to i zadziałało.

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

Nie mam pojęcia dlaczego, ale autocompelete = "nowe hasło" wyłącza automatyczne wypełnianie. Działa w najnowszej wersji chromowanej 49.0.2623.112 .


Zaktualizowałem mój chrom i nadal działa dla mnie. 50.0.2661.87 (64-bitowy)
Tauras,

Niestety podczas przesyłania formularza (lub gdy pola wprowadzania są ukryte / usunięte) Chrome prosi o zapisanie zmienionego loginu.
sibbl,

Działa w wersji 51.0.2704,79 m
Geoffrey Hale

cholera, dlaczego to działa? czy to błąd? ponieważ przetestowałem go tutaj i umieściłem tylko w jednym wejściu i działałem zarówno dla loginu wejściowego, jak i hasła, ale umieściłem go tylko w haśle
Leandro RR

Nie mam pojęcia. Myślę, że to chromowana „rzecz” stworzona przez programistów. Może się mylę.
Tauras

46

Dla mnie proste

<form autocomplete="off" role="presentation">

Zrobiłem to

Testowany na wielu wersjach, ostatnia próba miała miejsce 56.0.2924.87


Dodana wersja @ArnoldRoa, jest na naszej stronie od dnia, w którym ją opublikowałem i miała kilka wersji, w których działała dobrze. Jakiej wersji używasz? PC / Mac?
Kuf

Nie działa w dniu 57.0.2987.110. Chrome wyróżnia go na żółto i wypełnij pole moim zapisanym hasłem. Ale strona to strona zarządzania użytkownikami, a nie strona logowania.

1
@Dummy Przetestowałem to teraz na najnowszym chrome (57) i nadal działa dla mnie. Czy zrobiłeś coś specjalnego z polami wejściowymi? czapka umieściłeś swój kod gdzieś, co mógłbym spróbować odtworzyć?
Kuf

3
Wersja 64.0.3282.186 (oficjalna wersja) (64-bitowy) Windows. 2018-03-01 NIE DZIAŁA w celu wyłączenia autouzupełniania.
billy jean

2
Całkiem pewne, że usuwa formularz / dane wejściowe z technologii wspomagających w3c.github.io/using-aria/#ariapresentation
Olex Ponomarenko


19

To takie proste i trudne :)

Google Chrome w zasadzie szukać każdego pierwszego widocznego elementu hasłem znajdującym się wewnątrz <form>, <body>a <iframe>znaczniki, aby włączyć automatyczne uzupełnianie dla nich, tak aby wyłączyć tego trzeba dodać element hasło obojętne jak następuje:

    • jeśli element hasła wewnątrz <form>tagu, należy umieścić element fikcyjny jako pierwszy element w formularzu natychmiast po <form>otwarciu tagu

    • jeśli elementu hasła nie ma w <form>znaczniku, umieść element zastępczy jako pierwszy element na stronie HTML natychmiast po <body>otwarciu znacznika

  1. Musisz ukryć element fikcyjny bez użycia css, display:nonewięc w zasadzie użyj następującego elementu jako fikcyjnego hasła.

    <input type="password" style="width: 0;height: 0; visibility: hidden;position:absolute;left:0;top:0;"/>

1
Świetna robota, skąd znasz algorytm Chrome? Właśnie dowiedziałem się, że moja stara metoda zmieniania wartości za pomocą JS po załadowaniu strony timerem setTimeout już nie działa. Ale to działa idealnie!

Niestety nie działa dla zwykłych danych wejściowych TextBox.
Oko

1
właściwie to działa po prostu ustaw właściwość name;)
Fareed Alnamrouti

W Chrome 58 to nie działa. Użyj szerokości: 1px. Jeśli pole hasła jest całkowicie ukryte, Chrome automatycznie wypełnia je normalnie. Przydatny może być również indeks z: -999, aby nie nakładał się na żadną treść.
cristiancastrodc

1
Działa na Chrome 67.0 na kanciastym składniku HTML<form *ngIf="!loggedIn()" #loginForm="ngForm" class="navbar-form navbar-right" (ngSubmit)="login()"><input type="password" style="width: 0;height: 0; visibility: hidden;position:absolute;left:0;top:0;"/><input type="text" #username="ngModel" placeholder="Username" class="form-control" required autocomplete="off" name="username" [(ngModel)]="model.username"><input type="password" #password="ngModel" placeholder="Password" class="form-control" required autocomplete="off" name="password" [(ngModel)]="model.password">...
Junior Mayhé

19

Oto moje proponowane rozwiązania, ponieważ Google nalega na zastąpienie każdego obejścia, które ludzie wydają się robić.

Opcja 1 - zaznacz cały tekst po kliknięciu

Ustaw wartości danych wejściowych na przykład dla użytkownika (np. your@email.com) Lub etykietę pola (np. Email) I dodaj klasę wywoływaną focus-selectdo danych wejściowych:

<input type="text" name="email" class="focus-select" value="your@email.com">
<input type="password" name="password" class="focus-select" value="password">

A oto jQuery:

$(document).on('click', '.focus-select', function(){
  $(this).select();
});

Naprawdę nie widzę, żeby Chrome kiedykolwiek bałaganił wartości. To byłoby szalone. Mamy nadzieję, że jest to bezpieczne rozwiązanie.

Opcja 2 - ustaw wartość e-maila na spację, a następnie usuń go

Zakładając, że masz dwa dane wejściowe, takie jak adres e-mail i hasło, ustaw wartość pola wiadomości e-mail na " "(spację) i dodaj atrybut / wartość autocomplete="off", a następnie wyczyść to za pomocą JavaScript. Możesz pozostawić wartość hasła pustą.

Jeśli z jakiegoś powodu użytkownik nie ma JavaScript, upewnij się, że przycinasz jego wejście po stronie serwera (prawdopodobnie tak powinno być), na wypadek, gdyby nie usunął spacji.

Oto jQuery:

$(document).ready(function() {
  setTimeout(function(){
    $('[autocomplete=off]').val('');
  }, 15);
});

Ustawiłem limit czasu, 15ponieważ 5wydawało mi się, że czasami działa w moich testach, więc potrojenie tej liczby wydaje się bezpiecznym zakładem.

Brak ustawienia wartości początkowej na spację powoduje, że Chrome pozostawia dane wejściowe w kolorze żółtym, tak jakby automatycznie je wypełniły.

Opcja 3 - ukryte dane wejściowe

Umieść to na początku formularza:

<!-- Avoid Chrome autofill -->
<input name="email" class="hide">

CSS:

.hide{ display:none; }

Pamiętaj, aby zachować notatkę HTML, aby inni programiści jej nie usuwali! Upewnij się także, że nazwa ukrytego wejścia jest odpowiednia.


@ Vaia - czy próbowałeś przejść do innej strony, a następnie nacisnąć przycisk Wstecz? Dostaję mieszane wyniki - może wymagać ulepszenia.
rybo111

Nie próbowałem opcji 1, jeśli masz na myśli. Musiałem także wyłączyć autouzupełnianie w modale ładowanym przez ajax, który nie będzie wywoływany za pomocą przycisku Wstecz. Ale jeśli pojawią się inne wyniki, powiem ci. @ rybo111
AlexioVay,

@ Vaia Miałem na myśli opcję 2 - w razie problemów napisz tutaj. Dzięki.
rybo111

15

Użyj css text-security: disc bez użycia type = password .

HTML

<input type='text' name='user' autocomplete='off' />
<input type='text' name='pass' autocomplete='off' class='secure' />

or

<form autocomplete='off'>
    <input type='text' name='user' />
    <input type='text' name='pass' class='secure' />
</form>

css

input.secure {
    text-security: disc;
    -webkit-text-security: disc;
}

najlepsze podejście, jakie znalazłem do tej pory! cóż, przynajmniej dla Chrome 64: /
scipper

Dla moich celów jest to idealne, dziękuję! Chrome nie wypełnia go automatycznie ani nie uzupełnia automatycznie, nie oferuje zapisania, i jest nie tylko zasłonięty, ale także ze schowka - skopiowałem to, co napisałem, wkleiłem do notatnika i właśnie dostałem ”••• •••••••• ”. Znakomity!
Doug McLean,

15

W niektórych przypadkach przeglądarka będzie sugerować wartości autouzupełniania, nawet jeśli atrybut autouzupełniania jest wyłączony. To nieoczekiwane zachowanie może być dość zagadkowe dla programistów. Sztuką naprawdę wymuszającą brak autouzupełniania jest przypisanie losowego ciągu do atrybutu , na przykład:

autocomplete="nope"

RE: „nieoczekiwane zachowanie” To zachowanie jest popychane przez Google, który uważa, że ​​wie lepiej niż programiści, jak każda strona powinna działać. Czasami chcę tylko surowego hasła, zero dodatków.
Regular Joe

3
ta kombinacja NAPRAWDĘ zadziałała dla mnie: rola = „prezentacja” autocomplete = „nope” przetestowana na Chrome w wersji 64.0.3282.186 (oficjalna wersja) (64-bit). Co za koszmar!
billy jean

2
Losowy ciąg działa w przypadku chrome, ale nie Firefox. Dla kompletności używam zarówno „autocomplete = 'off-no-complete'” i ustawiam atrybut readonly za pomocą onfocus = "this.readOnly = false". Moja aplikacja jest aplikacją dla przedsiębiorstw, której użytkownicy używają do wprowadzania tysięcy adresów, więc przypadek użycia do kontrolowania tego jest prawdziwy - mogę również zagwarantować użycie Javascript, więc przynajmniej mam to za sobą
ChronoFish

13

Odkryłem, że dodanie tego do formularza uniemożliwia Chrome korzystanie z autouzupełniania.

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

Znaleziono tutaj. https://code.google.com/p/chromium/issues/detail?id=468153#hc41

Naprawdę rozczarowujące, że Chrome zdecydował, że wie lepiej niż programista o tym, kiedy wykonać autouzupełnianie. Ma prawdziwy Microsoft.


To nie jest tak naprawdę fakt, że mówisz PreventChromeAutocomplete. Udało mi się uruchomić autouzupełnianie do pracy, mówiąc autocomplete = "off" i name = "somename". Ale działa to tylko wtedy, gdy nazwiesz dwa różne wejścia tą samą nazwą. Więc w twoim przypadku PreventChromeAutocomplete musiał zostać zastosowany do dwóch różnych danych wejściowych. Bardzo dziwne ...
Joe Heyming,

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

dodanie atrybutu readonly do tagu oraz usunięcie zdarzenia onfocus rozwiązuje problem


To rozwiązanie działa na polach tekstowych
Denis Slonovschi

9

W przypadku kombinacji hasła do nazwy użytkownika jest to łatwy problem do rozwiązania. Heurystyka Chrome szuka wzoru:

<input type="text">

śledzony przez:

<input type="password">

Po prostu przerwij ten proces, unieważniając to:

<input type="text">
<input type="text" onfocus="this.type='password'">

Niestety dotyczy to nie tylko nazwy użytkownika / hasła. Chrome spojrzy na tekst zastępczy, aby dowiedzieć się, co zasugerować. Na przykład: jsbin.com/jacizu/2/edit
kentcdodds

Prawdą jest, że nadal będziesz w stanie wypełnić pola sugestiami przeglądarki, jak pokazuje twój przykład, więc tak naprawdę nie rozwiązuje to problemu PO. To rozwiązanie po prostu uniemożliwia przeglądarce „automatyczne” zapełnianie kombinacji nazw użytkowników i haseł, jak w przykładzie przy pierwszej odpowiedzi. Może to być przydatne dla niektórych, ale nie jest to kompletne rozwiązanie po prostu wyłączające autouzupełnianie, które będzie musiało pochodzić od Google.
Bernesto

4
Jednak jeśli dodasz spację przed tekstem zastępczym, spowoduje to wyłączenie autosugestii na podstawie również symbolu zastępczego. Zdecydowanie włamanie, choć nie więcej niż inne sugestie. jsbin.com/pujasu/1/edit
Bernesto

właściwie ... wydawało się, że działa na twoim przykładzie, ale z jakiegoś powodu nie działa dla mnie :-(
kentcdodds

Ha! Dlatego to się nazywa hack ... Czy masz przykład, którym możesz się podzielić, gdy to nie działa?
Bernesto

8

Mike Nelsons podał, że rozwiązanie nie działa dla mnie w Chrome 50.0.2661.102 m. Po prostu dodanie elementu wejściowego tego samego typu z wyświetlaczem: żaden zestaw nie wyłącza już autouzupełniania natywnej przeglądarki. Konieczne jest teraz skopiowanie atrybutu nazwy pola wejściowego, na którym chcesz wyłączyć automatyczne uzupełnianie.

Ponadto, aby uniknąć duplikowania pola wejściowego, gdy znajdują się one w elemencie formularza, należy umieścić wyłączony element, który nie jest wyświetlany. Zapobiegnie to przesłaniu tego elementu w ramach akcji formularza.

<input name="dpart" disabled="disabled" type="password" style="display:none;">
<input name="dpart" type="password">
<input type="submit">

W czerwcu 2016 r. I Chrome 51.0.2704.106 m jest to jedyne działające rozwiązanie tutaj
Denis

Ale czy wtedy formularz wybierze odpowiednie (widoczne) pole wprowadzania, którego potrzebujesz? Ponieważ to ta sama nazwa.
AlexioVay,

@Vaia, dodanie wyłączonego atrybutu do duplikatu elementu uniemożliwi przesłanie go.
mccainz,

8

W 2016 roku Google Chrome zaczął ignorować, autocomplete=offchociaż jest w W3C. Odpowiedź, którą opublikowali :

Trudna część polega na tym, że gdzieś podczas podróży w sieci autouzupełnianie = wyłączone staje się domyślnym dla wielu pól formularza, bez zastanowienia się, czy to było dobre dla użytkowników. Nie oznacza to, że nie ma bardzo ważnych przypadków, w których nie chcesz, aby dane autouzupełniania w przeglądarce (np. W systemach CRM), ale ogólnie rzecz biorąc, postrzegamy je jako przypadki mniejszości. W rezultacie zaczęliśmy ignorować autouzupełnianie = wyłączone dla danych autouzupełniania w Chrome.

Co zasadniczo mówi: wiemy lepiej, czego chce użytkownik.

Otworzyli kolejny błąd, aby opublikować prawidłowe przypadki użycia, gdy wymagane jest autouzupełnianie = wyłączone

Nie widziałem problemów związanych z autouzupełnianiem w całej mojej aplikacji B2B, ale tylko z wprowadzeniem typu hasła.

Autouzupełnianie wkracza, jeśli na ekranie jest jakieś pole hasła, nawet ukryte. Aby złamać tę logikę, możesz umieścić każde pole hasła we własnej formie, jeśli nie złamie ono logiki strony.

<input type=name >

<form>
    <input type=password >
</form>

4
Ponieważ twoja odpowiedź jest najnowsza, czy możesz dodać, że dodanie autocomplete="pineapple"lub jakiś bełkot również rozwiązuje problem? Przynajmniej tak się stało po mojej stronie!
Douwe de Haan,

1
@DouwedeHaan jest w porządku, dopóki formularz nie zostanie zapisany, a następnie autouzupełnianie poda zalecenia dotyczące zapisanego pola „ananas”. Ale może na przykład użycie losowego skrótu w celu autouzupełniania pomogłoby?
wykopano

@digout Zgadzam się. Dobrym przykładem byłoby użycie UUID do tego rodzaju rzeczy. Tylko upewnij się, że ciąg jest unikalny!
Douwe de Haan

7

Jeśli masz problemy z zachowaniem symboli zastępczych, ale wyłączasz automatyczne uzupełnianie chrome, znalazłem to obejście.

Problem

HTML

<div class="form">
    <input type="text" placeholder="name"><br>
    <input type="text" placeholder="email"><br>
    <input type="text" placeholder="street"><br>
</div>

http://jsfiddle.net/xmbvwfs6/1/

Powyższy przykład nadal powoduje problem z autouzupełnianiem, ale jeśli używasz required="required" CSS i trochę CSS, możesz replikować symbole zastępcze, a Chrome nie odbierze tagów.

Rozwiązanie

HTML

<div class="form">
    <input type="text" required="required">
    <label>Name</label>  
    <br>
    <input type="text" required="required">
    <label>Email</label>    
    <br>
    <input type="text" required="required">
    <label>Street</label>    
    <br>
</div>

CSS

input {
    margin-bottom: 10px;
    width: 200px;
    height: 20px;
    padding: 0 10px;
    font-size: 14px;
}
input + label {
    position: relative;
    left: -216px;
    color: #999;
    font-size: 14px;
}
input:invalid + label { 
    display: inline-block; 
}
input:valid + label { 
    display: none; 
}

http://jsfiddle.net/mwshpx1o/1/


To jedyne rozwiązanie, które faktycznie działa. Naprawdę mi się nie podoba, ale w tym momencie jesteśmy w kiepskim stanie :-(
kentcdodds

Od 2017 roku ten nadal działa dobrze. Potrzebuje tylko tego skryptu, aby wymusić inputfokus, jeśli użytkownik kliknie „fałszywy” symbol zastępczy: $("label").on("click",function(){ $(this).prev().focus(); });Pamiętaj, że labelnie może być wcześniej niż input... Chrome go znajdzie! Ładne kreatywne rozwiązanie! +1
Louys Patrice Bessette

7

Naprawdę nie podobało mi się tworzenie ukrytych pól, myślę, że zrobienie tego w ten sposób bardzo szybko się zagmatwa.

W polach wejściowych, które chcesz zatrzymać od automatycznego uzupełniania, zadziała. Spraw, aby pola były tylko do odczytu, a fokus usuń ten atrybut w ten sposób

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

wystarczy to, że najpierw usuniesz atrybut „tylko do odczytu” , wybierając pole, a wtedy najprawdopodobniej zapełnisz się danymi wprowadzonymi przez użytkownika i pochylisz się nad autouzupełnianiem, aby przejąć kontrolę


1
Niestety, to już nie działa :-( jsbin.com/sobise/edit?html,css,output
kentcdodds

7

Wcześniej wprowadzone wartości buforowane przez chrome są wyświetlane jako rozwijana lista wyboru. Można to wyłączyć przez autouzupełnianie = wyłączone, jawnie zapisany adres w zaawansowanych ustawieniach chrome daje wyskakujące okienko autouzupełniania, gdy pole adresu staje się aktywne. Można to wyłączyć przez autocomplete = "false" . Ale pozwoli to Chrome wyświetlać wartości buforowane w menu rozwijanym.

W wejściowym polu HTML następujący znak wyłączy oba.

Role="presentation" & autocomplete="off"

Podczas wybierania pól wejściowych do autouzupełniania adresu Chrome ignoruje te pola wejściowe, które nie mają poprzedzającego elementu HTML.

Aby upewnić się, że parser chrome ignoruje pole wprowadzania wyskakującego adresu autouzupełniania, między etykietą a polem tekstowym można dodać ukryty przycisk lub kontrolę obrazu. Spowoduje to przerwanie sekwencji analizowania chromu podczas tworzenia pary etykiet-danych wejściowych do automatycznego wypełniania. Pola wyboru są ignorowane podczas analizowania pól adresu

Chrome bierze również pod uwagę atrybut „for” na elemencie etykiety. Można go użyć do przerwania sekwencji analizowania chromu.


Kocham Cię. Jedyne rozwiązanie na tej stronie, które faktycznie działa.
Dzień Davis Waterbury,

Nie działa w roku 2020.
Kai Noack

7

Ponieważ wszyscy mamy ten problem, poświęciłem trochę czasu na napisanie działającego rozszerzenia jQuery dla tego problemu. Google musi przestrzegać znaczników HTML, a nie Google

(function ($) {

"use strict";

$.fn.autoCompleteFix = function(opt) {
    var ro = 'readonly', settings = $.extend({
        attribute : 'autocomplete',
        trigger : {
            disable : ["off"],
            enable : ["on"]
        },
        focus : function() {
            $(this).removeAttr(ro);
        },
        force : false
    }, opt);

    $(this).each(function(i, el) {
        el = $(el);

        if(el.is('form')) {
            var force = (-1 !== $.inArray(el.attr(settings.attribute), settings.trigger.disable))
            el.find('input').autoCompleteFix({force:force});
        } else {
            var disabled = -1 !== $.inArray(el.attr(settings.attribute), settings.trigger.disable);
            var enabled = -1 !== $.inArray(el.attr(settings.attribute), settings.trigger.enable);
            if (settings.force && !enabled || disabled)
                el.attr(ro, ro).focus(settings.focus).val("");
        }
    });
};
})(jQuery);

Po prostu dodaj to do pliku takiego jak /js/jquery.extends.js i dołącz do jQuery. Zastosuj go do każdego elementu formularza przy ładowaniu dokumentu w następujący sposób:

$(function() {
    $('form').autoCompleteFix();
});

jsfiddle z testami


6

Wypróbuj następujący jQuerykod, który dla mnie zadziałał.

if ($.browser.webkit) {
    $('input[name="password"]').attr('autocomplete', 'off');
    $('input[name="email"]').attr('autocomplete', 'off');
}

niesamowite niesamowite rozwiązania
DKR

Możesz po prostu dodać autocomplete="off"do pola wejściowego zamiast używać jquery. A tak przy okazji, to nie działa. Sugestie dotyczące hasła do Chrome wciąż się wyświetlają.
Kai Noack,

6

Są w tym dwa elementy. Chrome i inne przeglądarki zapamiętują wcześniej wprowadzone wartości nazw pól i na tej podstawie udostępniają użytkownikowi listę autouzupełniania (w szczególności dane typu hasła nigdy nie są zapamiętywane w ten sposób, z dość oczywistych powodów). Możesz dodaćautocomplete="off" aby temu zapobiec na przykład w polu e-mail.

Masz jednak wypełniacze hasła. Większość przeglądarek ma swoje wbudowane implementacje, a także wiele narzędzi innych firm, które zapewniają tę funkcjonalność. To ty nie możesz przestać. Jest to użytkownik, który sam decyduje o zapisaniu tych informacji w celu ich późniejszego automatycznego wypełnienia, i jest to całkowicie poza zakresem i zakresem wpływu Twojej aplikacji.


Pierwsza część tej odpowiedzi nie wydaje się już prawdą: błąd Chrome
Joshua Drake

Nie jestem pewien, o co ci chodzi. Ten „błąd” jest tylko symbolem zastępczym dla Chromium, do którego można zbierać przypadki użycia przez ludzi autocomplete="off". Jest to możliwe, intencją jest, aby go usunąć, ale to nie zawsze wyraźnie zaznaczono, a tam na pewno nic nie wymagając ten skok psychiczne. Mogą po prostu chcieć rozważyć alternatywne lub lepsze sposoby leczenia. Niezależnie od tego, jest to nadal część specyfikacji, i ponownie, nie ma też oznak, że będzie ona opuszczać specyfikację. I nadal działa we wszystkich przeglądarkach, o ile mi wiadomo, w tym w Chrome.
Chris Pratt

Mamy kilka przypadków, w których Chrome nie przestrzega autouzupełniania = „wyłączony”.
Joshua Drake

1. Kilka anegdotycznych spraw nie stanowi dowodów. 2. Jak powiedziałem w mojej odpowiedzi, rozszerzenia wypełniające formularze i tym podobne mogą nie być i często nie szanują tego. Ostatecznie, podobnie jak wszystkie rzeczy, to zależy od klienta, a zatem od użytkownika. Wszystko, co możesz zrobić, to zasugerować, że nie powinno być ono automatycznie wypełniane.
Chris Pratt


6

Ustawiając, autocompleteaby offdziałało tutaj, mam przykład, który jest używany przez Google na stronie wyszukiwania. Znalazłem to z elementu inspekcji.

wprowadź opis zdjęcia tutaj

edycja : Jeśli offnie działa, spróbuj falselub nofill. W moim przypadku działa z wersją chrome 48.0


5

Oto brudny hack -

Masz tutaj swój element (dodając atrybut disabled):

<input type="text" name="test" id="test" disabled="disabled" />

A potem na dole strony umieść JavaScript:

<script>
    setTimeout(function(){
        document.getElementById('test').removeAttribute("disabled");
        },100);
</script>

5

Inne rozwiązanie oparte na pakiecie internetowym. Jak już wspomniano, za każdym razem, gdy Chrome znajdzie pole hasła, automatycznie uzupełnia wiadomość e-mail. AFAIK, to niezależnie od autouzupełniania = [cokolwiek].

Aby obejść tę zmianę, zmień typ wprowadzania na tekst i zastosuj czcionkę zabezpieczającą Webkit w dowolnej formie.

.secure-font{
-webkit-text-security:disc;}

<input type ="text" class="secure-font">

Z tego, co widzę, jest to co najmniej tak bezpieczne, jak typ danych wejściowych = hasło, to bezpieczne kopiowanie i wklejanie. Jest jednak podatny na ataki poprzez usunięcie stylu, który usunie gwiazdki, oczywiście typ wejściowy = hasło można łatwo zmienić na typ wejściowy = tekst w konsoli, aby odsłonić automatycznie wypełnione hasła, więc tak naprawdę jest tak samo.


Dziękuję Ci! To jedyna rzecz, która działa w chrome 49. Poprzednie metody zepsuły się, ponieważ chrome wydaje się teraz wypełniać wszystkie dane wejściowe type="password".
epelc

4

Jedyny sposób, który działa dla mnie to: (wymagane jQuery)

$(document).ready(function(e) {
    if ($.browser.webkit) {
        $('#input_id').val(' ').val('');
    }
});

4

Napotkałem ten sam problem. A oto rozwiązanie do wyłączania automatycznego wypełniania nazwy użytkownika i hasła w Chrome (tylko przetestowane tylko z Chrome)

    <!-- Just add this hidden field before password as a charmed solution to prevent auto-fill of browser on remembered password -->
    <input type="tel" hidden />
    <input type="password" ng-minlength="8" ng-maxlength="30" ng-model="user.password" name="password" class="form-control" required placeholder="Input password">

dziwna poprawka, ale jakoś to jedyna rzecz, która działa dla mnie na chrome 48 :)
Jacka
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.