X-Space

Aller au contenu | Aller au menu | Aller à la recherche

Is it a bug ?

Le Bug

Dans un formulaire, j'utilise dans un un champ input de type hidden pour masquer une valeur nécessaire à un traitement php. Or il s'est avéré que ce champ ne se vidait pas même après un reset du formulaire. Après m'être arraché les cheveux pendant plusieurs heures, j'ai décidé de mettre en place un protocole de test pour localiser le problème.

Le Protocole de test

  1. Un formulaire simple: 2 champs de type text et un de type hidden.
  2. Le champ 1 doit être rempli manuellement.
  3. Et les deux autres sont remplis via une petite fonction javascript qui copie les valeurs.
  4. On reset le formulaire.
  5. On valide le formulaire.
  6. Ne reste plus qu'a afficher le contenu des variables du formulaire.

Théoriquement, toutes les valeurs sont vides. Or il s'avère que sous Firefox et Opera le champ hidden contient toujours une valeur. Sous Internet Explorer par contre le champ est bien vidé. L'utilisation du plugin Firefox Web developer permet de constater ceci de visu en affichant les détails du formulaire.

Le test

Que pensez de cela? Est ce normal?

Regardons la spécification HTML 4.01 du W3C.

hidden controls

Authors may create controls that are not rendered but whose values are submitted with a form. Authors generally use this control type to store information between client/server exchanges that would otherwise be lost due to the stateless nature of HTTP (see [RFC2616]). The INPUT element is used to create a hidden control.

reset buttons

When activated, a reset button resets all controls to their initial values.

Initial Value

In general, a control's "initial value" may be specified with the control element's value attribute.

En résumé, un champ hidden permet de stocker de façon cachée des données. Et le bouton reset doit remettre les valeurs des formulaires à leur valeur par défaut. Mais ceci n'explique pas le comportement de Firefox et Opera.?

En creusant un peu plus, je suis tombé sur la spécification HTML 2.0 du champ de type hidden.

Hidden Field

The user does not interact with this field instead, the VALUE attribute specifies the value of the field.

L'utilisateur ne doit pas interagir avec ce champ!

Mes Conclusions

Il semble que les développeurs des navigateurs web aient interprétés ceci en désactivant la fonction reset sur les champs hidden. Mais ceci est une mauvaise interprétation de la spécification car si on considère que l'on ne doit pas interagir avec le champ alors on ne doit pas pouvoir le modifier par JavaScript. D'autre part, le fait de la remettre à zéro n'est pas problématique car si l'on ne peut interagir avec ce champ sa valeur est défini par value donc en faisant un reset on redonne au champ cette valeur, ce qui ne modifie pas la valeur.

N'ayant pas trouvé de spécification de Firefox me permettant de connaître les choix d'implémentation des développeurs, je ne vois pas d'autres hypothèses.

Ma Solution

Pour contourner cette limitation, j'ai tout simplement redéfini le fonctionnement de reset() par une fonction javascript qui effectue un reset et force la valeur du champ à la chaîne vide. Reste plus qu'a lier cette fonction à l'événement onreset de l'élément form.

Commentaires

1. Le dimanche, octobre 1 2006, 22:45 par TitaX

Bizar comme bug, mais bon ton coutournement ira très bien.

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

Fil des commentaires de ce billet