Desarrollo de Aplicaciones Web
Práctica 6: JavaScript
1. Objetivos
- Aprender el lenguaje de programación JavaScript.
- Aprender a manejar el DOM de una página web para manipular su contenido.
- Aprender a validar un formulario con el lenguaje de programación JavaScript.
2. Recursos
¿Cuál es la sintaxis de JavaScript? ¿Qué palabras clave existen?
- W3Schools:
cursos de aprendizaje y guías de referencia de diversas tecnologías empleadas en la programación
web. Incluye un tutorial y temas avanzados sobre JavaScript.
- ECMA-262 ECMAScript Language Specification:
estándar en el que se basa el lenguaje JavaScript.
- Mozilla Developer Center JavaScript:
información sobre JavaScript según los desarrolladores del proyecto Mozilla.
- ECMAScript support in Opera:
información sobre JavaScript según los desarrolladores del navegador Opera.
- JavaScript Cheat Sheet:
resumen de los métodos y funciones principales, la sintaxis de las expresiones regulares y el objeto
XMLHttpRequest.
- JavaScript Reference:
fichas resumen de los métodos y funciones principales. Incluye una tabla con las versiones que
aceptan los principales navegadores.
¿Cómo puedo comprobar que el código que escribo es correcto?
- Firebug:
extensión (add-on) para el navegador Mozilla Firefox, es una herramienta esencial para cualquier
desarrollador web. Incluye: inspector y editor de HTML, CSS, JavaScript y DOM; regla para tomar
mediciones; monitor de actividad de red y depurador de JavaScript.
- JSLint, The JavaScript Verifier:
aplicación en página web que verifica el código JavaScript, posee múltiples opciones.
- JavaScript Lint:
aplicación para descargar y ejecutar en local que emplea el motor del navegador Mozilla Firefox.
- JavaScript Editor:
potente editor de código JavaScript. Es de pago.
¿Cómo puedo esconder mi código JavaScript? No se puede, pero puedes emplear un “ofuscador” para
ponérselo difícil al que quiera copiar tu código. Estas herramientas también sirven para comprimir el código
JavaScript y reducir su tiempo de descarga.
- iWeb Toolkit: Javascript Compiler:
encriptador de código JavaScript.
- Lista de ofuscadores para JavaScript:
lista con enlaces a varios ofuscadores.
¿Qué es el DOM?
- W3C Documento Object Model (DOM):
especificación oficial del DOM según el W3C.
- Mozilla Developer Center Gecko DOM Reference:
guía de referencia de los objetos del DOM disponible en el motor Gecko empleado por varios
navegadores web como Mozilla Firefox.
- Support for DOM2 Core and XML modules in Opera
y DOM 2 HTML Objects supported in Opera:
objetos, propiedades y métodos del DOM que admite el navegador Opera.
3. ¿Qué tengo que hacer?
En esta práctica tienes que emplear JavaScript para validar los formularios que has realizado en las prácticas
anteriores. En concreto, tienes que programar las siguientes restricciones:
-
Página principal
- Contiene un formulario (nombre de usuario y contraseña) para acceder como usuario
registrado. Antes de enviar el formulario, debes comprobar que el usuario ha escrito algo en ambos
campos, pero evita que el usuario escriba únicamente espacios en blanco o tabuladores.
-
Página con el formulario de registro como nuevo usuario
- Contiene un formulario con los datos
necesarios para registrarse (nombre de usuario, contraseña, repetir contraseña, dirección de email, sexo,
fecha de nacimiento, ciudad y país de residencia, foto). Antes de enviar el formulario, debes realizar las
siguientes comprobaciones:
- nombre de usuario: sólo puede contener letras del alfabeto inglés (en mayúsculas y
minúsculas) y números; no puede comenzar con un número; longitud mínima 3 caracteres y
máxima 15.
- contraseña: sólo puede contener letras del alfabeto inglés (en mayúsculas y minúsculas),
números, el guion y el guion bajo (subrayado); al menos debe contener una letra en mayúscula,
una letra en minúscula y un número; longitud mínima 6 caracteres y máxima 15.
- repetir contraseña: su valor debe coincidir con el escrito en el campo contraseña.
- dirección de email: no puede estar vacío, hay que comprobar que cumple el siguiente patrón de una
dirección de email (es una simplificación del estándar):
- El formato de un correo electrónico es parte-local@dominio.
- La longitud máxima de parte-local es 64 caracteres.
- La parte-local es una combinación de las letras mayúsculas y minúsculas del alfabeto
inglés, los dígitos del 0 al 9, los caracteres imprimibles !#$%&'*+-/=?^_`{|}~ y el punto.
El punto no puede aparecer ni al principio ni al final y tampoco pueden aparecer dos
puntos seguidos.
- El dominio es una secuencia de uno o más subdominio separados por un punto.
- La longitud máxima de subdominio es 63 caracteres.
- Un subdominio es una combinación de las letras mayúsculas y minúsculas del alfabeto
inglés, los dígitos del 0 al 9 y el guion. El guion no puede aparecer ni al principio ni al
final.
- sexo: se debe elegir un valor.
- fecha de nacimiento: comprobar que es una fecha válida.
- El resto de campos no indicados se pueden quedar vacíos.
Algunas de las validaciones se pueden implementar con HTML. Por ejemplo, se puede emplear el
atributo pattern para definir una expresión regular, se puede emplear type="email" para comprobar
que un correo electrónico es válido, etc. Sin embargo, el objetivo de esta práctica es aprender a
utilizar JavaScript, por lo que no se debe hacer uso de esas facilidades que proporciona
HTML.
Por último, en la página ‘‘Solicitar álbum”, además de la tabla de tarifas que ya tenía la página, se tiene
que mostrar una tabla con el coste de un álbum de fotos según los diferentes parámetros (número de páginas,
número de fotos, color y resolución), tal como se puede ver en la Figura 1. Esta tabla se tiene que
calcular mediante JavaScript y se tienen que aplicar las tarifas que se proporcionaron en una práctica
anterior.
Importante: la tabla se tiene que crear con las funciones del DOM (Document Object Model)
que permiten añadir contenido a una página web nodo a nodo. Es decir, no vale añadir el contenido
como una cadena mediante innerHTML u otro mecanismo similar.
Importante: el código que programes debe ser eficaz, eficiente y modular.
4. ¿Cómo lo hago?
4.1. Inclusión de JavaScript en una página web
JavaScript es un lenguaje de script que comparte la misma sintaxis básica que los lenguajes de
programación C, C++ y Java. El código de JavaScript se puede incluir de tres formas en una página
web:
- Mediante la etiqueta <script>.
- En un enlace (etiqueta <a>) en el atributo href.
- En un atributo que representa un evento, como onclick u onsubmit.
Por ejemplo, la siguiente página web contiene dos líneas de código JavaScript que se ejecutan automáticamente al
cargar la página web; el atributo type de la etiqueta <script> indica el lenguaje de programación empleado en el código
de script:
<!DOCTYPE html> <html lang="es"> <head> <title>Prueba de JavaScript</title> <script type="text/javascript"> <!-- window.alert("Mensaje 1"); alert("Mensaje 2"); // --> </script> </head> <body> <p> Una página web sencilla. </p> </body> </html>
En el ejemplo anterior, el código JavaScript está encerrado en un comentario de HTML para que no sea
interpretado por aquellos navegadores que no reconocen JavaScript. Además, la llamada al método alert() que
muestra un cuadro de diálogo con un mensaje se realiza de dos formas equivalentes: a través del objeto window y
directamente.
En JavaScript hay muchas formas de escribir un código para lograr un objetivo. Por ejemplo,
el siguiente código muestra tres formas distintas de asociar una función al evento “click” de un
botón:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Prueba de click</title> <script> function funcionClick(msg) { alert("El mensaje que debo mostrar es: " + msg); } function load() { document.getElementById("boton2").onclick = function(){funcionClick("Botón 2")}; document.getElementById("boton3").addEventListener("click", function(){funcionClick("Botón 3")}); } document.addEventListener("DOMContentLoaded", load, false); </script> </head> <body> <p> <input type="button" value="Con atributo onclick" id="boton1" onclick="funcionClick('Botón 1')" /> <br /> <input type="button" value="Con onclick en JS" id="boton2" /> <br /> <input type="button" value="Con addEventListener en JS" id="boton3" /> </p> </body> </html>
En este ejemplo se han usado las funciones anónimas de
JavaScript
para pasar información específica a la función manejadora del evento “click”. Además, se ha empleado el evento
DOMContentLoaded
para iniciar la ejecución del código JavaScript.
4.2. Validación de formularios
El DOM es una API destinada a trabajar con documentos HTML y XML. El DOM está desarrollado por el
W3C.
Para realizar la validación de formularios lo más correcto es emplear expresiones regulares, pero en esta
práctica no tienes que utilizar expresiones regulares. Ahora tienes que programar para cada situación el
algoritmo de validación apropiado.
Existen varias formas de acceder a un formulario a través del
DOM:
- document.forms[n], donde n es la posición que ocupa el formulario en la lista de formularios del
documento, comenzando desde 0.
- document.forms["nom"], donde nom es el nombre que se ha asignado al formulario con el atributo
name o id.
- document.nom, donde nom es el nombre que se ha asignado al formulario con el atributo name.
Una vez que se ha seleccionado un formulario, existen varias formas de acceder a los campos que contiene
(formu es un objeto que representa un formulario concreto y que ha sido seleccionado con alguno de los métodos
explicados en el párrafo anterior):
- formu.elements[n], donde n es la posición que ocupa el campo en la lista de campos del formulario,
comenzando desde 0.
- formu.elements["nom"], donde nom es el nombre que se ha asignado al campo con el atributo name
o id.
- formu.nom, donde nom es el nombre que se ha asignado al campo con el atributo name o id.
Una vez que se ha seleccionado un campo, se tiene que consultar la propiedad value para obtener el valor
que almacena en un instante concreto.
En el siguiente ejemplo hay un formulario que contiene tres campos de texto para escribir el nombre de tres
jugadores, el formulario no se puede enviar si no se han escrito los tres nombres:
<!DOCTYPE html> <html lang="es"> <head> <meta charset="utf-8" /> <title>Validación un formulario</title> <script> function valida(f) { var ok = true; var msg = "Debes escribir algo en los campos:\n"; if(f.elements[0].value == "") { msg += "- Jugador 1\n"; ok = false; } if(f.elements["jugador2"].value == "") { msg += "- Jugador 2\n"; ok = false; } if(f.jugador3.value == "") { msg += "- Jugador 3\n"; ok = false; } if(ok == false) alert(msg); return ok; } </script> </head> <body> <form id="miForm" action="" method="get" onsubmit="return valida(this)"> <p> Jugador 1: <input type="text" id="jugador1" /> <br /> Jugador 2: <input type="text" id="jugador2" /> <br /> Jugador 3: <input type="text" id="jugador3" /> <br /> <input type="submit" value="Enviar" /> <input type="reset" value="Borrar" /> </p> </form> </body> </html>
En el ejemplo anterior, cuando se llama a la función valida() desde el evento onsubmit se le pasa como
valor del parámetro this, que es un objeto que representa al formulario desde el que se invoca al método. En
este ejemplo, se ha empleado el atributo id en vez del atributo name para identificar cada elemento, la forma
correcta de identificar de forma única un elemento de HTML.
La función valida() debe devolver true o false según la validación haya sido correcta o haya fallado.
Este valor debe ser devuelto al navegador: el valor true significa “continúa y envía el formulario al
servidor”, mientras que false significa “cancela y no envíes el formulario al servidor”. Por ello, en
el código se debe escribir onsubmit="return valida(this)" para reenviar el valor devuelto al
navegador.
Importante: este es el método tradicional de acceder al contenido de un formulario, aquí
está explicado por razones históricas, pero no es la forma adecuada de hacerlo en la
actualidad.
En DOM Level 1, publicado en octubre de 1998, se añadieron tres funciones que permiten acceder a los
elementos de una página web:
- document.getElementById(id):
devuelve el elemento con el identificador indicado. ¡Cuidado!: recuerda que JavaScript es un
lenguaje sensible a mayúsculas y minúsculas, Id en getElementById() se tiene que escribir con la
letra “I” en mayúscula y la letra “d” en minúscula, si se escribe de otra forma, como por ejemplo
“ID”, fallará.
- elementoPadre.getElementsByName(nombre):
devuelve un array de elementos con el nombre indicado en el atributo name, los elementos se buscan
a partir de elementoPadre (si elementoPadre es document, la búsqueda se realiza en toda la página
web).
- elementoPadre.getElementsByTagName(etiqueta):
devuelve un array de elementos con la etiqueta indicada, los elementos se buscan a partir de
elementoPadre (si elementoPadre es document, la búsqueda se realiza en toda la página web).
Con HTML5 han aparecido nuevas funciones para manipular el DOM, pero se tienen que usar con mucho
cuidado para que no se produzcan problemas de compatibilidad con navegadores web antiguos. De las nuevas
funciones, las más interesantes son:
- elementoPadre.getElementsByClassName(nombres): devuelve un array de elementos que poseen
los nombres de clases indicados, los elementos se buscan a partir de elementoPadre (si elementoPadre
es document, la búsqueda se realiza en toda la página web). Este método está definido en W3C
DOM4.
- elementoPadre.querySelector(selector): devuelve el primer elemento que cumple el selector
indicado, el elemento se busca a partir de elementoPadre. El selector emplea la sintaxis de selectores
de CSS. Este método está definido en W3C Selectors API Level 1.
- elementoPadre.querySelectorAll(selector): devuelve un array de elementos que cumplen el
selector indicado, los elementos se buscan a partir de elementoPadre. El selector emplea la sintaxis
de selectores de CSS. Este método está definido en W3C Selectors API Level 1.
En definitiva, existen múltiples formas de acceder a un formulario y a los controles de un formulario. El
siguiente código muestra 15 formas distintas de acceder al valor que contiene un cuadro de texto:
<!DOCTYPE html> <html lang="es"> <head> <meta charset="utf-8" /> <title>Diferentes modos de acceso</title> <script> function load() { console.log(document.forms[0].elements[0].value); console.log(document.forms[0].elements["usuario"].value); console.log(document.forms[0].usuario.value); console.log("----"); console.log(document.forms["miForm"].elements[0].value); console.log(document.forms["miForm"].elements["usuario"].value); console.log(document.forms["miForm"].usuario.value); console.log("----"); console.log(document.miForm.elements[0].value); console.log(document.miForm.elements["usuario"].value); console.log(document.miForm.usuario.value); console.log("----"); console.log(document.getElementById("usuario").value); console.log(document.getElementsByName("usuario")[0].value); console.log(document.getElementsByTagName("input")[0].value); console.log(document.getElementsByClassName("cuadro-texto")[0].value); console.log(document.querySelector("#usuario").value); console.log(document.querySelectorAll("input")[0].value); } document.addEventListener("DOMContentLoaded", load, false); </script> </head> <body> <form id="miForm" name="miForm" action="" method="get"> <p> Usuario: <input type="text" id="usuario" name="usuario" class="cuadro-texto" value="Nombre usuario" /> </p> </form> </body> </html>
En la Figura 2 se muestra la salida del código anterior por la consola de JavaScript de un navegador
web.
4.3. Manipulación de una página web
El DOM proporciona una representación en forma de árbol de un documento y permite su manipulación (añadir
un elemento nuevo, borrar un elemento, mover un elemento de sitio). Algunas funciones útiles del DOM
son:
- document.createElement(etiqueta): crea un nuevo elemento según la etiqueta indicada.
- elementoPadre.appendChild(elementoNuevo): añade elementoNuevo a elementoPadre al final
de su lista de elementos hijo.
- elementoPadre.insertBefore(elementoNuevo, elementoReferencia): añade elementoNuevo
en la lista de elementos hijo de elementoPadre antes de elementoReferencia.
El siguiente ejemplo muestra cómo se pueden añadir párrafos de texto nuevos a una página web con el texto
que introduzca el usuario en la misma página web:
<!DOCTYPE html> <html lang="es"> <head> <meta charset="utf-8" /> <title>Validación con expresión regular</title> <script> function nuevoTexto() { // Obtiene el div que tiene id="parrafos" var d = document.getElementById("parrafos"); // Crea un nuevo elemento de tipo párrafo var np = document.createElement("p"); // Inserta el texto en el contenido del nuevo párrafo // textContent es un atributo (propiedad) de un nodo // que representa el contenido textual np.textContent = document.getElementById("texto").value; // Añade el párrafo al final de los elementos que contenga el div d.appendChild(np); return false; } </script> </head> <body> <form id="miForm" action="" method="get" onsubmit="return nuevoTexto()" > <p> Texto: <input type="text" id="texto" /> <br /> <input type="submit" value="Añade texto" /> </p> </form> <div id="parrafos"> <!-- Inicialmente vacío --> </div> </body> </html>
5. Recomendaciones
Muy importante: en la realización de las prácticas no debes emplear un framework de JavaScript.
Cuanta mayor separación haya entre las distintas partes que componen una página web (HTML, CSS y
JavaScript) mucho mejor. Por ello, el código de JavaScript escríbelo en un fichero aparte e inclúyelo en aquellas
páginas donde lo necesites con la etiqueta <script src=""></script>.
En el sitio web W3Schools puedes encontrar el apartado JavaScript Form
Validation
que explica algunos tipos de validación sencilla de un formulario. Además de esta página existen muchas otras
más como:
- How-To: Form validation with JavaScript:
explica paso a paso como realizar una validación sencilla. Además, explica cómo validar botones de
radio, casillas de verificación y listas desplegables.
- JavaScript: Form Validation:
emplea expresiones regulares para algunas de las validaciones.
- The Art of Web: JavaScript:
explica cómo realizar algunos tipos de validación especiales (contraseña, fecha y hora, tarjeta de
crédito).
Para manipular las cadenas en JavaScript existe el objeto String. Consulta la página JavaScript String Object
Reference
en W3Schools para conocer los métodos y propiedades que posee este objeto. Algunos métodos que puedes
necesitar son:
- charAt(): devuelve el carácter situado en la posición indicada.
- indexOf(): devuelve la posición de la primera aparición de una cadena en otra cadena, buscando
hacia delante desde la posición indicada.
- lastIndexOf(): devuelve la posición de la última aparición de una cadena en otra cadena, buscando
hacia atrás desde la posición indicada.
- replace(): reemplaza unos caracteres por otros caracteres en una cadena.
- slice(): extrae una parte de una cadena.
- split(): divide una cadena en partes según los caracteres indicados.
- toLowerCase(): convierte una cadena a minúsculas.
- toUpperCase(): convierte una cadena a mayúsculas.
Para trabajar con fechas en JavaScript existe el objeto Date. Consulta la página JavaScript Date Object
Reference
en W3Schools para conocer los métodos y propiedades que posee este objeto. Algunos métodos que puedes
necesitar son:
- getDate(): devuelve el día del mes (de 1 a 31).
- getMonth(): devuelve el mes (de 0 a 11).
- getFullYear(): devuelve el año, como un número de cuatro dígitos.
- getTime(): devuelve una fecha y hora (instante de tiempo) como el número de milisegundos desde
la medianoche del 1 de enero de 1970.
- setDate(): fija el día del mes (de 1 a 31).
- setMonth(): fija el mes (de 0 a 11).
- setFullYear(): fija el año, como un número de cuatro dígitos.
- setTime(): fija una fecha y hora (instante de tiempo) como el número de milisegundos desde la
medianoche del 1 de enero de 1970.
El objeto Date se puede emplear para validar una fecha introducida por el usuario. ¿Cómo? Utiliza la fecha
introducida por el usuario para crear un objeto de tipo Date y compara la fecha introducida con los valores que
devuelve el objeto.
Cuando una página contiene un error de JavaScript, los navegadores suelen informar de alguna manera al
usuario. Por ejemplo, la siguiente página contiene un error, ya que el bloque de código de la función prueba() no
está cerrado (falta una llave).
<!DOCTYPE html> <html lang="es"> <head> <title>Prueba de JavaScript</title> <script> function prueba() { window.alert("Mensaje 1"); alert("Mensaje 2"); return false; </script> </head> <body> <p> Un texto. Pulsa <a href="#" onclick="return prueba()">aquí</a> para ejecutar la función. </p> </body> </html>
En los navegadores actuales existe la posibilidad de consultar los mensajes de error de JavaScript a través de
la consola de las herramientas para desarrolladores. En la Figura 3 se muestra el mensaje de error que muestra
el navegador Google Chrome y en la Figura 4 el mensaje de error que muestra el navegador Mozilla
Firefox.