.. highlight:: html
Formularios
***********
Los documentos |HTML| no sólo están pensados para ofrecer información al lector
y que éste la reciba pasivamente, sino que permiten asimismo que éste interactúe
con el documento, bien para influir directamente sobre él bien para que el navegador
retransmita el fruto de esta interacción al servidor web y una aplicación que
corre en él, asociada al documento, lleve a cabo alguna tarea. Por ejemplo:
* Un documento |HTML| podría tener asociados distintos aspectos visuales (temas
o estilos) para cada uno de los cuales hubiera un |CSS| distinto. Un botón, en
algún lugar del documento, podría permitir el cambio de estilo (o sea, el
cambio del archivo |CSS| aplicable). Para ello, no se necesita el concurso de
ninguna aplicación de servidor, pero el lector interactúa con el documento
para hacerle saber su preferencia.
* Un documento |HTML| como `éste de la Consejería de Educación
`_
permite rellenar una serie de campos de formulario para determinar cuáles
son nuestras preferencias de estudio. Al completarlas y envíar la consulta, se
envían los datos al servidor que realiza una consulta en una base de datos y
devuelve el resultado de dicha consulta.
Nuestra intención es conocer cómo se construyen estos formularios sin
preocuparnos de la acción que desencadenan, puesto que el primer ejemplo
requiere de programación con Javascript_ en el lado del cliente, y el segundo,
programación con algún lenguaje de programación apropiado\ [#]_.
Como curiosidad, más histórica que otra cosa, los campos de formulario siempre
fueron unos de los elemenos |HTML| para los que más código *Javascript* se
escribía, ya que lo lógico era comprobar la validez de los datos introducidos
por el usuario antes de enviarlos al servidor. Sin embargo, |HTML|\ 5 introdujo
muchos atributos para llevar a cabo estas comprobaciones, de manera que la
inmensa mayor parte del código *Javascript* requerido antes para esta tarea,
ahora es absolutamente innecesario.
Declaración del formulario
==========================
Lo habitual es que todos los campos de formulario estén asociados a un
formulario, aunque no es obligatorio\ [#]_, ya que el formulario es el que
determina qué hacer con los datos recabados.
.. table:: Campo de formulario
:class: el-html
+-----------+----------------------------------------------------------------+
| |form| | Declara la existencia de un formulario |
+-----------+----------------------------------------------------------------+
.. index:: form
.. _html-form:
**form** (:devmoz:`form`)
Es el elemento encargado de definir un formulario, esto es de albergar los
campos del formulario y determinador qué se hace con los datos recabados en
él. Es un elemento de bloque que puede contener casi cualquier otro elemento\
[#]_, con especial excepción de otro elemento |form|. Dicho en otras
palabras, no pueden anidarse formularios.
.. table:: Atributos de form
:class: attr-html
+--------------+------------+--------------------------------------------------+
| action | url | |URL| a la que se envían los datos para que |
| | | una aplicación en el servidor la procese. |
+--------------+------------+--------------------------------------------------+
| method | | get|post | | Método de envío de los datos al servidor. |
| | | dialog | | El formulario se asocia a un elemento |dialog|.|
+--------------+------------+--------------------------------------------------+
| name | nombre | Nombre del formulario. Útil en algunas |
| | | ocasiones. En |HTML|\ 5 se prefiere el uso |
| | | del atributo *id*. |
+--------------+------------+--------------------------------------------------+
| target | valor | Con igual significado que el atributo |
| | | homónimo de |a|. |
+--------------+------------+--------------------------------------------------+
| novalidate | \- | No realiza comprobaciones a los campos. |
+--------------+------------+--------------------------------------------------+
| autocomplete | off|on | Permite (o no) que el navegador complete |
| | | automáticamente los campos de texto |
| | | atendiendo a los criterios que tenga |
| | | establecidos (p.e. valores previos |
| | | introducidos en campos con el mismo nombre). |
+--------------+------------+--------------------------------------------------+
Los principales atributos del elemento son *action* y *method*, aunque el
segundo tiene como valor predeterminado "*get*". Un ejemplo, de uso de este
elemento podría ser:
.. code-block:: html
Este código implicaría que los nombres y valores de campos de formulario
incluidos dentro del elemento |form|:
.. code-block:: none
nombre=Pepe&apellidos=Ruiz%20Valera
se enviarían por el método ``POST`` de |HTTP| a la dirección
:file:`consulta.php` donde debería haber un *script* |PHP| que procesara los
datos y devolviera una página de respuesta.
.. note:: Cuando el método de envío (*method*) es *dialog*, los datos del
formulario no se envían a ningún servidor, sino que el formulario se
asociará a un elemento |dialog| que lo contenga. El envío del formulario
supondrá el cierre del |dialog| y, además, el *returnValue* del |dialog|
adoptará el valor del botón con el que se envió. Más adelante, al tratar
este elemento, se proporciona un ejemplo de este comportamiento.
Introducción manual de datos
=============================
Trataremos bajo este epígrafe los mecanimos de |HTML|\ 5 que permiten al usuario
la introducción de datos no preestablecidos. Los dos elementos |HTML| destinados a ello
son:
.. table:: Campo de introducción de datos
:class: el-html
+------------+----------------------------------------------------------------+
| |input| | Permite la introducción de datos de extensión reducida |
+------------+----------------------------------------------------------------+
| |textarea| | Permite la introducción de datos de gran extensión |
+------------+----------------------------------------------------------------+
.. index:: input
.. _html-input:
**input** (:devmoz:`input`)
Es el elemento destinado a la introducción de datos de pequeña extensión. Es
un elemento muy versátil, ya que gracias a su atributo *type*, permite
preparar al navegador para recibir datos de muy distinta naturaleza. Por este
motivo no declararemos de una sola vez cuáles son todas sus posibilidades,
sino que iremos desglosando estas a lo largo de toda la lección. Por ahora,
nos limitaremos a declarar cuáles son sus atributos comunes y cómo usarlos
para escribir texto en general.
.. table:: Atributos comunes de input
:class: attr-html
+--------------+----------+-----------------------------------------------+
| autocomplete | off|on | Permite al navegador autocompletar este campo |
| | | de manera análoga al atributo de |form| que |
| | | se aplica en general sobre todos los campos |
| | | del formulario. |
+--------------+----------+-----------------------------------------------+
| autofocus | \- | Atrae hacia sí el foco. Por tanto, debería |
| | | tener este atributo aquel campo que queremos |
| | | que sea el primero en rellenar el usuario. |
+--------------+----------+-----------------------------------------------+
| disabled | \- | Deshabilita el campo. Comúnmente se añade |
| | | con intención de que alguna acción de usuario |
| | | (como rellenar otro campo), borre el atributo.|
+--------------+----------+-----------------------------------------------+
| form | id | Identificador del formulario al que pertenece |
| | | el campo. Si no se incluye, pertenecerá al |
| | | formulario que contiene al campo. |
+--------------+----------+-----------------------------------------------+
| list | id | Identificador de la |datalist| con valores |
| | | predefinidos para sugerir al usuario. |
+--------------+----------+-----------------------------------------------+
| name | nombre | Nombre identificativo del campo usado cuando |
| | | se envía al servidor. |
+--------------+----------+-----------------------------------------------+
| pattern\ [#]_| regexp | :ref:`Expresión regular ` con |
| | | la que debe concordar |
| | | el valor del campo para considerarse válido. |
+--------------+----------+-----------------------------------------------+
| placeholder | valor | Sugerencia al usuario. Aparecerá en un color |
| | | gris claro. |
+--------------+----------+-----------------------------------------------+
| readonly | \- | Campo de sólo lectura. |
+--------------+----------+-----------------------------------------------+
| required | \- | El campo es obligatorio. |
+--------------+----------+-----------------------------------------------+
| value | valor | Valor inicial del campo. |
+--------------+----------+-----------------------------------------------+
| type | tipo | Tipo de campo. Esta es la madre del cordero. |
+--------------+----------+-----------------------------------------------+
.. caution:: Un campo deshabilitado no solamente no puede ser rellenado, sino
que además no se envía al remitir el formulario al servidor. Esto es lo
que los diferencia de un campo de sólo lectura.
.. seealso:: Si quiere saber más sobre *expresiones regulares* consulte
:ref:`este extenso tutorial `.
.. _html-input-text:
.. _html-input-search:
.. _html-input-password:
.. _html-input-hidden:
.. _html-input-url:
.. _html-input-email:
En cuanto a los tipos de campos posibles, algunos de ellos son:
.. table:: Valores de type para texto general.
:class: attr-html
+--------------+-----------+-----------------------------------------------+
| type | text_ | Texto libre. Es el valor predeterminado. |
+--------------+-----------+-----------------------------------------------+
| type | search_ | Términos de búsqueda. |
+--------------+-----------+-----------------------------------------------+
| type | password_ | Contraseñas (no se ven los caracteres). |
+--------------+-----------+-----------------------------------------------+
| type | hidden_ | Campo oculto. No aparece, pero es enviado. |
+--------------+-----------+-----------------------------------------------+
| type | url_ | Exige una |URL|. |
+--------------+-----------+-----------------------------------------------+
| type | email_ | Exige una dirección de correo electrónico. |
+--------------+-----------+-----------------------------------------------+
Los tipos *url* e *email* no permiten cualquier valor, sino uno que el
navegador considera válido para el tipo correspondiente.
.. note:: Con el atributo *pattern* podemos restringir los valores posibles,
de modo que en muchos casos para la validez podríamos prescindir del tipo.
Sin embargo, no debe ser así, puesto que la semántica es importante y,
además, el tipo puede provocar cambios en el comportamiento del navegador.
Por ejemplo, cuando el tipo es numérico, no es posible escribir letras
aunque se pulsen y, en el caso de ser el dispositivo un teléfono móvil,
aparecerá un teclado numérico exclusivamente.
Ejemplo:
.. code-block:: html
.. rst-class:: ej-html
.. raw:: html
.. note:: Puede usarse *title* para informar al usuario de cuáles son las
restricciones sobre los campos.
.. index:: textarea
.. _html-textarea:
**textarea** (:devmoz:`textarea`)
Permite rellenar un campo de texto de gran extensión.
.. table:: Atributos de textarea
:class: attr-html
+--------------+--------------------+-----------------------------------------------+
| rows | num | Número de filas del recuadro de texto. |
+--------------+--------------------+-----------------------------------------------+
| cols | num | Número de columnas del recuadro de texto. |
+--------------+--------------------+-----------------------------------------------+
| maxlength | num | Longitud máxima en caracteres del contenido |
+--------------+--------------------+-----------------------------------------------+
| minlength | num | Longitud mínima en caracteres del contenido |
+--------------+--------------------+-----------------------------------------------+
| spellcheck | true|false|default | Define si se comprueban errores ortográficos |
+--------------+--------------------+-----------------------------------------------+
.. note:: *spellcheck* es un atributo global que puede usarse en cualquier
otro elemento. Cuando en un elemento su valor es "*default*", el elemento heredará el
valor que tuviera este atributo en otro elemento |HTML| antecesor suyo.
Datos numéricos
----------------
Hay tres tipos de campos |input| relacionados con valores numéricos:
.. table:: Valores de type para campos numéricos
:class: attr-html
+--------------+-----------+-----------------------------------------------+
| type | number_ | Valor numérico |
+--------------+-----------+-----------------------------------------------+
| type | range_ | Valor numérico de dentro de un rango |
+--------------+-----------+-----------------------------------------------+
| type | tel_ | Número de teléfono. |
+--------------+-----------+-----------------------------------------------+
.. _html-input-number:
El tipo **number** permite escribir números (enteros o decimales) y admite tres
atributos propios:
.. table:: Atributos para los tipos number y range
:class: attr-html
+--------------+-----------+-----------------------------------------------+
| max | num | Número máximo admisible |
+--------------+-----------+-----------------------------------------------+
| min | num | Número mínimo admisibles |
+--------------+-----------+-----------------------------------------------+
| step | num | Paso entre valores adminisbles |
+--------------+-----------+-----------------------------------------------+
Por ejemplo, esto permitirá indicar la edad en años de una persona:
.. code-block:: html
Edad: años
Por su parte, **range** habilita la introducción de un valor numérico que se
mueve dentro de un pequeño rango\ [#]_. Tiene los mismos atributos que el tipo
anterior, pero el navegador lo suele presentar de un modo muy distinto:
.. code-block:: html
Grado de satisfacción
.. rst-class:: ej-html
.. raw:: html
Grado de satisfacción
**tel** permite indicar valores que son números de teléfono. Este ejemplo
permite escribir números válidos en España::
Teléfono:
Fechas
------
Existen también tipos de |input| especiales para escribir horas y fechas:
.. _html-input-date:
.. _html-input-month:
.. _html-input-week:
.. _html-input-time:
.. _html-input-datetime-local:
.. table:: Valores de type para fechas
:class: attr-html
+--------------+-----------------+-----------------------------------------------+
| type | date_ | Fecha. |
+--------------+-----------------+-----------------------------------------------+
| type | month_ | Fecha (sólo mes y año) |
+--------------+-----------------+-----------------------------------------------+
| type | week_ | Semana del año |
+--------------+-----------------+-----------------------------------------------+
| type | time_ | Hora. |
+--------------+-----------------+-----------------------------------------------+
| type | datetime-local_ | Fecha y hora |
+--------------+-----------------+-----------------------------------------------+
Para todos estos tipos, el navegador facilitará la introducción de los datos:
.. code-block:: html
Fecha:
Hora:
.. rst-class:: ej-html
.. raw:: html
Fecha:
Hora:
.. _html-input-color:
Colores
-------
Para seleccionar colores existe un tipo particular:
.. table:: Valores de type para selección de color
:class: attr-html
+--------------+-----------------+-----------------------------------------------+
| type | color_ | Color |
+--------------+-----------------+-----------------------------------------------+
Ejemplo:
.. code-block:: html
Fondo:
Texto:
.. rst-class:: ej-html
.. raw:: html
Fondo:
Texto:
.. _html-form-sel:
Selección de datos
==================
Bajo este epígrafe trataremos los campos de formulario que habilita |HTML|\ 5
para seleccionar entre un conjunto predefinido y finito de valores. La
diferencia con las listas de sugerencias que podían ofrecernos los campos
anteriores es que, en este caso, estamos obligados a escoger entre las
alternativas propuestas.
.. _html-input-checkbox:
.. _html-input-radio:
Campos de selección
-------------------
Trataremos dos tipos distintos de |input|:
.. table:: Valores de type para campos de selección
:class: attr-html
+--------------+-----------------+-----------------------------------------------+
| type | checkbox_ | Genera casillas de verificación |
+--------------+-----------------+-----------------------------------------------+
| type | radio_ | Genera botones de opción |
+--------------+-----------------+-----------------------------------------------+
Ambos campos se comportan de forma semejante: son necesarios varios elementos
|input|, todos con el mismo valor del atributo *name* y permiten marcar el
campo mediante el uso del ratón. Además permiten el siguiente atributo:
.. table:: Atributos para los tipos checkbox y radio
:class: attr-html
+--------------+-----------+-----------------------------------------------+
| checked | \- | Marca preventivamente la opción |
+--------------+-----------+-----------------------------------------------+
La diferencia fundamental es que **radio** define opciones excluyentes, mientras
que las alternativas de *checkbox* no lo son. Por ejemplo:
.. code-block:: html
Escoja su sexo:
Varón Hembra
.. rst-class:: ej-html
.. raw:: html
Escoja su sexo:
Varón Hembra
Frente a esto otro:
.. code-block:: html
¿Cuál son sus medios de locomoción favoritos?
El coche
El barco
La motocicleta
La bicicleta
El tren
El avión
Otros
.. rst-class:: ej-html
.. raw:: html
¿Cuál son sus medios de locomoción favoritos?
El coche
El barco
La motocicleta
La bicicleta
El tren
El avión
Otros
.. _html-input-file:
Ficheros
--------
Existe un tipo particular para seleccionar uno o más ficheros locales:
.. table:: Valores de type para selección de color
:class: attr-html
+--------------+-----------------+-----------------------------------------------+
| type | file_ | Selecciona ficheros locales |
+--------------+-----------------+-----------------------------------------------+
El tipo tiene algunos atributos propios:
.. table:: Atributos de input para tipos *file*
:class: attr-html
+--------------+-----------------+-----------------------------------------------+
| accept | valores | Tipos de ficheros admisibles. Pueden usarse |
| | | tipos |MIME|, o extensiones de ficheros |
| | | separados por comas |
+--------------+-----------------+-----------------------------------------------+
| multiple | \- | Permite seleccionar más de un fichero |
+--------------+-----------------+-----------------------------------------------+
Ejemplo::
Seleccione avatar:
.. rst-class:: ej-html
.. raw:: html
Seleccione avatar:
.. note:: |HTML|\ 5 tiene una |API| *Drag & drop* (arrastrar y soltar) para
Javascript_ que entre otras muchas finalidades, puede servir para obtener
archivos arrastrándolos a un área definida en la página, en vez de
eligiéndolos como se ha expuesto aquí. Como esto requiere programar, que no
es el objetivo de esta unidad, lo dejaremos estar. Para más información,
puede consultarse `este artículo de web.dev sobre el asunto
`_.
.. index:: select, option, optgroup
Listas de selección
-------------------
Otra posibilidad que ofrecen los formularios |HTML| es la creación de listas de
selección, para las cuales se usan otros elementos distintos a |input|:
.. table:: Campos para listas de selección.
:class: el-html
+------------+----------------------------------------------------------------+
| |select| | Declara una lista desplegable |
+------------+----------------------------------------------------------------+
| |option| | Define un ítem de la lista |
+------------+----------------------------------------------------------------+
| |optgroup| | Agrupa ítems de la lista |
+------------+----------------------------------------------------------------+
.. _html-select:
**select** (:devmoz:`select`)
Elemento dentro del cual se define una lista de selección. Dispone de muchos de
los atributos aplicables a |input| con idéntico significado como *autofocus*,
*disabled*, *form*, *name* o *required*. Añade además:
.. table:: Atributos adicionales de *select*
:class: attr-html
+--------------+-----------------+-----------------------------------------------+
| multiple | \- | Permite seleccionar más de un ítem |
+--------------+-----------------+-----------------------------------------------+
| size | num | Cantidad de ítem que se visualizan a la vez |
+--------------+-----------------+-----------------------------------------------+
.. _html-option:
**option** (:devmoz:`option`)
Define cada uno de los ítem de la lista desplegable. Sus posibles atributos son:
.. table:: Atributos de *option*
:class: attr-html
+--------------+-----------------+-----------------------------------------------+
| disabled | \- | Deshabilita la selección de ese ítem |
+--------------+-----------------+-----------------------------------------------+
| selected | \- | Marca esta opción como seleccionada |
+--------------+-----------------+-----------------------------------------------+
| value | valor | El valor que se enviará si se selecciona este |
| | | ítem. |
+--------------+-----------------+-----------------------------------------------+
| label | texto | Texto del ítem |
+--------------+-----------------+-----------------------------------------------+
El elemento permite incluir contenido de texto que será el que se muestre a menos
que se incluya también el atributo *label*. Por ejemplo::
Nacionalidad:
se verá así:
.. rst-class:: ej-html
.. raw:: html
Nacionalidad:
Obsérvese que cada opción posible tiene un valor y que todos comparten el
nombre (*name*) definido a través del elemento |select|. De este modo, si se
eligiera la nacionalidad portuguesa, por mor de este campo se enviaría
:code:`name=pt`.
.. note:: Obsérvese que hay tres aspectos relacionados con el valor y cómo
se muestra en pantalla:
* El atributo *value* es el valor enviado, pero no es obligatoria su
presencia y, si no se encuentra, se envía el contenido del elemento.
* El contenido se muestra siempre que no exista la etiqueta *label* y
se usa como valor, siempre que no exista el atributo *value*.
* El atributo *label* es la leyenda que representa la opción, pero no
se usa como valor de envío.
.. _html-optgroup:
**optgroup** (:devmoz:`optgroup`)
Permite agrupar varios ítem bajo una misma categoría. Para ello, lo que se hace
es incluir los elementos |option| dependientes dentro de un mismo |optgroup|.
.. table:: Atributos de *optgroup*
:class: attr-html
+--------------+-----------------+-----------------------------------------------+
| disabled | \- | Deshabilita la selección de todos los ítem |
| | | incluidos dentro. |
+--------------+-----------------+-----------------------------------------------+
| label | texto | Texto que se usará para representar al grupo |
+--------------+-----------------+-----------------------------------------------+
Por ejemlo::
Nacionalidad:
que se verá:
.. rst-class:: ej-html
.. raw:: html
Nacionalidad:
Por último, hemos eludido hasta ahora el uso de las opciones *multiple* y
*size*. Cuando *size* es mayor que **1**, lo navegadores tienden a dejar de
mostrar la lista como una lista desplegable y pasan a mostrarla como una lista
con barra de *scroll*. El uso de *multiple*, además de permitir la selección de
varios ítem a la vez, pasa a mostrar la lista con barra de *scroll*::
Nacionalidad:
que se ve:
.. rst-class:: ej-html
.. raw:: html
Nacionalidad:
Botones
=======
Ningún formulario que se precisa sería tal, sino habilitamos un modo de enviar
los datos al formularios. Para ello se habilitan los botones de envío, aunque
no es su única función. Se encargan de:
* El **envío** del formulario.
* El **reseteo** del formulario, para recuperar los valores iniciales.
* No hacer nada. En realidad, más que no hacer nada lo que no tienen este tipo
de botones es una función predefinida, de modo que para que sean útiles es
necesario definirla a través de *Javascript*, lo cual se sale del propósito
de esta unidad.
Para implementar los botones hay dos elementos distintos con los que se puede
lograr la misma funcionalidad: el omnipresente |input| y |button|:
.. table:: Elemento *button*
:class: el-html
+------------+----------------------------------------------------------------+
| |button| | Permite definir botones en el formulario |
+------------+----------------------------------------------------------------+
.. index:: button
.. _html-button:
**button** (:devmoz:`button`)
Es el elemento que permite la inclusión con botones en los formularios |HTML| y
comparte esta función con algunos de los tipos de |input|. El contenido del
elemento define la forma en que se ve. Por tanto::
Mostrará un botón de texto y::
una imagen pulsable.
.. table:: Tipos de botones con el elemento *button*
:class: attr-html
+--------------+--------+--------------------------------------------------+
| type | submit | Envía los datos del formulario. Este es el valor |
| | | predeterminado |
+--------------+--------+--------------------------------------------------+
| type | reset | Resetea el formulario. |
+--------------+--------+--------------------------------------------------+
| type | button | Sin funcionalidad definida. |
+--------------+--------+--------------------------------------------------+
Estos tipos de botón tienen su equivalencia con *input*:
.. table:: Tipos de botones con el elemento *input*
:class: attr-html
+--------------+---------+--------------------------------------------------+
| type | submit_ | Equivale a :code:`