-
Notifications
You must be signed in to change notification settings - Fork 2
S4: Javascript

- Tiempo: 2h (50 + 50min)
- Fecha: Jueves, 11-Marzo-2021
-
Objetivos de la sesión:
- Introducción al lenguaje Javascript
- Acceso a los elementos HTML
- eventos y funciones de retrollamada (callbacks)
- Introducción
- Usos de Javascript
- JS en el cliente
- Programa hola mundo
- Ejecutando JS desde nuestros documentos HTML
- Ejecución retrasada: defer
- Plantilla para nuestros proyectos
- Accediendo a los elementos HTML
- Eventos
- Modificando elementos HTML
- Para aprender más...
- El Rincón Friki
- Autor
- Licencia
- Enlaces
¡Vamos a aprender Javascript!. Es un lenguaje de programación que nos permite interactuar con los objetos definidos en nuestros documentos HTML
- Sintáxis derivada de C y Java. No tiene nada que ver con Java
- Aparición 1995. Netscape. Lenguaje de scripts para navegadores
- 1997 sale el primer estándar: ECMAScript
- Javascript está en el top 1 de lenguajes más usados, en github (Octoverse, 2020)
Hay un nucleo de js común a todos los usos: la propia definición del lenguaje (ECMAscript)
Los usos son:
-
JS en cliente. Se ejecuta en el navegador
- Interactuar con el navegador
- Interactuar con los documentos HTML
- Dibujar en la página
- El código se ejecuta dentro del navegador
- JS en servidor: node.js. Es un lenguaje que se ejecuta sobre la máquina (y por tanto se tiene acceso a todos los recursos). Esto se ve en la asignatura Laboratorio de Tecnologías Audiovisuales en la Web en cuarto curso. Es similar a ejecutar programas en otro lenguaje, como por ejemplo python
- Programas de ordenador con interfaz web: electron. Aplicaciones multiplataforma (que en realidad son webs locales)
En esta asignatura nos centraremos en usar JS para desarrollar la parte del cliente y crear páginas web interactivas. Todos nuestros programas JS están asociados a un fichero HTML y SIEMPRE SE EJECUTARÁN EN EL NAVEGADOR
Cuando desarrollamos programas en Javascript para las páginas web, trabajamos en local. Los ficheros están en nuestro ordenador local y el navegador los cargas desde nuestro disco duro, en vez de hacer peticiones al servidor
Puesto que nuestro programa JS se ejecuta en el navegador, sólo tenemos acceso a los elementos que este ponga a nuestra disposición. Cuando se ejecutan nuestro programas tenemos acceso directo (sin tener que importar nada) a los siguientes elementos:
-
Consola básica. Objeto
console. Nos permite escribir mensajes en la consola -
Interfaz gráfica del navegador. Objeto
window. Nos permite acceder a la interfaz gráfica del navegador. Por ejemplo para lanzar una ventana nuevo (pop-up) -
Recursos del navegador. Objeto
navigator. A través de este objeto podemos saber qué elementos están disponibles: sistema de almacenamiento local, webworkers, posicionamiento... -
Interfaz con documento HTML. Objeto
document: Nodo raiz de nuestro documento HTML. A través de una API accedemos a todos los elementos del DOM (Document Object Model)
El programa hola mundo en Javascript es el siguiente:
console.log("¡¡Hola Mundo!!")Al ejecutarlo muestra el mensaje "¡¡Hola mundo!!" en la consola del navegador. El objeto console, que pone el navegador a neustra disposición, contiene el método log() para imprimir mensajes en la consola. Para probarlo abrimos el navegador (Por ejemplo Firefox) y en el menú superior derecho pinchamos abrimos la opción de web developer/Web console

Esto nos abre una console con el intérprete de Javascript listo. Ahí escribimos nuestro código javascript para probarlo

Existen tres formas de enlazar nuestro código javascript con el HTML
El código javascript lo podemos empotrar directamente en las etiquetas HTML. Por un lado podemos ejecutar el código cuando ocurra un evento, como un click de ratón (onclick). Por otro lado podemos ejecutarlo al pinchar sobre un enlace. En este documento se muestran ambas posibilidades:
- Ejemplo 1
<!-- Ejemplo 1: Código javascript empotrado en las
etiquetas de HTML -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ejempo 1</title>
</head>
<body>
<!-- Párrafo. Al pulsar en el texto se ejecuta
el código javascript indicado en el atributo onclick -->
<p onclick="console.log('Pulsado sobre Párrafo');">
Párrafo. ¡Haz click sobre mi!
</p>
<!-- Enlace: Al pulsar el enlace se ejecuta el código javascript
indicado en el atributo href -->
<a href="javascript:console.log('Pulsado sobre el enlace');">
Enlace: Haz click sobre mi!!
</a>
</body>
</html>Dentro del cuerpo se han definido un párrafo y un enlace. En el párrafo se ha cambiado el valor del atributo onclick:
onclick="console.log('Pulsado sobre Párrafo');"
Esto significa que cada vez que se genere el evento click sobre este párrafo, se ejecutará el código javascript que está entrecomillado
Para probarlo lo abrimos en el navegador, y sacamos la consola

