React nie wyłącza autouzupełniania


83

Jak sprawić, by zareagował, wyrenderuj to?

<input
    id={field.name}
    className="form-control"
    type="text"
    placeholder={field.name}
    autocomplete="off"
    {...field}/>

Odpowiedzi:


158

Wielkie „C” autoComplete. Jest to wspomniane w dokumentacji Reacta:

https://facebook.github.io/react/docs/tags-and-attributes.html


16
Zawsze zgłaszaj wyjątek, a nie tylko po cichu ignoruj ​​błędy.
Jarosław

1
@Yaroslav Możliwe, że React rzuca ostrzeżenie, jeśli nie, to github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/…
azium

1
Ale też nie jest to błąd, ponieważ rekwizyty mogą być czymkolwiek ... skąd React wie, kiedy tworzysz własny rekwizyt lub używasz atrybutu HTML?
azium

Rekwizyty nie mogą być niczym w przypadku tagów HTML.
Jarosław

Rozumiem, dlaczego myślisz, że tak jest, ale pamiętaj, że tagi JSX są transponowane do wywołań funkcji za pomocą ciągu znaków reprezentującego typ tagu.
azium

67

Powinieneś umieścić:

autoComplete="new-password"

Spowoduje to usunięcie autouzupełniania


13
Naprawdę nie rozumiem, dlaczego to działa zamiast „wyłączyć”. Dziwne.
Ajay


@Pim Ma sens. Dzięki!
Ajay

1
Jesteś legendą, dzięki! Ma to również sens, chciałem, aby moje pole nowego hasła nie było automatycznie uzupełniane: D
Erik Kubica

Prawdopodobnie chrome rozpoznaje neww nazwie. Nazwałam to teraz, autoComplete="new-off"co ma dla mnie trochę więcej sensu, jeśli nie jest to pole hasła i działa dobrze: D
kenny

7

Zgodnie z dokumentacją Mozilli , musisz ustawić nieprawidłową wartość, aby naprawdę wyłączyć autouzupełnianie. W niektórych przeglądarkach sugestie autouzupełniania są nadal podawane, mimo że atrybut jest wyłączony.

To zadziałało dla mnie (reakcja-bootstrap):

<FormControl
  value={this.state.value}
  autoComplete="nope"
  {...props}
/>

Wow, to dziwne, ale to jedyna rzecz, która do tej pory działała dla mnie.
Wylliam Judd

1
@Pim Mmm czy to to samo autocompletei autofill? Ponieważ nie działa u mnie na Chrome. Wciąż automatycznie wypełnia formularz poprzednimi wartościami przesłanymi z tego samego formularza.
alexventuraio

6

Jeśli przeczytałeś poprawną odpowiedź i nadal masz ten problem (szczególnie w Chrome), witaj w klubie ... więc sprawdź, jak to zrobiłem:

<form autoComplete="new-password" ... >
        <input name="myInput" type="text" autoComplete="off" id="myInput" placeholder="Search field" />
</form>

Uwagi

  • forma niekoniecznie musi być bezpośrednim rodzicem elementu wejściowego
  • wejście wymaga atrybutu nazwy
  • działa również z <FormControl/>tagiem React-Bootstrap (zamiast <input/>)

To nie działa. Próbuję z Chrome 67. Nic. Nadal potrzebuję fałszywego wejścia z wyświetlaczem: brak! Bardzo szalony!

dziękuję za informację zwrotną, ale czy w Twojej sprawie zaznaczono wszystkie 3 punktory?
w3jimmy

W niektórych przypadkach nadal otrzymywałem autosugestie. Zobacz moją odpowiedź, aby uzyskać bardziej kompletne rozwiązanie.
Pim

5

Żadne z tych rozwiązań tak naprawdę nie działało na Chrome 80.

Po godzinach prób i błędów ten bardzo dziwny hack zadziałał dla mnie:

  1. Dodaj autoComplete="none"do każdego<input> - Google pomija teraz autocomplete = "off"
  2. Owiń pola w kontenerze: <form>lub<div>
  3. Potrzebujesz co najmniej jednego prawidłowego pola wejściowego z autoComplete="on". Powinien to być ostatni element w kontenerze. Więc dodałem następujące pole wejściowe na dole mojego formularza:
<input 
  type="text" 
  autoComplete="on" 
  value="" 
  style={{display: 'none', opacity: 0, position: 'absolute', left: '-100000px'}} 
  readOnly={true}
/>

3

autoComplete = "none" - działa dla mnie.


2
Witaj Alex. Postaraj się odpowiedzieć bardziej szczegółowo. Ważne jest, aby zastanowić się, czy rozwiązanie działa ze względu na wielkość „autouzupełniania”.
Jennifer Goncalves,


0

Oprócz odpowiedzi @ azium <input>należy umieścić w <form>tagu, a następnie autoCompletedziała


0

Rozwiązałem to za pomocą tylko jednej linii:

Jeśli używasz zalecanego sposobu z "changeHandler ()" i stanem komponentów, po prostu wstaw:

changeHandler = (e) => {    
  if (!e.isTrusted) return;
  ... your code
}

Więcej informacji o tej zmianieHandler () - Rzecz:
https://reactjs.org/docs/forms.html#controlled-components


2
kiedy Google Chrome automatycznie wypełnia moje dane, e.isTrusted is true: D
IvanY

0

Wypróbowałem także wiele opcji, ale skończyło się na tym, że zastąpiłem <form>tag <div>tagiem i ręcznie zarządzałem każdym wejściem, które miałem w tej formie.


0

Oto komunikat „To działa na moim komputerze”

Chrome w wersji 83.0.4103.116 i React. Wygląda na to, że sztuczka, która zadziałała w moim przypadku, polega na umieszczeniu go w formularzu i dodaniu atrybutu autoComplete . Uwaga Jeśli spróbujesz tego w aplikacji niereagującej, będziesz musiał wykonać autouzupełnianie małą literą C

 <form autoComplete="off">
      <input type="text" autoComplete="new-password" />
 </form>

i

<form autoComplete="new-password">
  <input type="text" autoComplete="new-password" />
</form>

0

Tak, większość sugestii tutaj i gdzie indziej nie powiodła się w grudniu 2020 r.
Myślę, że wypróbowałem je wszystkie, opakowanie formularzy, ustawienie autouzupełniania na „wyłączone” z „nowego hasła” (żadne z nich nie działało), wybranie onFocus, upewnienie się, że używam autouzupełniania i nie autouzupełnianie (nie wielkie litery), ale żadne z nich nie pomogło.

W końcu podejście mscott2005 zadziałało (+1) dla mnie, ale poprawiłem je również, aby uzyskać bardziej minimalny przykład, który publikuję jako odpowiedź dla innych:

Nie był potrzebny żaden formularz, tylko dwa znaczniki wejściowe:

  • autocomplete = "off" na wybranym polu

    <input ... autoComplete="off" />

  • autocomplete = "on" na fałszywym ukrytym polu

    <input

    id="fake-hidden-input-to-stop-google-address-lookup"
    autoComplete="on"
    style={{ display: 'none'}}>
    

Identyfikator jest najlepszym, jaki mam, do dokumentowania tego, co naprawdę jest włamaniem, bez użycia komentarza.

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.