Fehler mit Firefox - Deaktiviertes Attribut der Eingabe, die beim Aktualisieren nicht zurückgesetzt wird

103

Ich habe herausgefunden, was meiner Meinung nach ein Fehler in Firefox ist, und ich frage mich, ob dies tatsächlich ein Fehler ist, sowie mögliche Problemumgehungen dafür.

Wenn Sie eine einfache Webseite mit der folgenden Quelle erstellen:

<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>

Wenn Sie disabledie Seite textboxdynamisch und dann aktualisieren, textboxbleibt die Seite deaktiviert, anstatt auf den ursprünglichen Status "Nicht deaktiviert" zurückzusetzen. Ich habe dies in IE8 und Chrome versucht und diese verhalten sich wie erwartet und setzen die textboxRückseite beim Aktualisieren auf nicht deaktiviert zurück.

Eine weitere interessante Information ist, dass es immer noch dasselbe tut, wenn die Eingabe a checkboxanstelle von a ist textbox.

Stephen Mesa
quelle
2
Sind Sie sicher, dass es nicht nur die Firefox- "Funktion" ist, bei der der Status von inputElementen beim einfachen Aktualisieren gespeichert wird?
dreißig Punkte
@thirtydot: Ich habe mich auch darüber gewundert, also habe ich auch versucht, mit dem dynamischen Festlegen des Attributs "Größe" zu experimentieren, und das wird wie alle anderen Browser beim Aktualisieren zurückgesetzt. Es sieht also so aus, als hätte ich bisher festgestellt, dass Firefox das deaktivierte Attribut sowie den tatsächlichen Wert der Eingabe beibehält, aber nicht die Größe ...
Stephen Mesa
5
Wow, du hast recht! Ich setze autocomplete = "off" am Eingang und dies passiert nicht mehr. Das ist ziemlich unpraktisch, dass Firefox das standardmäßig aktiviert!
Stephen Mesa
3
Ja, ich hatte vergessen, dass Sie es mit deaktivieren können autocomplete="off". Dieser Blog-Beitrag kommt mir bekannt vor, daher bin ich auf jeden Fall schon einmal darauf gestoßen. Sie sollten eine Antwort auf Ihre eigene Frage schreiben (oder sollte ich?)
dreißig Punkte
1
Es gibt einen offenen Mozilla-Fehlerbericht darüber: bugzilla.mozilla.org/show_bug.cgi?id=654072
cvrebert

Antworten:

126

Dies ist eine "Funktion" von Firefox, die Formulareingabewerte über Seitenaktualisierungen hinweg speichert. Um dieses Verhalten zu beheben, legen Sie einfach autocomplete="off"das Formular fest, das die Eingaben enthält, oder direkt die Eingabe.

Dies verhindert, dass die automatische Vervollständigung funktioniert, und verhindert, dass sich der Browser den Status der Eingabefelder merkt.

Alternativ können Sie einfach "hart aktualisieren", indem Sie auf STRG + F5 klicken. Dadurch wird die aktuelle Seite vollständig zurückgesetzt.

Stephen Mesa
quelle
4
Ich bin gerade auf dieses Problem gestoßen, als der Benutzer auf die Schaltfläche "Zurück" klickt. Dies scheint autocomplete="off"in diesem Fall nicht zu funktionieren.
Solarc
1
Ich möchte kein Formular, ich habe nur eine einzige Schaltfläche und Firefox "erinnert sich", dass es deaktiviert ist. Ich kann es aber über JS zurücksetzen.
vsync
@vsync Versuchen Sie es auf der Schaltfläche / dem Eingabeelement einzustellen. Sollte auch funktionieren!
Henrik Heimbuerger
4
Sie müssen dies sogar auf Schaltflächen tun. Es fällt mir schwer zu glauben, dass dies eine Funktion und kein Fehler ist.
Liam
1
Dies betrifft auch versteckte Eingaben
Liam
10

Um mit dem Zurück-Button umzugehen, tun Sie dies (von hier aus )

    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
quelle
Ich weiß nicht, warum diese Antwort nur eine Stimme hat, während die andere 99 hat. Das Wiederherstellen des deaktivierten Status beim Entladen ist besser als das Deaktivieren der automatischen Vervollständigung, da die automatische Vervollständigung eine wünschenswerte Funktion ist.
Nick
Ich denke, das //enable button hereist hier überflüssig; Mein Verständnis von verwiesenen Dokumenten ist, dass einfach die Anwesenheit eines Ereignis-Listeners verhindert, dass die Seite im BFcache gespeichert wird.
Myf
Beachten Sie, dass das Hinzufügen eines
Entlade-Handlers
2

Wie bereits erwähnt, müssen Sie autocomplete="off"Ihre Schaltflächen erweitern.

Hier ist ein sh+ perlSnippet, um dies im Fall von <button>s in Ihren HTML-Dateien / Vorlagen zu automatisieren (unter bestimmten Voraussetzungen):

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

Die Annahmen sind:

  • Das Öffnen von <button>Tags beginnt und endet in derselben Zeile. Wenn dies nicht der Fall ist (dh sie können über mehrere Zeilen aufgeteilt sein), sollte das Ersetzen /gdurch /gshelfen (der sModifikator bewirkt ., dass auch Zeilenumbrüche übereinstimmen).

  • Gültiges HTML (z. B. gibt es keine lustigen Zeichen zwischen <und >) und kein uneingeschränktes Zeichen größer als ( >) im Eröffnungs-Tag.

phk
quelle
0

Dies ist in der Tat ein offener Fehler in Firefox. Es gibt auch einen Hinweis in MDN:autocomplete (scrollen Sie nach unten zum zweiten gelben Feld):

Hinweis: Das autocompleteAttribut steuert auch, ob Firefox im Gegensatz zu anderen Browsern den dynamischen deaktivierten Status und (falls zutreffend) die dynamische Überprüfung eines <input>Elements, <textarea>Elements oder eines gesamten Elements <form>über Seitenladevorgänge hinweg beibehält . Die Persistenzfunktion ist standardmäßig aktiviert. Wenn Sie den Wert des autocompleteAttributs sooff einstellen, dass diese Funktion deaktiviert wird. Dies funktioniert auch dann, wenn das Autocomplete-Attribut aufgrund seines Typs normalerweise nicht angewendet wird. Siehe Fehler 654072 .

Wenn Sie Bootstrap verwenden, könnte Sie das interessieren

str
quelle