Dependència de camps en formularis

Publicat el 16/12/2007

El problema

Quan es planteja un formulari X/HTML amb una jerarquia entre ells poden apareixer diversos problemes:

Un dels casos més típics és el d'un grup de radiobutton on cada un d'ells té associat un camp de text.

Possibles solucions

Primera aproximació (fallida)

Es podria considrar és quelcom del tipus:


<label for="dni">
   <input type="radio" name="identificador" id="dni" value="dni" />
   <label for="numero-dni">
      DNI: <input type="text" name="numero-dni" id="numero-dni" />
      </label>
</label>

Aquesta estructura intenta resoldre la relació posant un LABEL dins de l'altre i alhora plantejar la parella LABEL/INPUT filla com a text del LABEL pare.

Aquest planteig és erroni ja que l'especificació HTML no permet usar un LABEL dins d'un altre:


<!ELEMENT LABEL - - (%inline;)* -(LABEL) -- form field label text -->

Segona aproximació

Donat que els agrupadors preferibles per formularis són els FIELDSET i que aquests poden titular-se mitjançant LEGEND es pot considerar el següent:


<fieldset>
   <legend>
      <label for="dni">
         <input type="radio" name="identificador" id="dni" value="dni" />
         DNI
      </label>
   </legend>
   <label for="numero-dni">
      Número:
      <input type="text" name="numero-dni" id="numero-dni" />
   </label>
</fieldset>

D'aquesta manera la relació de jerarquia queda perfectament descrita. El LABEL del radiobutton passa a ser “DNI” mentre que el del camp de text quedaria com a “Número:”

Aquesta solució pot donar problemes a l'hora de canviar l'aparença mitjançant CSS ja que l'element LEGEND té un comportament erràtic i poc consistent entre els diferents navegadors.

Tercera aproximació

Una altre manera de marcar la jerarquia de parelles títol/contingut és mitjançant llistes de definició per tant es pot considerar:


<dl>
   <dt>
      <label for="dni">
         <input type="radio" name="identificador" id="dni" value="dni" />
         DNI
      </label>
   </dt>
   <dd>
      <label for="numero-dni">
         Número:
         <input type="text" name="numero-dni" id="numero-dni" />
      </label>
   </dd>
</dl>

Així, cada DT contindria un radiobutton mentre que al DD hi hauria els camps dependents.

Aquest darrer exemple, a més a més, deixa clara la relació de llista dels radiobutton.

Un exemple sencer:


<dl>
   <dt>
      <label for="dni">
         <input type="radio" name="identificador" id="dni" value="dni" />
         DNI
      </label>
   </dt>
   <dd>
      <label for="numero-dni">
         Número:
         <input type="text" name="numero-dni" id="numero-dni" />
      </label>
   </dd>
   <dt>
      <label for="passaport">
         <input type="radio" name="identificador" id="passaport" value="passaport" />
         Passaport
      </label>
   </dt>
   <dd>
      <label for="numero-passaport">
         Número:
         <input type="text" name="numero-passaport" id="numero-passaport" />
      </label>
   </dd>
</dl>

Comentaris

Afegir un comentari