Cóż, trochę późno na imprezę, ale wydaje się, że jest trochę nieporozumień na temat tego, jak autocomplete
powinno i nie powinno działać. Zgodnie ze specyfikacjami HTML klient użytkownika (w tym przypadku Chrome) może zastąpić autocomplete
:
https://www.w3.org/TR/html5/forms.html#autofilling-form-controls:-the-autocomplete-attribute
Agent użytkownika może zezwolić użytkownikowi na zastąpienie nazwy pola autouzupełniania elementu, np. Na zmianę go z „wyłączony” na „włączony”, aby umożliwić zapamiętanie i wypełnienie wartości pomimo zastrzeżeń autora strony lub zawsze „wyłączone”, nigdy nie zapamiętując wartości. Jednak programy klienckie nie powinny pozwalać użytkownikom na trywialne zastępowanie nazwy pola autouzupełniania z „wyłącz” na „włączony” lub innych wartości, ponieważ użytkownik ma znaczące konsekwencje dla bezpieczeństwa, jeśli wszystkie wartości są zawsze zapamiętywane, niezależnie od preferencji witryny.
Dlatego w przypadku Chrome programiści zasadniczo powiedzieli: „pozostawimy to użytkownikowi, aby zdecydował w swoich preferencjach, czy chce autocomplete
pracować, czy nie. Jeśli nie chcesz, nie włączaj go w przeglądarce” .
Wydaje się jednak, że z mojej strony jest to trochę nadgorliwe, ale tak właśnie jest. W specyfikacji omówiono również potencjalne konsekwencje takiego ruchu dla bezpieczeństwa:
Słowo kluczowe „off” wskazuje, że dane wejściowe kontrolki są szczególnie wrażliwe (na przykład kod aktywacyjny dla broni jądrowej); lub że jest to wartość, która nigdy nie zostanie ponownie wykorzystana (na przykład jednorazowy klucz do logowania do banku), a zatem użytkownik będzie musiał za każdym razem jawnie wprowadzać dane, zamiast móc polegać na UA w celu uzupełnienia wartość dla niego; lub że dokument ma własny mechanizm autouzupełniania i nie chce, aby agent użytkownika podawał wartości autouzupełniania.
Po doświadczeniu takiej samej frustracji jak wszyscy inni znalazłem rozwiązanie, które działa dla mnie. Podobnie jest w przypadku autocomplete="false"
odpowiedzi.
Artykuł w Mozilli mówi dokładnie o tym problemie:
https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion
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. Sztuczka, aby naprawdę wymusić brak ukończenia, polega na przypisaniu losowego ciągu do atrybutu
Więc następujący kod powinien działać:
autocomplete="nope"
Podobnie powinno być każde z poniższych:
autocomplete="false"
autocomplete="foo"
autocomplete="bar"
Widzę problem polegający na tym, że agent przeglądarki może być wystarczająco inteligentny, aby nauczyć się autocomplete
atrybutu i zastosować go przy następnym wyświetleniu formularza. Jeśli tak się stanie, jedynym sposobem na obejście problemu jest dynamiczna zmiana autocomplete
wartości atrybutu podczas generowania strony.
Warto wspomnieć, że wiele przeglądarek ignoruje autocomplete
ustawienia pól logowania (nazwa użytkownika i hasło). Jak stwierdza artykuł Mozilli:
Z tego powodu wiele współczesnych przeglądarek nie obsługuje autocomplete = „off” dla pól logowania.
- Jeśli witryna ustawia dla formularza formularz autocomplete = „off”, a formularz zawiera pola wprowadzania nazwy użytkownika i hasła, przeglądarka nadal będzie oferować zapamiętywanie tego loginu, a jeśli użytkownik wyrazi zgodę, przeglądarka automatycznie wypełni te pola następnym razem użytkownik odwiedza tę stronę.
- Jeśli witryna ustawia opcję autocomplete = "off" dla pól wprowadzania nazwy użytkownika i hasła, przeglądarka nadal będzie oferować zapamiętywanie tego loginu, a jeśli użytkownik wyrazi zgodę, przeglądarka automatycznie wypełni te pola przy następnej wizycie na tej stronie.
Takie zachowanie ma Firefox (od wersji 38), Google Chrome (od 34) i Internet Explorer (od wersji 11).
Na koniec mała informacja o tym, czy atrybut należy do form
elementu czy input
elementu. Specyfikacja ponownie ma odpowiedź:
Jeśli atrybut autouzupełniania zostanie pominięty, zostanie użyta wartość domyślna odpowiadająca stanowi atrybutu autouzupełniania właściciela elementu („on” lub „off”). Jeśli nie ma właściciela formularza, używana jest wartość „on”.
Więc. Umieszczenie go w formularzu powinno mieć zastosowanie do wszystkich pól wejściowych. Umieszczenie go na pojedynczym elemencie powinno dotyczyć tylko tego elementu (nawet jeśli nie ma go w formularzu). Jeśli autocomplete
w ogóle nie jest ustawiony, domyślnie jest ustawiony na on
.
Podsumowanie
Aby wyłączyć autocomplete
w całym formularzu:
<form autocomplete="off" ...>
Lub jeśli musisz to zrobić dynamicznie:
<form autocomplete="random-string" ...>
Aby wyłączyć autocomplete
pojedynczy element (niezależnie od tego, czy ustawienie formularza jest obecne, czy nie)
<input autocomplete="off" ...>
Lub jeśli musisz to zrobić dynamicznie:
<input autocomplete="random-string" ...>
I pamiętaj, że niektóre programy użytkownika mogą zastąpić nawet najcięższe próby wyłączenia autocomplete
.