Bug avec Firefox - Attribut désactivé de l'entrée qui ne se réinitialise pas lors de l'actualisation

103

J'ai trouvé ce que je crois être un bogue avec Firefox et je me demande s'il s'agit réellement d'un bogue, ainsi que des solutions de contournement pour cela.

Si vous créez une page Web de base avec la source suivante:

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

Si vous disablel' textboxactualisez dynamiquement puis actualisez la page, le textboxrestera désactivé au lieu de revenir à son état d'origine non désactivé. J'ai essayé cela dans IE8 et Chrome et ceux-ci se comportent comme je m'y attendais, en réinitialisant le textboxdos pour qu'il ne soit pas désactivé lorsque je rafraîchis.

Une autre information intéressante est qu'il fait toujours la même chose si l'entrée est a checkboxau lieu de a textbox.

Stephen Mesa
la source
2
Êtes-vous sûr que ce n'est pas seulement la "fonctionnalité" de Firefox où elle se souvient de l'état des inputéléments lorsque vous actualisez simplement?
thirtydot
@thirtydot: Je me posais des questions à ce sujet aussi, alors j'ai également essayé de tester la définition dynamique de l'attribut "size", et cela se réinitialise lors de l'actualisation, comme tous les autres navigateurs. Il semble donc que ce que j'ai découvert jusqu'à présent, c'est que Firefox conservera l'attribut désactivé ainsi que la valeur réelle de l'entrée, mais pas la taille ...
Stephen Mesa
5
Wow, tu as raison! J'ai mis autocomplete = "off" sur l'entrée et cela ne se produit plus. C'est assez gênant que Firefox active cela par défaut!
Stephen Mesa
3
Ouais, j'avais oublié que tu pouvais le désactiver avec autocomplete="off". Ce billet de blog me semble familier, donc je l'ai certainement déjà rencontré. Vous devriez écrire une réponse à votre propre question (ou devrais-je?)
Thirtydot
1
Il y a un rapport de bogue Mozilla ouvert à ce sujet: bugzilla.mozilla.org/show_bug.cgi?id=654072
cvrebert

Réponses:

126

Il s'agit d'une "fonctionnalité" de Firefox qui se souvient des valeurs d'entrée des formulaires lors des actualisations de la page. Pour corriger ce problème, il vous suffit de définir autocomplete="off"sur le formulaire contenant les entrées, ou tout simplement directement à l'entrée.

Cela arrête le fonctionnement de la saisie semi-automatique et empêche le navigateur de se souvenir de l'état des champs de saisie.

Alternativement, vous pouvez simplement "actualiser dur" en cliquant sur CTRL + F5. Cela réinitialisera complètement la page actuelle.

Stephen Mesa
la source
4
Je viens de frapper ce problème lorsque l'utilisateur clique sur le bouton de retour, semble autocomplete="off"ne pas fonctionner dans ce cas.
solarc
1
Je ne veux pas de formulaire, j'ai juste un seul bouton et Firefox "se souvient" qu'il est désactivé .. ennuyeux. Je peux le réinitialiser via JS mais ... assez bien.
vsync
@vsync Essayez de le définir sur l'élément bouton / entrée. Ça devrait marcher aussi!
Henrik Heimbuerger
4
Vous devez même le faire sur les boutons. J'ai du mal à croire que c'est une fonctionnalité et non un bug?
Liam
1
cela affecte également les entrées cachées aussi
Liam
10

Pour gérer le bouton de retour, procédez comme suit (à partir d' ici )

    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
la source
Je ne sais pas pourquoi cette réponse n'a qu'une seule voix alors que l'autre réponse en a 99. La restauration de l'état désactivé lors du déchargement est préférable à la désactivation de la saisie semi-automatique, car la saisie semi-automatique est une fonctionnalité souhaitable.
Nick
Je pense que //enable button herec'est redondant ici; ma compréhension des documents référencés est que la simple présence d'un écouteur d'événement empêchera la page d'être stockée dans le BFcache.
myf
Notez que l'ajout d'un gestionnaire de déchargement a d'autres effets secondaires dans Firefox: developer.mozilla.org/en-US/docs/Mozilla/Firefox/Releases/1.5
...
2

Comme mentionné précédemment, vous devez ajouter autocomplete="off"à vos boutons.

Voici un sh+ perlextrait pour automatiser cela dans le cas de <button>s dans vos fichiers / modèles HTML (sous certaines hypothèses):

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

Les hypothèses sont:

  • Les <button>balises d' ouverture commencent et se terminent sur la même ligne. Si ce n'est pas le cas (c'est-à-dire qu'ils peuvent être répartis sur plusieurs lignes), le remplacement /gpar /gsdevrait aider (le smodificateur fait également .correspondre les nouvelles lignes)

  • HTML valide (par exemple, il n'y a pas de caractères amusants entre <et >) et aucun plus grand que ( >) sans échappement à l'intérieur de la balise d'ouverture.

phk
la source
0

Il s'agit en effet d'un bogue ouvert dans Firefox. Il y a aussi une note dans MDN:autocomplete (faites défiler jusqu'à la deuxième case jaune):

Remarque: L' autocompleteattribut contrôle également si Firefox, contrairement aux autres navigateurs, conservera l'état de désactivation dynamique et (le cas échéant) la vérification dynamique d'un <input>élément, d'un élément <textarea>ou de l'intégralité des <form>chargements de page. La fonction de persistance est activée par défaut. La définition de la valeur de l' autocompleteattribut pouroff désactiver cette fonctionnalité. Cela fonctionne même lorsque l'attribut de saisie semi-automatique ne s'appliquerait normalement pas en raison de son type. Voir le bogue 654072 .

Si vous utilisez Bootstrap, vous pourriez être intéressé par le

str
la source