7.2.1. 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.
7.2.1.1. 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;
7.2.1.2. Radiobutton
Cuando se dispone de un grupo de radiobuttons, generalmente no se quiere obtener el valor del atributo value
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
El siguiente código permite determinar si cada radiobutton ha sido seleccionado o no:
var elementos = document.getElementsByName("pregunta"); for(var i=0; i<elementos.length; i++) { alert(" Elemento: " + elementos[i].value + "\n Seleccionado: " + elementos[i].checked);}
7.2.1.3. 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 radiobuttonson mutuamente excluyentes y sólo se puede seleccionar uno de ellos cada vez. Por su parte, loscheckbox 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
Utilizando la propiedad checked
, es posible comprobar si cada checkbox ha sido seleccionado:
var elemento = document.getElementById("condiciones");alert(" Elemento: " + elemento.value + "\n Seleccionado: " + elemento.checked); elemento = document.getElementById("privacidad");alert(" Elemento: " + elemento.value + "\n Seleccionado: " + elemento.checked);
7.2.1.4. 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>
En general, lo que se requiere es obtener el valor del atributo 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 listavar lista = document.getElementById("opciones"); // Obtener el índice de la opción que se ha seleccionadovar indiceSeleccionado = lista.selectedIndex;// Con el índice y el array "options", obtener la opción seleccionadavar opcionSeleccionada = lista.options[indiceSeleccionado]; // Obtener el valor y el texto de la opción seleccionadavar textoSeleccionado = opcionSeleccionada.text;var valorSeleccionado = opcionSeleccionada.value; alert("Opción seleccionada: " + textoSeleccionado + "\n Valor de la opción: " + valorSeleccionado);
Como se ha visto, para obtener el valor del atributo 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 seleccionadavar valorSeleccionado = lista.options[lista.selectedIndex].value; // Obtener el texto que muestra la opción seleccionadavar valorSeleccionado = lista.options[lista.selectedIndex].text;
Lo más importante es no confundir el valor de la propiedad 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
).
7.2.2. 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>
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:
if(document.forms.length > 0) { if(document.forms[0].elements.length > 0) { document.forms[0].elements[0].focus(); }}
El código anterior comprueba que existe al menos un formulario en la página mediante el tamaño del array 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; } }}
7.2.3. Evitar el envío duplicado de un formulario
Uno de los problemas habituales con el uso de formularios web es la posibilidad de que el usuario pulse dos veces seguidas sobre el botón "Enviar". Si la conexión del usuario es demasiado lenta o la respuesta del servidor se hace esperar, el formulario original sigue mostrándose en el navegador y por ese motivo, el usuario tiene la tentación de volver a pinchar sobre el botón de "Enviar".
En la mayoría de los casos, el problema no es grave e incluso es posible controlarlo en el servidor, pero puede complicarse en formularios de aplicaciones importantes como las que implican transacciones económicas.
Por este motivo, una buena práctica en el diseño de aplicaciones web suele ser la de deshabilitar el botón de envío después de la primera pulsación. El siguiente ejemplo muestra el código necesario:
<form id="formulario" action="#"> ... <input type="button" value="Enviar" onclick="this.disabled=true; this.value=’Enviando...’; this.form.submit()" /></form>
Cuando se pulsa sobre el botón de envío del formulario, se produce el evento onclick
sobre el botón y por tanto, se ejecutan las instrucciones JavaScript contenidas en el atributo onclick
:
- En primer lugar, se deshabilita el botón mediante la instrucción
this.disabled = true;
. Esta es la única instrucción necesaria si sólo se quiere deshabilitar un botón. - A continuación, se cambia el mensaje que muestra el botón. Del original "Enviar" se pasa al más adecuado "Enviando..."
- Por último, se envía el formulario mediante la función
submit()
en la siguiente instrucción:this.form.submit()
El botón del ejemplo anterior está definido mediante un botón de tipo