Al hacer click sobre el párrafo y sobre el enlace obtenemos los mensajes en la consola

Aunque podemos incluir javascript dentro del HTML, NO ES BUENA PRÁCTICA HACERLO. Nosotros siempre situaremos nuestro código en un fichero separado. Este estilo empotrado sólo lo utilizaremos una vez en nuestros código: para llamar a nuestro programa principal (main)
El navegador ejecutará cualquier código javascript delimitado por las etiquetas <script> y </script>. En este ejemplo se ha incluido código javascript en el cuerpo del HTML (pero se puede poner también en la cabeza) que muestra un par de mensajes en la consola
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ejemplo 2</title>
</head>
<body>
<p>Esto es un párrafo...</p>
<!-- Código Javascript-->
<script>
console.log("Mensaje 1...");
console.log("Mensaje 2...");
</script>
</body>
</html>Al ejecutarlo y abrir la consola vemos esto

Nada más cargarse la página HTML se ejecuta el código javascript, que lo único que hace es imprimir dos mensajes en la consola del navegador
Igual que hemos comentado en el caso anterior, NO ES UNA BUENA PRÁCTICA colocar código dentro del HTML. Es preferible situar el código javacript en un fichero separado
Esta es la forma recomendada de hacer: Situar el código javascript en un fichero separado. Usamos el atributo src de la etiqueta <script> para especificar el fichero javascript. En este ejemplo HTML se invoca el código javascript que está situado en el fichero Ej-03.js
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ejemplo 3</title>
<!-- Ejecutar el código js situado en un fichero externo -->
<script src="Ej-03.js"></script>
</head>
<body>
<p>Esto es un párrafo del ejemplo 3</p>
</body>
</html>El código javascript es el siguiente:
// Esto son comentarios en Javascript
// MI primer programa javascript!!
//-- Imprimir tres mensajes en la consola
console.log("Estoy fuera del HTML");
console.log("Se recomienda hacerlo así");
console.log("------");En Javascript utilizamos dos símbolos de dividir consecutivos // para poner comentarios en una línea. Tabién podemos utilizar los mismos comentarios que en CSS: /* para empezar y */ para terminar
Al ejecutarlo y ver la consola obtenemos lo siguinte

Si el nombre del fichero .js es incorrecto o se el navigador no es capaz de encontrarlo, aparecerá en la consola un mensaje como el siguiente

El código javascritpt se ejecuta según el fichero HTML se va procesando. Puede ocurrir que se comience a ejecutar el programa cuando todavía no se ha terminado de procesar el fichero HTML. Esto no es un problema salvo que desde el código js tengamos que acceder al propio documento HTML
Para garantizar que nuestro código js se empiece a ejecutar una vez que el fichero html ha sido procesado completamente, y que por tanto tenemos acceso a él, utilizaremos el atributo defer en la etiqueta <script>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ejemplo 4</title>
<script src="Ej-04.js" defer></script>
</head>
<body>
<p>Párrafo del ejemplo 4</p>
</body>
</html>Y este es el código javascript
console.log("La página ya está cargada")
console.log("Ahora es seguro ejecutar el código js")
console.log("defer....")Nuestros proyectos tendrán un fichero HTML con la estructura y contenido, otro CSS con el estilo y un tercero JS con el código. La plantilla HTML es la siguiente:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Plantilla</title>
<!-- Hoja de estilo -->
<link rel="stylesheet" href="plantilla.css">
<!-- Código javascript -->
<script src="plantilla.js" defer></script>
</head>
<body>
<h2>Proyecto plantilla</h2>
<p>Plantilla mínima para nuestros proyectos, que tendrán un
fichero HTML, uno CSS para la hoja de estilo, y otro para el
código JS. Todo por separado
</p>
</body>
</html>Esta plantilla carga una hoja de estilos y un código javascript desde ficheros exteriores
El resto del fichero HTML lo haremos como hasta ahora: colocando etiquetas con sus identificadores id y agrupándolas en clases con class
La hoja de estilos usada en la plantilla es esta:
body {
background-color: lightblue;
}
h2 {
color:blue;
}
p {
color: green;
}y el codigo javascript este:
//-- Punto de entrada: una vez cargada la página se llama a esta
console.log("Aquí comienza tu código JS...")
console.log("¡Que comiencen los juegos del JS!")Al ejecutarlo en el navegador y abrir la consola vemos estos:

