14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/APIs/introduccion.js:
--------------------------------------------------------------------------------
1 | /*
2 | 📌 Que son las API
3 | Application Programming Interface
4 | */
5 |
6 | /*
7 | 📌 Las API son una forma en la que el navegador web o un servidor externo nos dan acceso a funciones adicionales para hacer cosas que normalmente serian dificiles.
8 | */
9 |
10 | /*
11 | 📌 APIs del navegador web
12 | Los navegadores nos dan acceso a diferentes API con las que podemos:
13 | - Local Storage API - Trabajar con almacenamiento local
14 | - Fetch API - Hacer peticiones a servidores
15 | - History API - Para poder acceder al historial de la página.
16 | - Validation API - Para hacer uso de las funciones del navegador para validar fomrularios
17 | - Más
18 | */
19 |
20 | /*
21 | 📌 APIs Externas
22 | Tambien puede haber APIs externas que nos permiten acceder a recursos de otra página web.
23 | Ejemplo con la API de youtube:
24 | - Nos permite obtener información de videos y canales
25 | - Nos permite subir videos
26 |
27 | Estas son cosas que no podriamos hacer desde nuestra página si no existiera una API.
28 | Gracias a que existe una API, podemos hablarle y pedirle obtener datos u hacer operaciones.
29 | */
30 |
--------------------------------------------------------------------------------
/APIs/json.js:
--------------------------------------------------------------------------------
1 | /*
2 | 📌 JSON
3 | Javascript Object Notation
4 | */
5 |
6 | /*
7 | - Es un formato que se utiliza para mandar información de un sitio a otro.
8 | - Por ejemplo cuando mandamos obtener informacion de un servidor este nos respondera con un objeto JSON.
9 | - Son muy similares a un objeto de javascript.
10 | - Todos los lenguajes de programación tienen funciones para leer json.
11 | - Es una de las formas mas comunes de pasar información porque es muy fácil de usar.
12 | */
13 |
14 | /*
15 | 📌 Tipos de datos que podemos usar en JSON:
16 | - cadena de texto
17 | - numeros
18 | - objetos (en formato JSON)
19 | - arreglos
20 | - booleanos
21 | - null
22 |
23 | Tipos de datos que NO podemos usar en JSON:
24 | - funciones
25 | - objetos de fecha
26 | - undefined
27 | */
28 |
29 | // datos.json
30 | const datos = `
31 | {
32 | "id": 1,
33 | "nombre": "Carlos Arturo",
34 | "suscriptor_activo": true,
35 | "posts": [
36 | {
37 | "id": 1,
38 | "titulo": "Titulo del primer post",
39 | "texto": "texto del primer post ..."
40 | },
41 | {
42 | "id": 2,
43 | "titulo": "Titulo del segundo post",
44 | "texto": "texto del segundo post ..."
45 | }
46 | ]
47 | }
48 | `;
49 |
50 | /*
51 | 📌 parse()
52 | Le pasamos una cadena de texto con formato JSON y nos devuelve objeto de javascript.
53 | */
54 | console.log(JSON.parse(datos));
55 |
56 | /*
57 | 📌 stringify()
58 | Nos permite pasarle un objeto de javascript y nos devuelve una cadena de texto con objeto en formato JSON
59 | */
60 | const usuario = {
61 | nombre: 'Carlos',
62 | correo: 'correo@correo.com',
63 | coloresFavoritos: ['azul', 'rojo', 'negro'],
64 | };
65 |
66 | console.log(JSON.stringify(usuario));
67 |
--------------------------------------------------------------------------------
/APIs/localstorage.js:
--------------------------------------------------------------------------------
1 | /*
2 | 📌 Localstorage
3 | Localstorage es una API del navegador que nos va a permitir poder
4 | guardar información de forma local, asi como las cookies.
5 | */
6 |
7 | document.getElementById('boton1').addEventListener('click', () => {
8 | const nombre = prompt('Escribe tu nombre:');
9 | window.localStorage.setItem('nombre', nombre);
10 | });
11 |
12 | document.getElementById('boton2').addEventListener('click', () => {
13 | window.localStorage.removeItem('nombre');
14 | });
15 |
16 | // Comprobamos si hay un nombre guardado
17 | if (window.localStorage.nombre) {
18 | console.log('Hola', window.localStorage.nombre);
19 | } else {
20 | console.log('Hola usuario anonimo');
21 | }
22 |
23 | /*
24 | 📌 Local Storage vs cookies
25 |
26 | Local Storage:
27 | - Se utilizan para guardar información de forma local.
28 | - Tiene un limite de 5mb por dominio.
29 | - La información de localstorage no tiene expiración. (se puede borrar con ccleaner por ejemplo)
30 | Cookies:
31 | - Se utilizan para mandar informacion entre el cliente (navegador web) y el servidor
32 | - Tienen un limite de 4kb.
33 | - Pueden tener fecha de expiración.
34 | */
35 |
--------------------------------------------------------------------------------
/BOM/alerts.js:
--------------------------------------------------------------------------------
1 | /*
2 | 📌 Ventanas de Alerta
3 | El navegador web puede mostrar 3 ventanas de alerta mediante javascript
4 | */
5 |
6 | /*
7 | 📌 Alerta
8 | Para informarle al usuario de algo.
9 | */
10 | // window.alert('Hola usuario!');
11 |
12 | /*
13 | 📌 Ventana de confirmación
14 | Una ventana donde el usuario puede aceptar o cancelar.
15 | Retorna verdadero o falso dependiendo de la respuesta del usuario.
16 | */
17 |
18 | const ingresar = () => {
19 | const accesoPermitido = confirm('¿Eres mayor de edad?');
20 | if (accesoPermitido) {
21 | alert('Bienvenido!');
22 | } else {
23 | alert('Le vamos a decir a tus padres!');
24 | }
25 | };
26 |
27 | /*
28 | 📌 Ventana con input
29 | Una ventana donde el usuario puede introducir un valor
30 | Retorna una cadena de texto con la respuesta del usuario.
31 | */
32 |
33 | const saludo = () => {
34 | const nombre = prompt('Escribe tu nombre');
35 | alert(`Bienvenido ${nombre}`);
36 | };
37 |
--------------------------------------------------------------------------------
/BOM/estilos.css:
--------------------------------------------------------------------------------
1 | @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;600&display=swap');
2 |
3 | * {
4 | box-sizing: border-box;
5 | margin: 0;
6 | padding: 0;
7 | }
8 |
9 | body {
10 | font-family: 'Poppins', sans-serif;
11 | min-height: 100vh;
12 | width: 100%;
13 | background: #eaeaea;
14 | color: #000;
15 | display: flex;
16 | flex-direction: column;
17 | align-items: center;
18 | justify-content: center;
19 | }
20 |
21 | h1 {
22 | font-size: 80px;
23 | }
24 |
25 | h2 {
26 | font-size: 40px;
27 | font-weight: normal;
28 | margin-bottom: 40px;
29 | color: #848484;
30 | }
31 |
32 | button {
33 | border: none;
34 | background: #2553df;
35 | font-family: 'Poppins', sans-serif;
36 | font-size: 22px;
37 | cursor: pointer;
38 | border-radius: 10px;
39 | color: #fff;
40 | padding: 14px 28px;
41 | margin-bottom: 20px;
42 | }
43 |
44 | button:hover {
45 | background: #1942be;
46 | }
47 |
--------------------------------------------------------------------------------
/BOM/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Curso de Javascript
8 |
9 |
10 |
11 |
12 |
Curso de Javascript
13 |
Completo, Práctico y desde Cero
14 |
15 |
16 |
--------------------------------------------------------------------------------
/BOM/location.js:
--------------------------------------------------------------------------------
1 | /*
2 | 📌 window.location
3 | Nos permite obtener la url de la barra de direcciones y cargar nuevos documentos.
4 | Recordar que podemos acceder a location directamente.
5 | */
6 |
7 | // href - Retorna la URL de la página actual
8 | console.log(location.href);
9 |
10 | // hostname - Retorna el host de la página actual
11 | // Abriendo el archivo local nos retorna undefined pero podemos probar desde la consola en otra pagina.
12 | console.log(location.hostname);
13 |
14 | // pathname - Retorna la ruta y archivo de la pagina actual
15 | console.log(location.pathname);
16 |
17 | // procotol - Retorna el protocolo utilizado
18 | console.log(location.protocol);
19 |
20 | // assign - Nos permite cargar un nuevo documento
21 | const cargarDocumento = () => {
22 | location.assign('https://google.com');
23 | };
24 |
25 | /*
26 | 📌 window.history
27 | Contiene el historial de la pestaña de nuestro navegador.
28 | Nos permite regresar o ir adelante.
29 | */
30 |
31 | const regresar = () => {
32 | history.back();
33 | // history.forward();
34 | };
35 |
--------------------------------------------------------------------------------
/BOM/navigator.js:
--------------------------------------------------------------------------------
1 | /*
2 | 📌 window.navigator
3 | Contiene informacion del navegador web del usuario
4 | */
5 |
6 | // Comprobar si las cookies estan activadas
7 | console.log('Cookies activadas:', navigator.cookieEnabled);
8 |
9 | //Obtener el encabezado que el navegador envia.
10 | /*
11 | Nota: No utilizarlo para detectar el navegador del usuario:
12 | - Ya que varios navegadores pueden usar el mismo encabezado
13 | - Y se puede editar manualmente
14 | */
15 | console.log(navigator.userAgent);
16 |
17 | // Obtener el lenguaje del navegador web del usuario
18 | console.log(navigator.language);
19 |
20 | // Obtener si el navegador web esta conectado a internet
21 | console.log(navigator.onLine);
22 |
--------------------------------------------------------------------------------
/BOM/timers.js:
--------------------------------------------------------------------------------
1 | /*
2 | 📌 Eventos de Tiempo
3 | El Browser Object Model tambien nos da acceso a eventos de tiempo que nos permitiran
4 | ejecutar código cada cierto tiempo.
5 |
6 | Tenemos 2 metodos disponibles para trabajar con tiempo:
7 | - setTimeOut
8 | - setInterval
9 | */
10 |
11 | /*
12 | 📌 window.setTimeOut()
13 | Nos permite ejecutar una funcion despues de cierto tiempo.
14 | */
15 |
16 | // const saludo = () => {
17 | // console.log('Hola!');
18 | // };
19 |
20 | // const iniciar = () => {
21 | // console.log('Iniciando Timer');
22 | // setTimeout(saludo, 5000);
23 | // };
24 |
25 | /*
26 | setTimeout nos devuelve un un id para identificar el temporizador.
27 | Podemos guardar ese id y luego utilizarlo para limpiar el temporizador.
28 | */
29 | // let id;
30 | // const iniciar = () => {
31 | // console.log('Iniciamos el timeout');
32 | // id = setTimeout(() => {
33 | // console.log('Hola!');
34 | // }, 5000);
35 |
36 | // // Podemos acortarlo:
37 | // // setTimeout(() => console.log('Saludos Carlos!'), 1000);
38 | // };
39 |
40 | // const parar = () => {
41 | // console.log('Paramos la ejecución del timeout');
42 | // clearTimeout(id);
43 | // };
44 |
45 | /*
46 | 📌 window.setInterval()
47 | Nos permite ejecutar una funcion cada cierto tiempo.
48 | */
49 | let cuenta = 0;
50 | let id;
51 |
52 | const iniciar = () => {
53 | id = setInterval(() => {
54 | cuenta++;
55 | console.log(cuenta);
56 | }, 1000);
57 | };
58 |
59 | const parar = () => {
60 | console.log('Paramos la cuenta');
61 | clearInterval(id);
62 | };
63 |
--------------------------------------------------------------------------------
/BOM/window.js:
--------------------------------------------------------------------------------
1 | /*
2 | 📌 El Browser Object Model nos permite poder acceder a propiedades y metodos del navegador web.
3 | Ejemplos de cosas que nos permite hacer:
4 | - Acceder a la ventana para conocer su tamaño
5 | - Trabajar con la barra de direcciones
6 | - Mostrar alertas
7 | - etc
8 | */
9 |
10 | /*
11 | 📌 Window Object
12 | Representa la ventana del navegador.
13 | Las variables y funciones globales son parte del objeto de window
14 | */
15 |
16 | // Accediendo al metodo alerta de Window
17 | // window.alert();
18 |
19 | // Funcion global
20 | // alert();
21 |
22 | // Podemos conocer todas las propiedades y metodos
23 | // console.log(window);
24 |
25 | // Esto no incluye las barras de herramientas, marcadores, barras de scroll
26 | console.log(`La ventana de tu navegador mide ${window.innerWidth}px de ancho.`);
27 | console.log(`La ventana de tu navegador mide ${window.innerHeight}px de alto.`);
28 |
29 | /*
30 | 📌 Trabajar con ventanas
31 | Con el BOM podemos:
32 | - Abrir y cerrar ventanas.
33 | - Mover ventanas.
34 | - Cambiar el tamaño de ventanas.
35 | */
36 |
37 | /*
38 | 📌 window.open()
39 | Nos permite abrir ventanas del navegador
40 | Nota: Es posible que el navegador te pida permisos para abrir una nueva ventana.
41 |
42 | - 1er parametro: Dirección de la nueva ventana
43 | - 2do parametro: Nombre de la ventana
44 | - 3er parametro: Cadena de texto de opciones
45 |
46 | Nos devuelve un objeto para aceder a esa ventana
47 | */
48 | let ventana;
49 | const abrirVentana = () => {
50 | ventana = window.open('', '', 'width=500,height=500');
51 | ventana.document.write('Hola, escribiendo en la nueva ventana!');
52 |
53 | /* 📌 Podemos abrir pestañas */
54 | // window.open('https://google.com');
55 | };
56 |
57 | /*
58 | 📌 Cerramos una ventana
59 | Nota: Solo podemos cerrar ventanas que hayan sido abriertas por un script.
60 | */
61 | const cerrarVentana = () => {
62 | ventana.close();
63 | };
64 |
65 | /*
66 | 📌 Screen Object
67 | Representa la pantalla del usuario.
68 | */
69 |
70 | // Alto y ancho de pantalla
71 | console.log('Ancho de pantalla:', window.screen.width);
72 | console.log('Alto de pantalla:', window.screen.height);
73 |
74 | // Alto y ancho de pantalla sin contar la barra de windows
75 | console.log('Ancho de pantalla sin barra de Windows:', window.screen.availWidth);
76 | console.log('Alto de pantalla sin barra de windows:', window.screen.availHeight);
77 |
--------------------------------------------------------------------------------
/DOM/creandoElementos.js:
--------------------------------------------------------------------------------
1 | /*
2 | 📌 Agregando elementos al DOM
3 |
4 | Pasos a seguir:
5 | 1. Crear un elemento del DOM
6 | 2. Agregarle texto y atributos
7 | 3. Insertar el elemento dentro del DOM
8 | */
9 |
10 | const agregarCaja = () => {
11 | /*
12 | 📌 1. Creamos el elemento
13 | createElement - Recibe como parametro una cadena de texto con la etiqueta que queremos crear.
14 | */
15 | const nuevaCaja = document.createElement('div');
16 |
17 | /*
18 | 📌 2. Agregamos texto y atributos
19 | */
20 | // nuevaCaja.innerHTML = 'Nuevo texto!';
21 | nuevaCaja.innerText = 'Nueva caja!';
22 | nuevaCaja.setAttribute('id', 'nuevo-id');
23 | nuevaCaja.setAttribute('class', 'caja activa');
24 |
25 | /*
26 | 📌 3. Agregamos el elemento al DOM
27 | */
28 | const contenedor = document.getElementById('contenedor1');
29 |
30 | // .appendChild() - Agrega un elemento al final
31 | // contenedor.appendChild(nuevaCaja);
32 |
33 | /* .insertAdjacentElement() - Nos permite agregar un elemento
34 | Valores:
35 | afterbegin - como primer elemento
36 | beforebegin - antes del elemento padre
37 | beforeend - como ultimo elemento
38 | afterend - despues del elemento padre
39 | */
40 | // contenedor.insertAdjacentElement('beforeend', nuevaCaja);
41 |
42 | // .replaceWith() - Nos permite remplazar el elemento por otro
43 | document.querySelector('#contenedor1 .caja').replaceWith(nuevaCaja);
44 | };
45 |
--------------------------------------------------------------------------------
/DOM/delegacionDeEventos.js:
--------------------------------------------------------------------------------
1 | /*
2 | 📌 Delegación de Eventos
3 | Gracias a la propagacion de eventos podemos evitar agregar un eventListener por cada elemento que tengamos,
4 | y agregar solamente un eventListener al elemento padre y que decida ejecutar código o no.
5 | */
6 |
7 | /*
8 | 📌 Ejemplo sin delegación de eventos.
9 | Tenemos que agregar un evento por cada caja.
10 | Si tenemos muchas cajas esto puede ser un problema de rendimiento.
11 |
12 | Ademas de que tendremos problemas si hay elementos que son agregados o eliminados de forma dinamica.
13 | */
14 | // const cajas = document.querySelectorAll('.caja');
15 | // cajas.forEach((caja) => {
16 | // caja.addEventListener('click', (e) => {
17 | // console.log(`Click en la caja ${e.target.innerText}`);
18 | // });
19 | // });
20 |
21 | /*
22 | 📌 Ejemplo con delegación de eventos.
23 | Agregamos solo un evento al contenedor padre.
24 | Al ser solo un evento es más optimo.
25 |
26 | Al trabajar con delegación de eventos no nos preocupamos
27 | si hay elementos que son agregados o eliminados de forma dinamica
28 | */
29 | const contenedorPadre = document.getElementById('contenedor1');
30 | contenedorPadre.addEventListener('click', (e) => {
31 | // console.log('Ejecuta!');
32 | // Ejecuta si hacemos click en el contenedor o en los elementos hijos.
33 |
34 | // if (e.target.classList.contains('caja')) {
35 | // // Ejecuta solo si el elemento que fue clickeado tiene la clase caja.
36 | // console.log(`Hiciste click en la caja ${e.target.innerText}`);
37 | // }
38 |
39 | /*
40 | 📌 .matches()
41 | Con matches tambien podemos comprobar que el elemento tenga la clase caja.
42 | Con matches tenemos mas flexibilidad.
43 | */
44 | if (e.target.matches('div.caja')) {
45 | // Ejecuta solo si el elemento que fue clickeado tiene la clase caja.
46 | console.log(`Hiciste click en la caja ${e.target.innerText}`);
47 | }
48 | });
49 |
--------------------------------------------------------------------------------
/DOM/eliminandoElementos.js:
--------------------------------------------------------------------------------
1 | /*
2 | 📌 Eliminar elementos del DOM
3 | */
4 |
5 | const eliminarCaja = () => {
6 | const cajaAEliminar = document.querySelector('#contenedor1 .caja');
7 |
8 | if (cajaAEliminar) {
9 | const padre = cajaAEliminar.parentElement;
10 | padre.removeChild(cajaAEliminar);
11 | }
12 | };
13 |
--------------------------------------------------------------------------------
/DOM/eliminarEventos.js:
--------------------------------------------------------------------------------
1 | /*
2 | 📌 Eliminar eventos de un elemento
3 | */
4 |
5 | const boton1 = document.getElementById('boton1');
6 | const boton2 = document.getElementById('boton2');
7 | const primeraCaja = document.querySelector('.caja');
8 |
9 | const toggleClase = () => {
10 | primeraCaja.classList.toggle('activa');
11 | };
12 |
13 | // Click boton 1
14 | boton1.addEventListener('click', () => {
15 | // Agregamos el evento
16 | primeraCaja.addEventListener('click', toggleClase);
17 | });
18 |
19 | // Click boton 2
20 | boton2.addEventListener('click', () => {
21 | // Eliminamos el evento
22 | primeraCaja.removeEventListener('click', toggleClase);
23 | });
24 |
--------------------------------------------------------------------------------
/DOM/estilos.css:
--------------------------------------------------------------------------------
1 | @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;600&display=swap');
2 |
3 | * {
4 | box-sizing: border-box;
5 | margin: 0;
6 | padding: 0;
7 | }
8 |
9 | body {
10 | font-family: 'Poppins', sans-serif;
11 | min-height: 100vh;
12 | width: 100%;
13 | background: #eaeaea;
14 | color: #000;
15 | display: flex;
16 | flex-direction: column;
17 | align-items: center;
18 | justify-content: center;
19 | }
20 |
21 | .contenedor-principal {
22 | width: 90%;
23 | max-width: 1000px;
24 | display: grid;
25 | grid-template-columns: 1fr 1fr;
26 | gap: 40px;
27 | }
28 |
29 | .contenedor {
30 | display: grid;
31 | gap: 40px;
32 | padding: 40px;
33 | border: 2px solid #000;
34 | }
35 |
36 | .caja {
37 | background: #fcfcfc;
38 | padding: 40px;
39 | font-size: 24px;
40 | box-shadow: rgba(99, 99, 99, 0.2) 0px 2px 8px 0px;
41 | display: flex;
42 | align-items: center;
43 | justify-content: center;
44 | }
45 |
46 | .caja.activa {
47 | background: #2553df;
48 | color: #fff;
49 | }
50 |
51 | button {
52 | border: none;
53 | background: #2553df;
54 | font-family: 'Poppins', sans-serif;
55 | font-size: 22px;
56 | cursor: pointer;
57 | border-radius: 10px;
58 | color: #fff;
59 | padding: 14px 28px;
60 | margin-bottom: 20px;
61 | }
62 |
63 | button:hover {
64 | background: #1942be;
65 | }
66 |
--------------------------------------------------------------------------------
/DOM/eventos.js:
--------------------------------------------------------------------------------
1 | /*
2 | 📌 Eventos
3 | Los eventos en Javascript nos permiten reaccionar a cosas que ocurren en la página web
4 | Como por ejemplo reaccionar cuando:
5 | - la página termina de cargar
6 | - el usuario da click a un boton
7 | - pasa el mouse arriba de un elemento
8 | - escribe en un campo de texto
9 | - envia un formulario
10 | - etc.
11 |
12 | Hay cientos de eventos a los que podemos reaccionar:
13 | https://developer.mozilla.org/en-US/docs/Web/Events#event_listing
14 | */
15 |
16 | /*
17 | 📌 Eventos como atributo de elementos HTML
18 | Podemos agregar algunos eventos como atributo de un elemento HTML
19 | Ejemplo:
20 |
21 |
22 | */
23 | // const toggleClase = () => {
24 | // const caja = document.querySelector('.caja');
25 | // caja.classList.toggle('activa');
26 | // };
27 |
28 | /*
29 | 📌 Event Listener
30 | Una mejor forma de trabajar con eventos es agregando un listener.
31 | Un listener nos permitira vigilar cuando se ejecute un evento sin tener que ensuciar el código HTML.
32 | */
33 | const boton1 = document.getElementById('boton1');
34 | const primeraCaja = document.querySelector('.caja');
35 | boton1.addEventListener('click', () => {
36 | primeraCaja.classList.toggle('activa');
37 | });
38 |
39 | /*
40 | 📌 Agregando el evento a multiples elementos
41 | Podemos agregar el evento a multiples elementos recorriendolos mediante un ciclo.
42 | Nota: Esta no es la forma mas optima, en la proxima clase veremos una mejor forma.
43 | */
44 | // const cajas = document.querySelectorAll('.caja');
45 | // cajas.forEach((caja) => {
46 | // caja.addEventListener('click', () => {
47 | // console.log('Haz hecho click en una caja');
48 | // });
49 | // });
50 |
51 | /*
52 | 📌 Accediendo a información del evento
53 | Cuando trabajamos con eventListener, la funcion que le pasamos puede recibir como parametro el propio evento
54 | Este objeto contendra mucha informacion del evento.
55 | */
56 | // const segundaCaja = document.querySelectorAll('.caja')[1];
57 | // segundaCaja.addEventListener('click', (evento) => {
58 | // console.log(evento);
59 | // console.log(evento.target.innerText);
60 | // });
61 |
62 | // Ejemplo con todas las cajas
63 | // const cajas = document.querySelectorAll('.caja');
64 | // cajas.forEach((caja) => {
65 | // caja.addEventListener('click', (e) => {
66 | // console.log(`Haz hecho click en ${e.target.innerText}`);
67 | // });
68 | // });
69 |
--------------------------------------------------------------------------------
/DOM/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | Document Object Model
10 |
11 |
12 |
13 |
14 |
Caja 1
15 |
Caja 2
16 |
Caja 3
17 |
18 |
19 |
Caja 1
20 |
Caja 2
21 |
Caja 3
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/DOM/introduccion.js:
--------------------------------------------------------------------------------
1 | /*
2 | 📌 Document Object Model
3 | El DOM es un objeto que el navegador web hace cuando carga una página.
4 | El DOM contiene toda la estructura de una página web.
5 |
6 | Con el DOM podemos:
7 | • Agregar, Eliminar y Editar todos los elementos de la página junto con sus atributos.
8 | • Cambiar los estilos CSS de la página.
9 | • Reaccionar a eventos que ocurran en la página.
10 |
11 | El DOM ademas agrega propiedades, metodos y eventos a los elementos HTML.
12 |
13 | Gracias al DOM podemos trabajar con los elementos de una página web de forma dinamica.
14 | */
15 |
--------------------------------------------------------------------------------
/DOM/modificandoElementos.js:
--------------------------------------------------------------------------------
1 | /*
2 | 📌 A los elementos del DOM que obtenemos, Javascript les
3 | agrega metodos y propiedades que nos permitiran modificarlos.
4 | */
5 |
6 | /* 📌 elemento.innerHTML
7 | Nos permite cambiar el contenido HTML de un elemento
8 | */
9 | const primeraCaja = document.querySelectorAll('.caja')[0];
10 | primeraCaja.innerHTML = 'Hola!';
11 |
12 | /* 📌 elemento.attribute
13 | Nos permite acceder y cambiar atributos del elemento.
14 | */
15 | primeraCaja.id = 'nuevoId';
16 |
17 | /* 📌 elemento.setAttribute()
18 | Nos permite agregar o establecer el valor de un atributo del elemento
19 | */
20 | primeraCaja.setAttribute('class', 'caja activa');
21 | primeraCaja.setAttribute('data-id', 1);
22 | console.log(primeraCaja);
23 |
24 | /* 📌 elemento.style.property
25 | Nos permite cambiar los estilos css de un elemento
26 | */
27 | const contenedor2Caja1 = document.querySelector('#contenedor2 .caja');
28 | contenedor2Caja1.style.background = '#000';
29 | contenedor2Caja1.style.color = '#fff';
30 | contenedor2Caja1.style.textTransform = 'uppercase';
31 |
--------------------------------------------------------------------------------
/DOM/modificandoEstilosMedianteClases.js:
--------------------------------------------------------------------------------
1 | /*
2 | 📌 Podemos modificar los estilos CSS de un elemento de dos formas:
3 | - Agregando y quitando clases CSS
4 | - Modificando los estilos "inline" de cada elemento.
5 | */
6 |
7 | /*
8 | 📌 Modificar estilos CSS mediante clases
9 | */
10 | const primeraCaja = document.querySelector('#contenedor1 .caja');
11 |
12 | // classList - Nos permite obtener una lista de las clases del elemento
13 | console.log(primeraCaja.classList);
14 |
15 | // classList.add() - Nos permite agregar clases a un elemento.
16 | const agregarClase = () => {
17 | primeraCaja.classList.add('activa');
18 | };
19 |
20 | // classList.remove() - Nos permite eliminar clases de un elemento
21 | const eliminarClase = () => {
22 | primeraCaja.classList.remove('activa');
23 | };
24 |
25 | // classList.toggle() - Nos permite alternar clases de un elemento
26 | const toggleClase = () => {
27 | primeraCaja.classList.toggle('activa');
28 | };
29 |
30 | // classList.contains() - Nos permite comprobar si el elemento contiene una clase
31 | const comprobarClase = () => {
32 | if (primeraCaja.classList.contains('activa')) {
33 | console.log('La caja tiene la clase "activa"');
34 | } else {
35 | console.log('La caja no tiene la clase "activa"');
36 | }
37 |
38 | console.log('y contiene las siguientes clases:');
39 | // classList.forEach() - Nos permite iterar sobre cada clase
40 | primeraCaja.classList.forEach((clase) => {
41 | console.log(clase);
42 | });
43 | };
44 |
--------------------------------------------------------------------------------
/DOM/modificandoEstilosMedianteJs.js:
--------------------------------------------------------------------------------
1 | /*
2 | 📌 Podemos modificar los estilos CSS de un elemento de dos formas:
3 | - Agregando y quitando clases CSS
4 | - Modificando los estilos "inline" de cada elemento.
5 | */
6 |
7 | /*
8 | 📌 Modificar estilos CSS mediante "inline styles".
9 | */
10 | /*
11 | Los estilos inline se aplican arriba de los estilos que podamos tener en archivos CSS.
12 | Estos estilos se agregan en el atributo style del elemento.
13 | */
14 | const ultimaCaja = document.querySelector('#contenedor2 .caja:last-child');
15 |
16 | ultimaCaja.style.background = '#000';
17 | ultimaCaja.style.color = '#fff';
18 |
19 | /*
20 | 📌 La ventaja de trabajar con estilos inline es que podemos modificar los estilos de forma dinamica.
21 | */
22 | const cajas = document.querySelectorAll('.caja');
23 | let tamaño = 24;
24 | const incrementarFuente = () => {
25 | cajas.forEach((caja) => {
26 | caja.style.fontSize = `${tamaño + 1}px`;
27 | tamaño++;
28 | });
29 | };
30 |
31 | const disminuirFuente = () => {
32 | cajas.forEach((caja) => {
33 | if (tamaño > 8) {
34 | caja.style.fontSize = `${tamaño - 1}px`;
35 | tamaño--;
36 | }
37 | });
38 | };
39 |
--------------------------------------------------------------------------------
/DOM/propagacionDeEventos.js:
--------------------------------------------------------------------------------
1 | /*
2 | 📌 Propagación de eventos
3 | Nota importante:
4 | Cuando agregamos un evento a un elemento, todos los elementos que esten dentro del que recibio el evento
5 | tambien recibiran el mismo evento.
6 |
7 | Es decir que si le aplicamos un evento a un contenedor padre, todos los hijos tendran tambien el evento.
8 | */
9 | const contenedor = document.getElementById('contenedor1');
10 | contenedor.addEventListener('click', (e) => {
11 | console.log('Hiciste click en el contenedor');
12 | });
13 |
14 | primeraCaja.addEventListener('click', (e) => {
15 | // Podemos evitar la propagación:
16 | e.stopPropagation();
17 |
18 | console.log('Hiciste click en la caja1');
19 | });
20 |
--------------------------------------------------------------------------------
/DOM/tiposDePropagacion.js:
--------------------------------------------------------------------------------
1 | /*
2 | 📌 Cuando agregamos un evento a un elemento ese evento se propaga a los elementos hijo.
3 | */
4 | /*
5 | 📌 Bubbling (false, por defecto)
6 | En bubbling el evento del elemento hijo reacciona primero y despues el evento del elemento padre.
7 |
8 | 📌 Capturing (true)
9 | En capturing el elemento padre reacciona primero y despues el elemento hijo.
10 | */
11 | document.querySelector('.contenedor').addEventListener(
12 | 'click',
13 | () => {
14 | console.log('Click en el contenedor');
15 | },
16 | false // Solo es necesario ponerlo en el elemento padre.
17 | );
18 |
19 | document.querySelector('.caja').addEventListener('click', () => {
20 | console.log('Click en la caja');
21 | });
22 |
23 | /*
24 | 📌 Capturing
25 | En capturing el elemento padre reacciona primero y despues el elemento hijo.
26 | */
27 | document.querySelector('.contenedor').addEventListener(
28 | 'click',
29 | () => {
30 | console.log('Click en el contenedor');
31 | },
32 | true
33 | );
34 |
35 | document.querySelector('.caja').addEventListener('click', () => {
36 | console.log('Click en la caja');
37 | });
38 |
--------------------------------------------------------------------------------
/Extras/debugging.js:
--------------------------------------------------------------------------------
1 | /*
2 | 📌 Debugging con javascript
3 |
4 | Hacer debugging significa encontrar errores que podamos tener en nuestra aplicación.
5 | Existen varias formas de hacerlo:
6 |
7 | - mediante mensajes de consola como console.log(),
8 | - mediante las herramientas de desarrollador del navegador web
9 | - breakpoints
10 | - palabra "debugger"
11 | */
12 |
13 | const usuario = {
14 | nombre: '',
15 | edad: 0,
16 | acceso_permitido: true,
17 | };
18 |
19 | // Registramos los datos del usuario
20 | document.getElementById('boton1').addEventListener('click', () => {
21 | usuario.nombre = prompt('Ingresa tu nombre');
22 |
23 | /*
24 | 📌 Mediante consola
25 | */
26 | console.log(usuario);
27 |
28 | /*
29 | 📌 Mediante palabra debugger
30 | */
31 | // debugger;
32 |
33 | /*
34 | 📌 Mediante breakpoint
35 | */
36 |
37 | usuario.edad = prompt('Ingresa tu edad');
38 |
39 | if (usuario.edad >= 18) {
40 | acceso_permitido = true;
41 | } else {
42 | acceso_permitido = false;
43 | }
44 | });
45 |
--------------------------------------------------------------------------------
/Extras/estilos.css:
--------------------------------------------------------------------------------
1 | @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;600&display=swap');
2 |
3 | * {
4 | box-sizing: border-box;
5 | margin: 0;
6 | padding: 0;
7 | }
8 |
9 | body {
10 | font-family: 'Poppins', sans-serif;
11 | min-height: 100vh;
12 | width: 100%;
13 | background: #eaeaea;
14 | color: #000;
15 | display: flex;
16 | flex-direction: column;
17 | align-items: center;
18 | justify-content: center;
19 | }
20 |
21 | h1 {
22 | font-size: 80px;
23 | }
24 |
25 | h2 {
26 | font-size: 40px;
27 | font-weight: normal;
28 | margin-bottom: 40px;
29 | color: #848484;
30 | }
31 |
32 | button {
33 | border: none;
34 | background: #2553df;
35 | font-family: 'Poppins', sans-serif;
36 | font-size: 22px;
37 | cursor: pointer;
38 | border-radius: 10px;
39 | color: #fff;
40 | padding: 14px 28px;
41 | margin-bottom: 20px;
42 | }
43 |
44 | button:hover {
45 | background: #1942be;
46 | }
47 |
--------------------------------------------------------------------------------
/Extras/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Curso de Javascript
8 |
9 |
10 |
11 |
12 |
Curso de Javascript
13 |
Completo, Práctico y desde Cero
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/Extras/maps.js:
--------------------------------------------------------------------------------
1 | /*
2 | 📌 Maps
3 | Los mapas en javascript son como los objetos pero en donde
4 | las llaves (propiedades) pueden ser de cualquier tipo, incluyendo objetos.
5 | */
6 |
7 | const correo = {
8 | correo: 'correo@correo.com',
9 | };
10 |
11 | const mapa = new Map([
12 | ['nombre', 'Carlos'],
13 | [true, 'verdadero'],
14 | [
15 | correo,
16 | {
17 | password: '123',
18 | },
19 | ],
20 | ]);
21 |
22 | // console.log(mapa);
23 |
24 | // Obtener un valor
25 | // console.log(mapa.get('nombre'));
26 | // console.log(mapa.get(true));
27 | // console.log(mapa.get(correo));
28 |
29 | // Los mapas tambien tienen un metodo foreach
30 | // En los mapas primero va el valor y luego la propiedad
31 | mapa.forEach((valor, propiedad) => console.log(valor, propiedad));
32 |
--------------------------------------------------------------------------------
/Extras/sets.js:
--------------------------------------------------------------------------------
1 | /*
2 | 📌 Sets
3 | Los sets son una especie de arreglo que pero solo puede contener valores unicos.
4 | */
5 |
6 | // Crear un set
7 | const colores = new Set(['rojo', 'verde', 'azul']);
8 |
9 | // Agregar valores al set
10 | colores.add('amarillo');
11 |
12 | // Si intentamos agregar un valor repetido al set, este no se agregara
13 | colores.add('amarillo');
14 | console.log(colores);
15 |
16 | // Set tambien tiene el metodo forEach para recorrer los elementos
17 | colores.forEach((color) => console.log(color));
18 |
19 | // Los set pueden contener cualquier tipo de dato.
20 | const numeros = new Set([1, 2, 3, 4, 4, 4, 5]);
21 | console.log(numeros);
22 |
--------------------------------------------------------------------------------
/Extras/this.js:
--------------------------------------------------------------------------------
1 | /*
2 | 📌 Palabra reservada "this"
3 | La palabra "this" representa algo diferente dependiendo de donde se utiliza.
4 | */
5 |
6 | /*
7 | 📌 Fuera de cualquier bloque, representa el objeto global (window)
8 | */
9 | console.log(this);
10 |
11 | /*
12 | 📌 Dentro de una funcion se, representa el objeto global.
13 | */
14 | const miFuncion = () => {
15 | console.log(this);
16 | };
17 | miFuncion();
18 |
19 | /*
20 | 📌 En un evento se refiere al elemento que recibio el evento
21 |
22 | Nota: Solo cuando la función no es de tipo flecha
23 | Si es una funcion de tipo flecha se referira al objeto global.
24 | */
25 | document.getElementById('boton1').addEventListener('click', function () {
26 | console.log(this);
27 | });
28 |
29 | /*
30 | 📌 En un metodo, representa el objeto
31 | */
32 | class Usuario {
33 | constructor(nombre) {
34 | this.nombre = nombre;
35 | console.log(this);
36 | }
37 |
38 | miMetodo() {
39 | console.log(this);
40 | }
41 | }
42 |
43 | const nuevoUsuario = new Usuario('carlos');
44 | nuevoUsuario.miMetodo();
45 |
--------------------------------------------------------------------------------
/Formularios/estilos.css:
--------------------------------------------------------------------------------
1 | @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;600&display=swap');
2 |
3 | * {
4 | box-sizing: border-box;
5 | margin: 0;
6 | padding: 0;
7 | }
8 |
9 | body {
10 | font-family: 'Poppins', sans-serif;
11 | min-height: 100vh;
12 | width: 100%;
13 | background: #eaeaea;
14 | color: #000;
15 | display: flex;
16 | flex-direction: column;
17 | align-items: center;
18 | justify-content: center;
19 | }
20 |
21 | .contenedor {
22 | width: 90%;
23 | max-width: 1000px;
24 | }
25 |
26 | form {
27 | display: flex;
28 | flex-direction: column;
29 | align-items: center;
30 | gap: 20px;
31 | }
32 |
33 | form {
34 | font-size: 20px;
35 | }
36 |
37 | input {
38 | font-size: 18px;
39 | padding: 10px;
40 | }
41 |
42 | select {
43 | padding: 10px;
44 | font-size: 18px;
45 | }
46 |
47 | button {
48 | border: none;
49 | background: #2553df;
50 | font-family: 'Poppins', sans-serif;
51 | font-size: 22px;
52 | cursor: pointer;
53 | border-radius: 10px;
54 | color: #fff;
55 | padding: 14px 28px;
56 | margin-bottom: 20px;
57 | }
58 |
59 | button:hover {
60 | background: #1942be;
61 | }
62 |
--------------------------------------------------------------------------------
/Formularios/expresionesRegulares.js:
--------------------------------------------------------------------------------
1 | /*
2 | 📌 Expresiones Regulares dentro de formularios
3 | Podemos usar expresiones regulares para validar los campos de una forma más precisa.
4 |
5 | Guía de expresiones regulares:
6 | https://www.youtube.com/watch?v=wfogZfIS03U
7 |
8 | Ejemplo:
9 | https://regexr.com/71ua4
10 | */
11 | const formulario = document.forms['formulario-donacion'];
12 | formulario.addEventListener('submit', (e) => {
13 | e.preventDefault();
14 |
15 | const correo = formulario.correo.value;
16 | const expresionRegular = /[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+/;
17 |
18 | /*
19 | El metodo test lo podemos aplicar sobre una expresion regular
20 | Nos devuelve true o false dependiendo de si paso la prueba
21 | */
22 |
23 | if (!expresionRegular.test(correo)) {
24 | console.log('El correo es invalido');
25 | return;
26 | }
27 |
28 | console.log('Enviando datos');
29 | console.log(correo);
30 | });
31 |
--------------------------------------------------------------------------------
/Formularios/formularios.js:
--------------------------------------------------------------------------------
1 | /*
2 | 📌 Formularios
3 |
4 | Tenemos dos formas de acceder a los formularios.
5 | - Mediante el objeto forms
6 | - Mediante métodos del DOM
7 | */
8 |
9 | /*
10 | 📌 Mediante el objeto forms
11 | */
12 | /*
13 | El objeto forms contiene los formularios del documento.
14 | Podemos acceder a cada uno mediante su id
15 | Tambien podemos acceder a los inputs mediante su id o name
16 | console.log(document.forms['formulario-donacion']['correo']);
17 |
18 | /*
19 | 📌 Mediante métodos del DOM
20 | */
21 | const correo = document.querySelector('#formulario-donacion [name="correo"]');
22 |
23 | /*
24 | 📌 Cada input tiene propiedades a las que podemos acceder
25 | para obtener sus atributos, valores, etc.
26 | */
27 | const botonEnviar = document.getElementById('btnEnviar').addEventListener('click', (e) => {
28 | // Prevenimos el comportamiento por defecto del boton.
29 | // Por defecto los botones dentro de una etiqueta