Błąd w Firefoksie - wyłączony atrybut wejścia nie resetuje się podczas odświeżania

103

Znalazłem coś, co uważam za błąd w Firefoksie i zastanawiam się, czy to rzeczywiście jest błąd, a także wszelkie obejścia tego problemu.

Jeśli utworzysz podstawową stronę internetową z następującym źródłem:

<html>
  <head>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.0/jquery.min.js"></script>
  </head>
  <body>
    <div>
      <input id="txtTest" type="text" />
      <input type="button" onclick="$('#txtTest').attr('disabled','disabled');" value="Set Disabled (jQuery)" />
      <input type="button" onclick="document.getElementById('txtTest').disabled = true;" value="Set Disabled (js)" />
      <input type="button" onclick="$('#txtTest').removeAttr('disabled');" value="Remove Disabled" />
    </div>
  </body>
</html>

Jeśli dynamicznie, a następnie odśwież stronę, pozostanie wyłączona zamiast kasowania powrotem do jej pierwotnego stanu nie wyłączone. Wypróbowałem to w IE8 i Chrome, a te zachowują się tak, jak bym się spodziewał, resetując tył, aby nie był wyłączony, gdy odświeżam.disabletextboxtextboxtextbox

Inną interesującą informacją jest to, że nadal robi to samo, jeśli dane wejściowe to a checkboxzamiast a textbox.

Stephen Mesa
źródło
2
Czy na pewno nie jest to tylko „funkcja” Firefoksa, która zapamiętuje stan inputelementów, gdy po prostu je odświeżasz?
trzydzieści dni
@thirtydot: Też się nad tym zastanawiałem, więc próbowałem też eksperymentować z dynamicznym ustawianiem atrybutu „size”, który resetuje się po odświeżeniu, tak jak wszystkie inne przeglądarki. Wygląda więc na to, że do tej pory odkryłem, że Firefox zachowa wyłączony atrybut, a także rzeczywistą wartość danych wejściowych, ale nie rozmiar ...
Stephen Mesa
5
Wow, masz rację! Ustawiłem autocomplete = "off" na wejściu i tak się już nie dzieje. To dość niewygodne, że Firefox domyślnie to włącza!
Stephen Mesa
3
Tak, zapomniałem, że możesz to wyłączyć za pomocą autocomplete="off". Ten post na blogu wygląda znajomo, więc na pewno spotkałem się z tym wcześniej. Powinieneś napisać odpowiedź na swoje własne pytanie (czy powinienem?)
trzydzieści dni
1
Jest na ten temat otwarty raport o błędzie Mozilli: bugzilla.mozilla.org/show_bug.cgi?id=654072
cvrebert

Odpowiedzi:

126

Jest to „funkcja” przeglądarki Firefox, która zapamiętuje wartości wejściowe formularzy podczas odświeżania strony. Aby naprawić to zachowanie, wystarczy ustawić autocomplete="off"w formularzu zawierającym dane wejściowe lub bezpośrednio do danych wejściowych.

To zatrzymuje działanie autouzupełniania i uniemożliwia przeglądarce zapamiętywanie stanu pól wejściowych.

Alternatywnie możesz po prostu „odświeżyć na stałe”, klikając CTRL + F5. Spowoduje to całkowite zresetowanie bieżącej strony.

Stephen Mesa
źródło
4
Po prostu napotkałem ten problem, gdy użytkownik kliknie przycisk Wstecz, wydaje się, że autocomplete="off"w tym przypadku nie działa.
solarc
1
nie chcę formularza, mam tylko jeden przycisk, a Firefox „pamięta”, że jest wyłączony… irytujące. Mogę to zresetować przez JS, ale… fatalnie.
vsync
@vsync Spróbuj ustawić to na przycisku / elemencie wejściowym. To też powinno działać!
Henrik Heimbuerger
4
Musisz to nawet zrobić na przyciskach. Trudno mi uwierzyć, że to funkcja, a nie błąd?
Liam
1
dotyczy to również ukrytych wejść
Liam
10

Aby poradzić sobie z przyciskiem Wstecz, zrób to ( stąd )

    window.addEventListener('pageshow', PageShowHandler, false);
    window.addEventListener('unload', UnloadHandler, false);

    function PageShowHandler() {
        window.addEventListener('unload', UnloadHandler, false);
    }

    function UnloadHandler() {
        //enable button here
        window.removeEventListener('unload', UnloadHandler, false);
    }
Joshua Fox
źródło
Nie wiem, dlaczego ta odpowiedź ma tylko jeden głos pozytywny, podczas gdy druga odpowiedź ma 99. Przywrócenie stanu wyłączonego przy zwalnianiu jest lepsze niż wyłączenie autouzupełniania, ponieważ autouzupełnianie jest pożądaną funkcją.
Nick
Myślę, że //enable button heretutaj jest to zbędne; Moje rozumienie odwoływanych dokumentów jest takie, że sama obecność detektora zdarzeń uniemożliwi przechowywanie strony w BFcache.
myf
Zauważ, że dodanie modułu obsługi wyładowania ma inne skutki uboczne w Firefoksie: developer.mozilla.org/en-US/docs/Mozilla/Firefox/Releases/1.5/ ...
robocat
2

Jak wspomniano wcześniej, musisz dodać autocomplete="off"do swoich przycisków.

Oto krótki opis sh+, perlktóry zautomatyzuje to w przypadku <button>s w plikach / szablonach HTML (przy pewnych założeniach):

find /path/to/html/templates -type f -name '*.html' -exec perl -pi -e \
  's/(?<=<button )(.*?)(?=>)/@{[(index($1,"autocomplete=")!=-1?"$1":"$1 autocomplete=\"off\"")]}/g' \
  {} +

Założenia są następujące:

  • <button>Tagi otwierające zaczynają się i kończą w tej samej linii. Jeśli nie jest to przypadek (tj mogą być podzielone na kilka linii), a następnie zastąpienie /gze /gspowinno pomóc (The smodyfikujących przyczyn .pasujące do nowej linii, jak również)

  • Prawidłowy kod HTML (np. Nie ma zabawnych znaków między <i >) i nie ma znaków większych niż ( >) bez znaku zmiany znaczenia w otwierającym tagu.

phk
źródło
0

To jest rzeczywiście otwarty błąd w Firefoksie. W MDNautocomplete jest też uwaga : (przewiń w dół do drugiego żółtego pola):

Uwaga: autocompleteatrybut również kontroluje, czy Firefox - w przeciwieństwie do innych przeglądarek - utrzymują stanu dynamicznego niepełnosprawnych oraz (jeśli dotyczy) Dynamiczny checkedness danego <input>elementu, <textarea>elementu lub całych <form>drugiej stronie ładunku. Funkcja utrwalania jest domyślnie włączona. Ustawienie wartości autocompleteatrybutu naoff wyłącza tę funkcję. Działa to nawet wtedy, gdy atrybut autouzupełniania normalnie nie miałby zastosowania ze względu na swój typ. Zobacz błąd 654072 .

Jeśli używasz Bootstrap, możesz być zainteresowany

str
źródło