Desde el código javascript tenemos acceso a todos los elementos del árbol HTML mediante el DOM: Modelo de Objetos del documento. Accedemos a ellos mediante el objeto document que tenemos disponible. Este objeto tiene una serie de métodos para localizar los elementos de nuestro interés. Estos son algunos ejemplos:
- document.getElementById(id): Obtener el elemento cuyo identificador es id. Devuelve un único elemento, ya que este identificador debe ser único
- document.getElementsByClassName(nombre): Obtener un array con todos los elementos que pertenecen a la clase nombre
- document.getelementsByTagName(nombre): Obtener un array con todos los elementos que tienen un nombre de etiqueta igual al indicado
Partimos de este fichero HTML donde hay un párrafo identificado como "test". Vamos a leerlo desde javascript
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ejemplo 5</title>
<script src="Ej-05.js" defer></script>
</head>
<body>
<!-- Este párrafo está identificado con el nombre "test" -->
<p id="test">Esto es un párrafo de prueba</p>
</body>
</html>Para localizar el párrafo identificado como "test" usamos el método getElementById('test'). El texto contenido en un elemento HTML es accesible mediante la propiedad innerHTML
Este es el código javascript de ejemplo, que se invoca una vez cargada la página. Lo primero que hacemos es localizar el párrafo test, y luego imprimimos su texto
//-- Tenemos acceso al documento html mediante
//-- el objeto document
//-- Leer el párrafo identificado como test
const test = document.getElementById('test')
//-- Mostrar en la consola el contenido del párrafo
//-- (es la propiedad innerHTML)
console.log("Párrafo test leido. Dice:")
console.log(test.innerHTML)Al ejecutarlo en el navegador y abrir la consola vemos lo siguiente:

Efectivamente, al ejecutarse el código javascript, ha impreso en la consola lo mismo que había en el párrafo en el HTML
Javascript es un lenguaje orientado a eventos, pensado para ejecutar acciones cada vez que ocurren cosas, como un click del ratón, la pulsación de una tecla, la carga de una página, etc
Las funciones que atienden a esos eventos se denominan manejadores. Los elementos HTML tiene unos atributos para definir estos manejadores. Ya conocemos uno: onclick
Vamos a configurar un manejador para que cada vez que se haga click sobre el párrafo identificado como test se imprima un mensaje en la consola. El código HTML es el siguiente (es similar al del ejemplo 5)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ejemplo 6</title>
<script src="Ej-06.js" defer></script>
</head>
<body>
<p id="test">Esto es un párrafo de prueba</p>
</body>
</html>El código javascript es el siguiente. Definimos la función manejador_parrafo() para que se ejecute con cada click de ratón. En el main() configuramos el manejador
//-- Manejador del evento click sobre el párrafo test
//-- Cada vez aue se hace click en el se invoca a esta funcion
function manejador_parrafo()
{
console.log("Click sobre el párrafo...")
}
console.log("Ejecutando js...")
//-- Leer el párrafo identificado como test
const test = document.getElementById('test')
//-- Configurar el manejador para el evento de
//-- pulsación de botón: que se ejecute la
//-- funcion manejador_parrafo()
test.onclick = manejador_parrafo;FIJATE en la línea:
test.onclick = manejador_parrafo;Estamos usando la función manejador_parrafo como un objeto, y por eso NO usamos manejador_parrafo() con los paréntesis al final. Si se ponen los paréntesis lo que se hace es llamar a la función primero y asignar a onclick el valor devuelto por ella. Es un ERROR MUY COMUN
Lo ejecutamos en el navegador y abrimos la consola

En esta animación lo vemos en funcionamiento. Se hace un click 5 veces. La primera aparece el mensaje, y en las restantes aparece un número a la izquierda del texto, indicando que se repite el número de veces indicado por el número

