ABRIL 10/2019
Formularios en HTML
No obstante, la aparición de las aplicaciones AJAX ha relevado al tratamiento de formularios como la principal actividad de JavaScript. Ahora, el principal uso de JavaScript es el de las comunicaciones asíncronas con los servidores y el de la manipulación dinámica de las aplicaciones. De todas formas, el manejo de los formularios sigue siendo un requerimiento imprescindible para cualquier programador de JavaScript.
Para acceder al array
Además del array de formularios, el navegador crea automáticamente un array llamado
La sintaxis de los arrays no siempre es tan concisa. El siguiente
ejemplo muestra cómo obtener directamente el último elemento del primer
formulario de la página:
Aunque esta forma de acceder a los formularios es rápida y sencilla,
tiene un inconveniente muy grave. ¿Qué sucede si cambia el diseño de la
página y en el código HTML se cambia el orden de los formularios
originales o se añaden nuevos formularios? El problema es que "el primer formulario de la página" ahora podría ser otro formulario diferente al que espera la aplicación.
En un entorno tan cambiante como el diseño web, es muy difícil confiar en que el orden de los formularios se mantenga estable en una página web. Por este motivo, siempre debería evitarse el acceso a los formularios de una página mediante el array
Una forma de evitar los problemas del método anterior consiste en acceder a los formularios de una página a través de su nombre (atributo
Accediendo de esta forma a los formularios de la página, el script
funciona correctamente aunque se reordenen los formularios o se añadan
nuevos formularios a la página. Los elementos de los formularios también
se pueden acceder directamente mediante su atributo name:
Obviamente, también se puede acceder a los formularios y a sus
elementos utilizando las funciones DOM de acceso directo a los nodos. El
siguiente ejemplo utiliza la habitual función
Independientemente del método utilizado para obtener la referencia a
un elemento de formulario, cada elemento dispone de las siguientes
propiedades útiles para el desarrollo de las aplicaciones:
El siguiente código permite determinar si cada radiobutton ha sido seleccionado o no:
Si se dispone de los siguientes checkbox:
Utilizando la propiedad checked, es posible comprobar si cada checkbox ha sido seleccionado:
En general, lo que se requiere es obtener el valor del atributo
Como se ha visto, para obtener el valor del atributo
Lo más importante es no confundir el valor de la propiedad
Si un cuadro de texto de un formulario tiene el foco, el usuario puede escribir directamente en el sin necesidad de pinchar previamente con el ratón en el interior del cuadro. Igualmente, si una lista desplegable tiene el foco, el usuario puede seleccionar una opción directamente subiendo y bajando con las flechas del teclado.
Al pulsar repetidamente la tecla
Si en una página web el formulario es el elemento más importante, como por ejemplo en una página de búsqueda o en una página con un formulario para registrarse, se considera una buena práctica de usabilidad el asignar automáticamente el foco al primer elemento del formulario cuando se carga la página.
Para asignar el foco a un elemento de XHTML, se utiliza la función
Ampliando el ejemplo anterior, se puede asignar automáticamente el
foco del programa al primer elemento del primer formulario de la página,
independientemente del id del formulario y de los elementos:
El código anterior comprueba que existe al menos un formulario en la página mediante el tamaño del array
Para que el ejemplo anterior sea completamente correcto, se debe añadir una comprobación adicional. El campo de formulario que se selecciona no debería ser de tipo
Formularios
La programación de aplicaciones que contienen formularios web siempre ha sido una de las tareas fundamentales de JavaScript. De hecho, una de las principales razones por las que se inventó el lenguaje de programación JavaScript fue la necesidad de validar los datos de los formularios directamente en el navegador del usuario. De esta forma, se evitaba recargar la página cuando el usuario cometía errores al rellenar los formularios.No obstante, la aparición de las aplicaciones AJAX ha relevado al tratamiento de formularios como la principal actividad de JavaScript. Ahora, el principal uso de JavaScript es el de las comunicaciones asíncronas con los servidores y el de la manipulación dinámica de las aplicaciones. De todas formas, el manejo de los formularios sigue siendo un requerimiento imprescindible para cualquier programador de JavaScript.
Propiedades básicas de formularios y elementos
JavaScript dispone de numerosas propiedades y funciones que facilitan la programación de aplicaciones que manejan formularios. En primer lugar, cuando se carga una página web, el navegador crea automáticamente un array llamadoforms
y que contiene la referencia a todos los formularios de la página.Para acceder al array
forms
, se utiliza el objeto document
, por lo que document.forms
es el array que contiene todos los formularios de la página. Como se
trata de un array, el acceso a cada formulario se realiza con la misma
sintaxis de los arrays. La siguiente instrucción accede al primer
formulario de la página:document.forms[0];
elements
por cada uno de los formularios de la página. Cada array elements
contiene la referencia a todos los elementos (cuadros de texto,
botones, listas desplegables, etc.) de ese formulario. Utilizando la
sintaxis de los arrays, la siguiente instrucción obtiene el primer
elemento del primer formulario de la página:document.forms[0].elements[0];
document.forms[0].elements[document.forms[0].elements.length-1];
En un entorno tan cambiante como el diseño web, es muy difícil confiar en que el orden de los formularios se mantenga estable en una página web. Por este motivo, siempre debería evitarse el acceso a los formularios de una página mediante el array
document.forms
.Una forma de evitar los problemas del método anterior consiste en acceder a los formularios de una página a través de su nombre (atributo
name
) o a través de su atributo id
. El objeto document
permite acceder directamente a cualquier formulario mediante su atributo name
:var formularioPrincipal = document.formulario; var formularioSecundario = document.otro_formulario;
<form name="formulario" > ... </form> <form name="otro_formulario" > ... </form>
var formularioPrincipal = document.formulario; var primerElemento = document.formulario.elemento;
<form name="formulario"> <input type="text" name="elemento" /> </form>
document.getElementById()
para acceder de forma directa a un formulario y a uno de sus elementos:var formularioPrincipal = document.getElementById("formulario"); var primerElemento = document.getElementById("elemento");
<form name="formulario" id="formulario" > <input type="text" name="elemento" id="elemento" /> </form>
type
: indica el tipo de elemento que se trata. Para los elementos de tipo<input>
(text
,button
,checkbox
, etc.) coincide con el valor de su atributotype
. Para las listas desplegables normales (elemento<select>
) su valor esselect-one
, lo que permite diferenciarlas de las listas que permiten seleccionar varios elementos a la vez y cuyo tipo esselect-multiple
. Por último, en los elementos de tipo<textarea>
, el valor de type estextarea
.form
: es una referencia directa al formulario al que pertenece el elemento. Así, para acceder al formulario de un elemento, se puede utilizardocument.getElementById("id_del_elemento").form
name
: obtiene el valor del atributoname
de XHTML. Solamente se puede leer su valor, por lo que no se puede modificar.value
: permite leer y modificar el valor del atributovalue
de XHTML. Para los campos de texto (<input type="text">
y<textarea>
) obtiene el texto que ha escrito el usuario. Para los botones obtiene el texto que se muestra en el botón. Para los elementos checkbox y radiobutton no es muy útil, como se verá más adelante
onclick
: evento que se produce cuando se pincha con el ratón sobre un elemento. Normalmente se utiliza con cualquiera de los tipos de botones que permite definir XHTML (<input type="button">
,<input type="submit">
,<input type="image">
).onchange
: evento que se produce cuando el usuario cambia el valor de un elemento de texto (<input type="text">
o<textarea>
). También se produce cuando el usuario selecciona una opción en una lista desplegable (<select>
). Sin embargo, el evento sólo se produce si después de realizar el cambio, el usuario pasa al siguiente campo del formulario, lo que técnicamente se conoce como que "el otro campo de formulario ha perdido el foco".onfocus
: evento que se produce cuando el usuario selecciona un elemento del formulario.onblur
: evento complementario deonfocus
, ya que se produce cuando el usuario ha deseleccionado un elemento por haber seleccionado otro elemento del formulario. Técnicamente, se dice que el elemento anterior "ha perdido el foco".
Utilidades básicas para formularios
Obtener el valor de los campos de formulario
La mayoría de técnicas JavaScript relacionadas con los formularios requieren leer y/o modificar el valor de los campos del formulario. Por tanto, a continuación se muestra cómo obtener el valor de los campos de formulario más utilizados.Cuadro de texto y textarea
El valor del texto mostrado por estos elementos se obtiene y se establece directamente mediante la propiedad value.<input type="text" id="texto" />
var valor = document.getElementById("texto").value;
<textarea id="parrafo"></textarea>
var valor = document.getElementById("parrafo").value;
Radiobutton
Cuando se dispone de un grupo de radiobuttons, generalmente no se quiere obtener el valor del atributovalue
de alguno de ellos, sino que lo importante es conocer cuál de todos los radiobuttons se ha seleccionado. La propiedad checked
devuelve true
para el radiobutton seleccionado y false
en cualquier otro caso. Si por ejemplo se dispone del siguiente grupo de radiobuttons:<input type="radio" value="si" name="pregunta" id="pregunta_si"/> SI <input type="radio" value="no" name="pregunta" id="pregunta_no"/> NO <input type="radio" value="nsnc" name="pregunta" id="pregunta_nsnc"/> NS/NC
var elementos = document.getElementsByName("pregunta"); for(var i=0; i<elementos.length; i++) { console.log(" Elemento: " + elementos[i].value + "\n Seleccionado: " + elementos[i].checked); }
Checkbox
Los elementos de tipo checkbox son muy similares a los radiobutton, salvo que en este caso se debe comprobar cada checkbox de forma independiente del resto. El motivo es que los grupos de radiobutton son mutuamente excluyentes y sólo se puede seleccionar uno de ellos cada vez. Por su parte, los checkbox se pueden seleccionar de forma independiente respecto de los demás.Si se dispone de los siguientes checkbox:
<input type="checkbox" value="condiciones" name="condiciones" id="condiciones"/> He leído y acepto las condiciones <input type="checkbox" value="privacidad" name="privacidad" id="privacidad"/> He leído la política de privacidad
var elemento = document.getElementById("condiciones"); console.log(" Elemento: " + elemento.value + "\n Seleccionado: " + elemento.checked); elemento = document.getElementById("privacidad"); console.log(" Elemento: " + elemento.value + "\n Seleccionado: " + elemento.checked);
Select
Las listas desplegables (<select>
) son los elementos en los que es más difícil obtener su valor. Si se dispone de una lista desplegable como la siguiente:<select id="opciones" name="opciones"> <option value="1">Primer valor</option> <option value="2">Segundo valor</option> <option value="3">Tercer valor</option> <option value="4">Cuarto valor</option> </select>
value
de la opción (<option>
)
seleccionada por el usuario. Obtener este valor no es sencillo, ya que
se deben realizar una serie de pasos. Además, para obtener el valor
seleccionado, deben utilizarse las siguientes propiedades:options
, es un array creado automáticamente por el navegador para cada lista desplegable y que contiene la referencia a todas las opciones de esa lista. De esta forma, la primera opción de una lista se puede obtener mediantedocument.getElementById("id_de_la_lista").options[0]
.selectedIndex
, cuando el usuario selecciona una opción, el navegador actualiza automáticamente el valor de esta propiedad, que guarda el índice de la opción seleccionada. El índice hace referencia al arrayoptions
creado automáticamente por el navegador para cada lista.
// Obtener la referencia a la lista var lista = document.getElementById("opciones"); // Obtener el índice de la opción que se ha seleccionado var indiceSeleccionado = lista.selectedIndex; // Con el índice y el array "options", obtener la opción seleccionada var opcionSeleccionada = lista.options[indiceSeleccionado]; // Obtener el valor y el texto de la opción seleccionada var textoSeleccionado = opcionSeleccionada.text; var valorSeleccionado = opcionSeleccionada.value; console.log("Opción seleccionada: " + textoSeleccionado + "\n Valor de la opción: " + valorSeleccionado);
value
correspondiente a la opción seleccionada por el usuario, es necesario
realizar varios pasos. No obstante, normalmente se abrevian todos los
pasos necesarios en una única instrucción:var lista = document.getElementById("opciones"); // Obtener el valor de la opción seleccionada var valorSeleccionado = lista.options[lista.selectedIndex].value; // Obtener el texto que muestra la opción seleccionada var valorSeleccionado = lista.options[lista.selectedIndex].text;
selectedIndex
con el valor correspondiente a la propiedad value
de la opción seleccionada. En el ejemplo anterior, la primera opción tiene un value
igual a 1
. Sin embargo, si se selecciona esta opción, el valor de selectedIndex
será 0
, ya que es la primera opción del array options
(y los arrays empiezan a contar los elementos en el número 0
).Establecer el foco en un elemento
En programación, cuando un elemento está seleccionado y se puede escribir directamente en el o se puede modificar alguna de sus propiedades, se dice que tiene el foco del programa.Si un cuadro de texto de un formulario tiene el foco, el usuario puede escribir directamente en el sin necesidad de pinchar previamente con el ratón en el interior del cuadro. Igualmente, si una lista desplegable tiene el foco, el usuario puede seleccionar una opción directamente subiendo y bajando con las flechas del teclado.
Al pulsar repetidamente la tecla
TABULADOR
sobre una
página web, los diferentes elementos (enlaces, imágenes, campos de
formulario, etc.) van obteniendo el foco del navegador (el elemento
seleccionado cada vez suele mostrar un pequeño borde punteado).Si en una página web el formulario es el elemento más importante, como por ejemplo en una página de búsqueda o en una página con un formulario para registrarse, se considera una buena práctica de usabilidad el asignar automáticamente el foco al primer elemento del formulario cuando se carga la página.
Para asignar el foco a un elemento de XHTML, se utiliza la función
focus()
. El siguiente ejemplo asigna el foco a un elemento de formulario cuyo atributo id
es igual a primero
:document.getElementById("primero").focus();
<form id="formulario" action="#"> <input type="text" id="primero" /> </form>
if(document.forms.length > 0) { if(document.forms[0].elements.length > 0) { document.forms[0].elements[0].focus(); } }
forms
. Si su tamaño es mayor que 0
, se utiliza este primer formulario. Empleando la misma técnica, se comprueba que el formulario tenga al menos un elemento (if(document.forms[0].elements.length > 0)
). En caso afirmativo, se establece el foco del navegador en el primer elemento del primer formulario (document.forms[0].elements[0].focus();
).Para que el ejemplo anterior sea completamente correcto, se debe añadir una comprobación adicional. El campo de formulario que se selecciona no debería ser de tipo
hidden
:if(document.forms.length > 0) { for(var i=0; i < document.forms[0].elements.length; i++) { var campo = document.forms[0].elements[i]; if(campo.type != "hidden") { campo.focus(); break; } } }
Comentarios
Publicar un comentario