032.4 Lección 1
Certificación: |
Conceptos básicos de desarrollo web |
---|---|
Versión: |
1.0 |
Tema: |
032 Marcado de documentos HTML |
Objetivo: |
032.4 Formularios HTML |
Lección: |
1 de 1 |
Introducción
Los formularios web proporcionan una forma sencilla y eficaz de solicitar información de los visitantes desde una página HTML. El desarrollador de front-end puede utilizar varios componentes, como campos de texto, casillas de verificación, botones y muchos otros para crear interfaces que enviarán datos al servidor de forma estructurada.
Formularios HTML simples
Antes de saltar al código de marcado específico de los formularios, comencemos con un documento HTML simple en blanco, sin ningún contenido de cuerpo:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Working with HTML Forms</title>
</head>
<body>
<!-- The body content goes here -->
</body>
</html>
Guarde el ejemplo de código como un archivo de texto sin formato con una extensión .html
(por ejemplo form.html
) y use su navegador favorito para abrirlo. Después de modificar el código, presione el botón de recarga en el navegador para mostrar las modificaciones.
La estructura básica del formulario viene dada por la propia etiqueta <form>
y sus elementos internos:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Working with HTML Forms</title>
</head>
<body>
<!-- Form to collect personal information -->
<form>
<h2>Personal Information</h2>
<p>Full name:</p>
<p><input type="text" name="fullname" id="fullname"></p>
<p><input type="reset" value="Clear form"></p>
<p><input type="submit" value="Submit form"></p>
</form>
</body>
</html>
Las comillas dobles no son necesarias para atributos de una sola palabra como type
, por lo que el resultado no varía al usuar type=text
o type="text"
. El desarrollador puede elegir qué convención utilizar.
Guarde el nuevo contenido y vuelva a cargar la página en el navegador. Debería ver el resultado que se muestra en Figure 1.
La etiqueta <form>
por sí sola no produce ningún resultado notable en la página. Los elementos dentro de las etiquetas <form>…</form>
definirán los campos y otras ayudas visuales que se muestran al visitante.
El código de ejemplo contiene etiquetas HTML generales (<h2>
y <p>
) y la etiqueta <input>
, que es una etiqueta específica de formulario. Mientras que las etiquetas generales pueden aparecer en cualquier parte del documento, las etiquetas específicas del formulario deben usarse solo dentro del elemento <form>
; es decir, entre las etiquetas de apertura <form>
y de cierre </form>
.
Note
|
HTML proporciona solo etiquetas y propiedades básicas para modificar la apariencia estándar de los formularios. CSS proporciona mecanismos elaborados para modificar la apariencia del formulario, por lo que la recomendación es escribir código HTML que trate solo con los aspectos funcionales del formulario y modificar su apariencia con CSS. |
Como se muestra en el ejemplo, la etiqueta de párrafo <p>
se puede utilizar para describir el campo al visitante. Sin embargo, no hay una forma obvia de que el navegador pueda relacionar la descripción en la etiqueta <p>
con el elemento de entrada correspondiente. La etiqueta <label>
es más apropiada en estos casos (de ahora en adelante, considere que todos los ejemplos de código están dentro del cuerpo del documento HTML):
<form>
<h2>Personal Information</h2>
<label for="fullname">Full name:</label>
<p><input type="text" name="fullname" id="fullname"></p>
<p><input type="reset" value="Clear form"></p>
<p><input type="submit" value="Submit form"></p>
</form>
El atributo for
en la etiqueta <label>
contiene el id
del elemento de entrada correspondiente. Hace que la página sea más accesible, ya que los lectores de pantalla podrán decir el contenido del elemento de etiqueta cuando el de entrada esté enfocado. Además, los visitantes pueden hacer clic en la etiqueta para colocar el foco en su campo de entrada correspondiente.
El atributo id
funciona para elementos de formulario como lo hace para cualquier otro elemento en el documento. Proporciona un identificador para el elemento que es único en todo el documento. El atributo name
tiene un propósito similar, pero se usa para identificar el elemento de entrada en el contexto del formulario. El navegador usa el atributo name
para identificar el campo de entrada cuando envía los datos del formulario al servidor, por lo que es importante asignar valores significativos y únicos al atributo name
dentro del formulario.
type
es el atributo principal del elemento de entrada, porque controla el tipo de datos que acepta el elemento y su presentación visual para el visitante. Si no se proporciona el atributo type
, de forma predeterminada, la entrada muestra un cuadro de texto. Los siguientes tipos de entrada son compatibles con los navegadores modernos:
type valores |
Tipo de dato | Cómo se muestra |
---|---|---|
|
Una cadena arbitraria |
N/A |
|
Texto sin saltos de línea |
Un control de texto |
|
Texto sin saltos de línea |
Un control de búsqueda |
|
Texto sin saltos de línea |
Un control de texto |
|
Una URL absoluta |
Un control de texto |
|
Una dirección de correo electrónico o una lista de direcciones de correo electrónico |
Un control de texto |
|
Texto sin saltos de línea (información sensible) |
Un control de texto que oculta la entrada de datos |
|
Una fecha (año, mes, día) sin zona horaria |
Un control de fecha |
|
Una fecha que consta de un año y un mes sin zona horaria |
Control de un mes |
|
Una fecha que consta de un número de semana-año y un número de semana sin zona horaria |
Control de una semana |
|
Una hora (hora, minuto, segundo, fracción de segundo) sin zona horaria |
un control de tiempo |
|
Una fecha y hora (año, mes, día, hora, minuto, segundo, fracción de segundo) sin zona horaria |
Un control de fecha y hora |
|
Un valor numérico |
Un control de texto o un control giratorio |
|
Un valor numérico, con el extra semántico de que el valor exacto no es importante |
Un control deslizante o similar |
|
Un color sRGB con componentes rojo, verde y azul de 8 bits |
Un selector de color |
|
Un conjunto de cero o más valores de una lista predefinida |
Una casilla de verificación (ofrece opciones y permite seleccionar múltiples opciones) |
|
Un valor enumerado |
Un botón de radio (ofrece opciones y permite seleccionar solo una opción) |
|
Cero o más archivos, cada uno con un tipo MIME y un nombre de archivo opcional |
Una etiqueta y un botón |
|
Un valor enumerado, que finaliza el proceso de entrada y hace que se envíe el formulario |
Un botón |
|
Una coordenada, relativa al tamaño de una imagen en particular, que finaliza el proceso de entrada y hace que se envíe el formulario |
Una imagen en la que se puede hacer clic o un botón |
|
N/A |
Un botón genérico |
|
N/A |
Un botón cuya función es restablecer todos los demás campos a sus valores iniciales |
La apariencia de los tipos de entrada password
, search
, tel
, url
, e email
no difieren del tipo estándar de text
. Su propósito es ofrecer sugerencias al navegador sobre el contenido previsto para ese campo de entrada, por lo que el navegador o el script que se ejecuta en el lado del cliente puede realizar acciones personalizadas para un tipo de entrada específico. La única diferencia entre el tipo de entrada de texto y el de contraseña, por ejemplo, es que el contenido del campo de contraseña no se muestra cuando el visitante los escribe. En dispositivos de pantalla táctil, donde el texto se escribe con un teclado, el navegador solo puede mostrar el teclado numérico cuando una entrada de tipo tel
gana el foco. Otra acción posible es sugerir una lista de direcciones de correo electrónico conocidas cuando se trata de una entrada de tipo email
.
El tipo number
también aparece como una entrada de texto simple, pero con flechas de incremento/decremento a un lado. Su uso hará que el teclado numérico aparezca en los dispositivos con pantalla táctil cuando tenga el foco.
Los otros elementos de entrada tienen su propia apariencia y comportamiento. El tipo date
, por ejemplo, se representa de acuerdo con la configuración del formato de fecha local y se muestra un calendario cuando el campo gana el foco:
<form>
<p>
<label for="date">Date:</label>
<input type="date" name="date" id="date">
</p>
</form>
Figure 2 muestra cómo la versión de escritorio de Firefox representa actualmente este campo.
Note
|
Los elementos pueden aparecer ligeramente diferentes en diferentes navegadores o sistemas operativos, pero su funcionamiento y uso son siempre los mismos. |
Esta es una característica estándar en todos los navegadores modernos y no requiere opciones o programación adicionales.
Independientemente del tipo de entrada, el contenido de un campo de entrada se denomina value. Todos los valores de campo están vacíos de forma predeterminada, pero el atributo value
se puede utilizar para establecer un valor predeterminado para el campo. El valor del tipo de fecha debe utilizar el formato YYYY-MM-DD. El valor predeterminado en el siguiente campo de fecha es el 6 de agosto de 2020:
<form>
<p>
<label for="date">Date:</label>
<input type="date" name="date" id="date" value="2020-08-06">
</p>
</form>
Los tipos de entrada específicos ayudan al visitante a completar los campos, pero no le impiden eludir las restricciones e ingresar valores arbitrarios. Por eso es importante que los valores de los campos se validen cuando llegen al servidor.
Los elementos de formulario cuyos valores debe escribir el visitante pueden tener atributos especiales que ayuden a completarlos. El atributo placeholder
inserta un valor de ejemplo en el elemento de entrada:
<p>Address: <input type="text" name="address" id="address" placeholder="e.g. 41 John St., Upper Suite 1"></p>
El texto de ejemplo aparece dentro del elemento de entrada, como se muestra en Figure 3.
placeholder
.Una vez que el visitante comienza a escribir en el campo, el texto de ejemplo desaparece y no se envía como valor de campo si el visitante deja el campo vacío.
El atributo required
requiere que el visitante inserte un valor para el campo correspondiente antes de enviar el formulario:
<p>Address: <input type="text" name="address" id="address" required placeholder="e.g. 41 John St., Upper Suite 1"></p>
required
es un atributo booleano, por lo que puede colocarse solo (sin el signo igual). Es importante marcar los campos que son obligatorios, de lo contrario, el visitante no podrá saber qué campos faltan y evitar el envío del formulario.
El atributo autocomplete
indica si el navegador puede completar automáticamente el valor del elemento de entrada. Si se establece en autocomplete="off"
, entonces el navegador no sugiere valores pasados para completar la entrada. Los elementos de entrada para información confidencial, como números de tarjetas de crédito, deben tener el atributo autocomplete
establecido en off
.
Entrada para textos grandes: textarea
El elemento textarea
permite al visitante ingresar más de una línea de texto, a diferencia del campo de texto que solo permite una. El área de texto es un elemento separado, pero no se basa en el elemento de entrada:
<p> <label for="comment">Type your comment here:</label> <br>
<textarea id="comment" name="comment" rows="10" cols="50">
My multi-line, plain-text comment.
</textarea>
</p>
La apariencia típica de un textarea
es Figure 4.
textarea
.A diferencia de otros elementos de entrada textarea
tiene una etiqueta de cierre (</textarea>
), por lo que su contenido (es decir, su valor) va entre ellos. Los atributos rows
y cols
no limitan la cantidad de texto; se utilizan solo para definir el diseño. El área de texto también tiene un control en la esquina inferior derecha, lo que permite al visitante cambiar su tamaño.
Listas de opciones
Se pueden usar varios tipos de controles de formulario para presentar una lista de opciones al visitante: el elemento <select>
y los tipos de entrada radio
y checkbox
.
El elemento <select>
es un control desplegable con una lista de entradas predefinidas:
<p><label for="browser">Favorite Browser:</label>
<select name="browser" id="browser">
<option value="firefox">Mozilla Firefox</option>
<option value="chrome">Google Chrome</option>
<option value="opera">Opera</option>
<option value="edge">Microsoft Edge</option>
</select>
</p>
La etiqueta <option>
representa una sola entrada en el control <select>
correspondiente. La lista completa aparece cuando el visitante toca o hace clic en el control, como se muestra en Figure 5.
select
.La primera entrada de la lista está seleccionada de forma predeterminada. Para cambiar este comportamiento, puede agregar el atributo selected
a otra entrada para que se seleccione cuando se cargue la página.
El tipo de entrada radio
es similar al control <select>
, pero en lugar de una lista desplegable, muestra todas las entradas para que el visitante pueda marcar una de ellas. Los resultados del siguiente código se muestran en Figure 6.
<p>Favorite Browser:</p>
<p>
<input type="radio" id="browser-firefox" name="browser" value="firefox" checked>
<label for="browser-firefox">Mozilla Firefox</label>
</p>
<p>
<input type="radio" id="browser-chrome" name="browser" value="chrome">
<label for="browser-chrome">Google Chrome</label>
</p>
<p>
<input type="radio" id="browser-opera" name="browser" value="opera">
<label for="browser-opera">Opera</label>
</p>
<p>
<input type="radio" id="browser-edge" name="browser" value="edge">
<label for="browser-edge">Microsoft Edge</label>
</p>
radio
.Tenga en cuenta que todos los tipos de entrada radio
del mismo grupo tienen el mismo atributo name
. Cada uno de ellos es exclusivo, por lo que el atributo value
correspondiente para la entrada elegida será el asociado con el atributo name
compartido. checked
funciona como el atributo selected
del control <select>
. Marca la entrada correspondiente cuando la página se carga por primera vez. La etiqueta <label>
es especialmente útil para las entradas de radio, ya que permite al visitante comprobar una entrada haciendo clic o tocando el texto correspondiente además del control en sí.
Mientras que los controles de radio
están pensados para seleccionar una única entrada de una lista, el tipo de entrada checkbox
permite al visitante seleccionar varias:
<p>Favorite Browser:</p>
<p>
<input type="checkbox" id="browser-firefox" name="browser" value="firefox" checked>
<label for="browser-firefox">Mozilla Firefox</label>
</p>
<p>
<input type="checkbox" id="browser-chrome" name="browser" value="chrome" checked>
<label for="browser-chrome">Google Chrome</label>
</p>
<p>
<input type="checkbox" id="browser-opera" name="browser" value="opera">
<label for="browser-opera">Opera</label>
</p>
<p>
<input type="checkbox" id="browser-edge" name="browser" value="edge">
<label for="browser-edge">Microsoft Edge</label>
</p>
Las casillas de verificación también pueden usar el atributo checked
para hacer que las entradas se seleccionen de forma predeterminada. En lugar de los controles redondos de la entrada de radio, las casillas de verificación se representan como controles cuadrados, como se muestra en Figure 7.
checkbox
.Si se selecciona más de una entrada, el navegador las enviará con el mismo nombre, lo que requiere que el desarrollador de backend escriba un código específico para leer correctamente los datos del formulario que contienen casillas de verificación.
Para mejorar la usabilidad, los campos de entrada se pueden agrupar dentro de una etiqueta <fieldset>
:
<fieldset>
<legend>Favorite Browser</legend>
<p>
<input type="checkbox" id="browser-firefox" name="browser" value="firefox" checked>
<label for="browser-firefox">Mozilla Firefox</label>
</p>
<p>
<input type="checkbox" id="browser-chrome" name="browser" value="chrome" checked>
<label for="browser-chrome">Google Chrome</label>
</p>
<p>
<input type="checkbox" id="browser-opera" name="browser" value="opera">
<label for="browser-opera">Opera</label>
</p>
<p>
<input type="checkbox" id="browser-edge" name="browser" value="edge">
<label for="browser-edge">Microsoft Edge</label>
</p>
</fieldset>
La etiqueta <legend>
contiene el texto que se coloca en la parte superior del marco que la etiqueta <fieldset>
dibuja alrededor de los controles (Figure 8).
fieldset
.La etiqueta <fieldset>
no cambia la forma en que se envían los valores de campo al servidor, pero permite al desarrollador de la interfaz manipular los controles anidados más fácilmente. Por ejemplo, establecer disabled
en un atributo <fieldset>
hará que todos sus elementos internos no estén disponibles para el visitante.
El tipo de elemento hidden
Hay situaciones en las que el desarrollador quiere incluir información en el formulario que el visitante no puede manipular, es decir, enviar un valor elegido por el desarrollador sin presentar un campo de formulario donde el visitante puede escribir o cambiar el valor. El desarrollador puede querer, por ejemplo, incluir una ficha de identificación para ese formulario en particular que no necesita ser visto por el visitante. Un elemento de formulario oculto se codifica como en el siguiente ejemplo:
<input type="hidden" id="form-token" name="form-token" value="e730a375-b953-4393-847d-2dab065bbc92">
El valor de un campo de entrada oculto generalmente se agrega al documento en el lado del servidor, cuando se procesa el documento. Las entradas ocultas se tratan como campos ordinarios cuando el navegador las envía al servidor, que también las lee como campos de entrada ordinarios.
El tipo de entrada file
Además de los datos textuales, ya sea ingresados o seleccionados de una lista, los formularios HTML también pueden enviar archivos arbitrarios al servidor. El tipo de entrada file
permite al visitante elegir un archivo del sistema de archivos local y enviarlo directamente desde la página web:
<p>
<label for="attachment">Attachment:</label><br>
<input type="file" id="attachment" name="attachment">
</p>
En lugar de un campo de formulario para escribir o seleccionar un valor, el tipo de entrada file
muestra un botón browse
que abrirá un cuadro de diálogo de archivo. Cualquier tipo de archivo es aceptado por el tipo de entrada file
, pero el desarrollador de backend probablemente restringirá los tipos de archivos permitidos y su tamaño máximo. La verificación del tipo de archivo también se puede realizar en la interfaz agregando el atributo accept
. Para aceptar solo imágenes JPEG y PNG, por ejemplo, el atributo accept
debe ser accept="image/jpeg, image/png"
.
Botones de acción
De forma predeterminada, el formulario se envía cuando el visitante presiona la tecla Intro en cualquier campo de entrada. Para hacer las cosas más intuitivas, se debe agregar un botón de envío con el tipo de entrada submit
:
<input type="submit" value="Submit form">
El texto del atributo value
se muestra en el botón, como en Figure 9.
Otro botón útil para incluir en formularios complejos es el botón reset
, que borra el formulario y lo devuelve a su estado original:
<input type="reset" value="Clear form">
Al igual que el botón de envío, el texto del atributo value
se utiliza para etiquetar el botón. Alternativamente, la etiqueta <button>
se puede usar para agregar botones a formularios o en cualquier otro lugar de la página. A diferencia de los botones hechos con la etiqueta <input>
, el elemento del botón tiene una etiqueta de cierre y el texto entre ellas es su contenido interno:
<button>Submit form</button>
Cuando está dentro de un formulario, la acción predeterminada para el elemento button
es enviar el formulario. Al igual que los botones de entrada, el atributo de tipo del botón se puede cambiar a reset
.
Acciones y métodos de los formularios
El último paso para escribir un formulario HTML es definir cómo y adónde se deben enviar los datos. Estos aspectos dependen de los detalles tanto del cliente como del servidor.
En el lado del servidor, el enfoque más común es tener un archivo de secuencia de comandos que analizará, validará y procesará los datos del formulario de acuerdo con el propósito de la aplicación. Por ejemplo, el desarrollador de backend podría escribir un script llamado receive_form.php
para recibir los datos enviados desde el formulario. En el lado del cliente, el script se indica en el atributo action
de la etiqueta del formulario:
<form action="receive_form.php">
El atributo action
sigue las mismas convenciones que todas las direcciones HTTP. Si el script está en el mismo nivel jerárquico de la página que contiene el formulario, se puede escribir sin su ruta. De lo contrario, se debe proporcionar la ruta absoluta o relativa. El script también debe generar la respuesta para que sirva como página de destino, cargada por el navegador después de que el visitante envía el formulario.
HTTP proporciona distintos métodos para enviar datos de formularios a través de una conexión con el servidor. Los métodos más comunes son get
y post
, que deben indicarse en el atributo method
de la etiqueta form
:
<form action="receive_form.php" method="get">
O:
<form action="receive_form.php" method="post">
En el método get
, los datos del formulario se codifican directamente en la URL de la solicitud. Cuando el visitante envía el formulario, el navegador cargará la URL definida en el atributo action
con los campos del formulario adjuntos.
Se prefiere el método get
para pequeñas cantidades de datos, como formularios de contacto simples. Sin embargo, la URL no puede exceder algunos miles de caracteres, por lo que el método post
debe usarse cuando los formularios contienen campos grandes o no textuales, como imágenes.
El método post
hace que el navegador envíe los datos del formulario en la sección del cuerpo de la solicitud HTTP. Si bien es necesario para datos binarios que exceden el límite de tamaño de una URL, el método post
agrega una sobrecarga innecesaria a la conexión cuando se usa en formularios textuales más simples, por lo que se prefiere el método get
en tales casos.
El método elegido no afecta la forma en que el visitante interactúa con el formulario. Los métodos get
y post
son procesados de manera diferente por el script del lado del servidor que recibe el formulario.
Cuando se utiliza el método post
, también es posible cambiar el tipo MIME del contenido del formulario con el atributo enctype
. Esto afecta la forma en que los campos de formulario y los valores se apilarán juntos en la comunicación HTTP con el servidor. El valor predeterminado para enctype
es application/x-www-form-urlencoded
, que es similar al formato utilizado en el método get
. Si el formulario contiene campos de entrada de tipo file
, en su lugar debe usarse el enctype multipart/form-data
.
Ejercicios guiados
-
¿Cuál es la forma correcta de asociar una etiqueta
<label>
a una etiqueta<input>
? -
¿Qué tipo de elemento de entrada proporciona un control deslizante para elegir un valor numérico?
-
¿Cuál es el propósito del atributo de formulario
placeholder
? -
¿Cómo podría hacer que la segunda opción de un control de selección esté seleccionada por defecto?
Ejercicios de exploración
-
¿Cómo pudiera cambiar el comportamiento de un control de entrada de archivos para que solo acepte archivos PDF?
-
¿Cómo podría informar al visitante qué campos de un formulario son obligatorios?
-
Reúna tres fragmentos de código en esta lección en un solo formulario. Asegúrese de no utilizar el mismo atributo
name
oid
en varios controles de formulario.
Resumen
Esta lección cubre cómo crear formularios HTML simples para enviar datos al servidor. En el lado del cliente, los formularios HTML constan de elementos HTML estándares que se combinan para crear interfaces personalizadas. Además, los formularios deben configurarse para comunicarse correctamente con el servidor. La lección abarca los siguientes conceptos y procedimientos:
-
La etiqueta
<form>
y la estructura básica del formulario. -
Elementos de entrada básicos y especiales.
-
La función de etiquetas especiales como
<label>
,<fieldset>
y<legend>
. -
Botones y acciones de formulario.
Respuestas a los ejercicios guiados
-
¿Cuál es la forma correcta de asociar una etiqueta
<label>
a una etiqueta<input>
?El atributo
for
de la etiqueta<label>
debe contener la identificación de la etiqueta<input>
correspondiente. -
¿Qué tipo de elemento de entrada proporciona un control deslizante para elegir un valor numérico?
El tipo de entrada
range
. -
¿Cuál es el propósito del atributo de formulario
placeholder
?El atributo
placeholder
contiene un ejemplo de entrada para el visitante que es visible cuando el campo de entrada correspondiente está vacío. -
¿Cómo podría hacer que la segunda opción de un control de selección esté seleccionada por defecto?
El segundo elemento
option
debe tener el atributoselected
.
Respuestas a los ejercicios de exploración
-
¿Cómo pudiera cambiar el comportamiento de un control de entrada de archivos para que solo acepte archivos PDF?
El atributo
accept
del elemento de entrada debe establecerse enapplication/pdf
. -
¿Cómo podría informar al visitante qué campos de un formulario son obligatorios?
Por lo general, los campos obligatorios están marcados con un asterisco (
*
), y una nota breve como “Los campos marcados con * son obligatorios” se coloca cerca del formulario. -
Reúna tres fragmentos de código en esta lección en un solo formulario. Asegúrese de no utilizar el mismo atributo
name
oid
en varios controles de formulario.<form action="receive_form.php" method="get"> <h2>Personal Information</h2> <label for="fullname">Full name:</label> <p><input type="text" name="fullname" id="fullname"></p> <p> <label for="date">Date:</label> <input type="date" name="date" id="date"> </p> <p>Favorite Browser:</p> <p> <input type="checkbox" id="browser-firefox" name="browser" value="firefox" checked> <label for="browser-firefox">Mozilla Firefox</label> </p> <p> <input type="checkbox" id="browser-chrome" name="browser" value="chrome" checked> <label for="browser-chrome">Google Chrome</label> </p> <p> <input type="checkbox" id="browser-opera" name="browser" value="opera"> <label for="browser-opera">Opera</label> </p> <p> <input type="checkbox" id="browser-edge" name="browser" value="edge"> <label for="browser-edge">Microsoft Edge</label> </p> <p><input type="reset" value="Clear form"></p> <p><input type="submit" value="Submit form"></p> </form>