Si recargamos la página, se hace un reset y se ejecuta el programa otra vez desde el comienzo
En Javascript se usan tanto los eventos que NO hace falta definir una nueva función externa, sino que se puede crear en la propia asignación del manejador. Así, el código javascript del ejemplo anterior se podría escribir de esta manera:
console.log("Ejecutando js...")
//-- Leer el párrafo identificado como test
const test = document.getElementById('test')
//-- Configurar el manejador para el evento de
//-- pulsación de botón
test.onclick = function () {
console.log("Click sobre el párrafo...")
}La función manejador_párrafo() ha desaparecido, y se ha incluido directamente en la asignación a test.onclick:
test.onclick = function () {
console.log("Click sobre el párrafo...")
}El comportamiento es exactamente el mismo que antes: cada vez que se hace click sobre el párrafono, se ejecuta el código console.log("Click sobre el párrafo..."). La diferencia es que esta notación es más compacta, y nos ahorramos el tener que definir el nombre de una función. Lo cual tiene mucho sentido, porque esta función nunca será llamada desde otro lugar, sino que sólo se ejecuta al hacer click en el párrafo
Existe todavía otra notación más compacta para definir los manejadores, que nos ahorra escribir la palabra clave function. Este ejemplo es igual que los dos anteriores, pero usando esta nueva notación
console.log("Ejecutando js...")
//-- Leer el párrafo identificado como test
const test = document.getElementById('test')
//-- Configurar el manejador para el evento de
//-- pulsación de botón
test.onclick = () => {
console.log("Click sobre el párrafo...")
}Una vez que hemos localizado el elemento html, no sólo podemos leer sus propiedades, sino que las podemos modificar. He incluso se pueden añadir nuevos elementos HTML para que se incorporen al árbol
Haremos un ejemplo que cambie el texto de un párrafo al hacer click sobre otro párrafo. En el HTML definimos dos párrafos, identificados como test1 y test2:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ejemplo 9</title>
<script src="Ej-09.js" defer></script>
</head>
<body>
<p id="test1">Este es el párrafo test1</p>
<p id="test2">Haz click aquí para modificar el párrafo 1</p>
</body>
</html>Desde el código javascript definimos el manejador para que se ejecute al hacer click sobre el párrafo 2. Dentro del manejador, obtenemos el elemento párrafo 1 y cambiamos su texto asignando uno nuevo a través de la propiedad innerHTML
//-- Leer el elemento párrafo test2
const test2 = document.getElementById('test2')
//-- Obtener el elemento párrafo 1 para modificarlo
const test1 = document.getElementById('test1')
//-- Configurar el manejador para el evento de
//-- pulsación de botón
test2.onclick = () => {
console.log("Click sobre el párrafo 2...")
//-- Cambiar su texto
test1.innerHTML = "¡TEXTO CAMBIADO!"
}Ejecutamos el código en el navegador, con la consola abierta. Al hacer click en el párrafo inferior, el texto del párrafo superior cambia:

En esta animación vemos el proceso completo. Al hacer una recarga de la página aparece el texto original

- Los apuntes de Majo. Tiene apuntes sobre Javascript
- Vanilla Web Projects
- 30 Days of javascript
- Tutorial de Javascript -Tutorial moderno de javascript:
- Tutorial de Javascript del W3School
- Transparencias de la asigntura de Tecnologías web de la Universidad de Alicante
- Ejemplo de creación de un fichero vectorial 2D con Inkscape y cómo convertirlo a 3D en FreeCAD
- Juan González-Gómez (Obijuan)

- Creado a partir del contenido generado por el profesor Jose María Cañas
- Imagen servidor: By George Boukeas, original Gorilla icon theme artwork by Jakub Steiner - Derivative of the computer.svg icon in the Gorilla icon theme., CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=11882548
- Imagen laptor: By Daniel Clemente - Own work, GPL, https://commons.wikimedia.org/w/index.php?curid=863161

S0: Presentación
S1: Introducción a las tecnologías web
S2: HTML
S3: CSS
S4: Javascript
S5: Javascript II
S6: Animaciones 2D
S7: HTML (Parte-2)
S8: Codif. Multimedia I
S9: Codif. Multimedia (II)
S10: Com. Multimedia I
S11: Comunicac. Multimedia (II)
L2: Github pages
L3: HTML
L4: CSS
L5: Probando Javascript
L6: Calculadora simple
L7: ¡Practica!
L8: Mis primeras animaciones
L9: Teclas y sonidos
L10: Destruyendo ladrillos
L12: Realizador de TV (13-Mayo)
L13: Laboratorio / Tutorías
- 2018-Mayo-18: Ordinario: (Enunciado), (Soluciones)
- 2019-Mayo-09: Ordinario: (Enunciado), (Soluciones)
- 2019-Junio-20: Extra: (Enunciado),(Soluciones)