CursosEmpresasBlogLiveConfPrecios

Event delegation

Clase 19 de 29 • Curso de Manipulación del DOM

Clase anteriorSiguiente clase

Contenido del curso

DOM y Web API
  • 1
    Y entonces nació internet...

    Y entonces nació internet...

    02:23
  • 2

    Accede a la versión más actualizada de este contenido

    00:14
  • 3
    ¿Qué es el DOM?

    ¿Qué es el DOM?

    02:39
  • 4
    Web APIs modernas

    Web APIs modernas

    03:17
Operaciones básicas
  • 5
    Leer nodos

    Leer nodos

    09:31
  • 6
    NodeLists vs Array

    NodeLists vs Array

    03:46
  • 7
    Crear y agregar

    Crear y agregar

    15:47
  • 8
    Otras formas de agregar

    Otras formas de agregar

    06:55
  • 9
    Atributos y propiedades

    Atributos y propiedades

    05:12
  • 10
    Eliminar nodos

    Eliminar nodos

    09:31
  • 11
    Operaciones en lote

    Operaciones en lote

    06:52
Workshop 1: Fetch
  • 12
    Presentación del proyecto

    Presentación del proyecto

    01:10
  • 13
    Descargando información y creando nodos

    Descargando información y creando nodos

    18:36
  • 14
    Enriqueciendo la información

    Enriqueciendo la información

    10:53
  • 15
    Usando la API de internacionalización del browser

    Usando la API de internacionalización del browser

    12:14
  • 16
    Comparte el resultado

    Comparte el resultado

    02:18
Eventos
  • 17
    Reaccionar a lo que sucede en el DOM

    Reaccionar a lo que sucede en el DOM

    13:58
  • 18
    Event propagation

    Event propagation

    12:08
  • 19
    Event delegation

    Event delegation

    05:32
Workshop 2: Lazy loading
  • 20
    Presentación del proyecto

    Presentación del proyecto

    03:34
  • 21
    Nuestro propio plugin Lazy Loading

    Nuestro propio plugin Lazy Loading

    08:32
  • 22
    Creando las imagenes con JavaScript

    Creando las imagenes con JavaScript

    17:33
  • 23
    Intersection Observer

    Intersection Observer

    14:21
  • 24
    Aplicando Lazy loading

    Aplicando Lazy loading

    13:07
  • 25
    Comparte el resultado

    Comparte el resultado

    03:17
Workshop 3
  • 26
    Proyectos propuestos

    Proyectos propuestos

    04:17
Librerías relacionadas
  • 27
    ¿Y jQuery?

    ¿Y jQuery?

    03:41
  • 28
    ¿Y JSX?

    ¿Y JSX?

    09:40
Conclusiones
  • 29
    Conclusiones

    Conclusiones

    01:56
    Carlos Eduardo Gomez García

    Carlos Eduardo Gomez García

    teacher•
    hace 5 años

    La delegación de eventos es básicamente un contenedor padre que le pasa el evento a todos sus hijos (en realidad no se los está pasando, sino que el contenedor padre sigue estando presente en todos los hijos, es por eso que cuando clicamos a un hijo el evento es disárado). . Entendiendo esto, cuando obtenemos el target podemos saber cuál elemento hijo del padre fue clicado, por tanto, con una simple condicional puede ver si el elemento clicado es el que yo quiero. . Ojo: Eso no significa que el evento se quite de los demás elementos hijos, si tu clicas cualquier otro elemento hijo el evento se va a disparar sí o sí, pero lo que sucede es que la condición del tarjet no se cumple, por eso no hace nada. . Y sabiendo esto, puedes hacer cosas chulas como crear funciones que escuchen eventos dinámicamente, una característica de los eventos es que solo se le aplican a los elementos que están desde el inicio, pero si tu agregas otro nodo desde JavaScript los eventos no se van a escuchar para ese nuevo nodo. Entonces, una técnica que se suele usar es escuchar al padre (o en ocasiones a todo el document) y cada vez que el evento ocurra buscar a todos sus hijos que coincidan con el selector al que queremos aplicarle el evento, de esta forma no importa si los nodos se añaden posteriormente desde JavaScript, el evento será escuchado pues JavaScript directamente irá a buscar todos los nodos hijos que cumplan con dicho selector, por ejemplo: HTML

    <div id="divPadre"> <div class="div"> Hola </div> </div>

    JavaScript

    document.querySelector(".div").addEventListener("click", () => { // Hace algo })

    En este caso, si al div padre yo le añadiera desde JavaScript otro elemento con la clase div, el evento NO funcionaría:

    const nuevoDiv = document.createElement("div"); nuevoDiv.className = "div"; nuevoDiv.textContent = "Nuevo div" divPadre.append(nuevoDiv)

    Sin emabrgo, al usar la delegación de eventos, puedo escuchar al padre y buscar al hijo que me interesa:

    nuevoDiv.addEventListener("click", event => { if(event.target.classList.contains("div")) { // Código } })

    De esta forma, no importa cuantos elementos nuevos agregues al padre desde JavaScript, esto siempre va a funcionar. . Ahora, si quieres hacer algo más pro, puedes crear una función en el cual tu le pases un selector en específico para usar dentro del div, así solo tienes que llamar a esa función y pasarle el selector de tal manera que se quede escuchando por cualquier elemento nuevo que sea agregado, algo así:

    eventAll("click", parentElement, elementToListen, () => { // Has algo })

    Una función de ese tipo sería muy útil, porque así puedo mantener escuchando cada elemento, no importa que se agregue después con JavaScript, y sí, yo ya la cree, de hecho hice una mini librería para escuchar eventos partiendo de esta base, pueden indagar el código aquí: . events.js . Claro, este código está desactualizado porque tiene un pequeño bug y hay ciertos elementos con los que no funciona, pero para eso podemos usar un MutationObserver que mire cuando el padre haya sido modificado (se le haya agregado un hijo nuevo) y a ese hijo aplicarle el evento, yo ya lo hice pero se los dejo de tarea si tienen cursiodidad sobre eso 👀

      Jonathan 🦑 Alvarez

      Jonathan 🦑 Alvarez

      teacher•
      hace 5 años

      wow fan de estos resumenes!

      Jimmy Buriticá Londoño

      Jimmy Buriticá Londoño

      student•
      hace 5 años

      Super 👍

    Fernando Quinteros Gutierrez

    Fernando Quinteros Gutierrez

    student•
    hace 5 años

    📩 Event delegation

    Apuntes

    • La idea principal es delegar un evento global a un solo nodo y desde esa parte poder delegar todos los eventos que sucedan
    • Se debe usar cuando el número de escuchadores es alto
    • Se trata de identificar de donde proviene el evento, según a ello se lo captura con un condicional y se procede a realizar las operaciones

    RESUMEN: La técnica event delegation consiste en dejar todos los eventos sucedan en un elemento superior de tal forma que este los identifique y aplique el procedimiento con condicionales

    Giselle Desiree Boyer Jimenez

    Giselle Desiree Boyer Jimenez

    student•
    hace 5 años

    Event delegation consiste en delegar a un solo padre (el padre) el manejo/escucha de los eventos que nos interesan, de esta manera tendremos un único eventListener en lugar de tener uno por cada elemento lo cual puede impactar en el rendimiento de nuestro sitio web cuando son muchos eventListeners. Si deseamos manejar la interacción solo sobre un elemento específico dentro del nodo padre, solo se debe especificar dentro de la función, para esto se puede usar la información provista por el elemento event.

      Andrés Felipe Lopez gomez

      Andrés Felipe Lopez gomez

      student•
      hace 5 años

      Muchas gracias

      Luis Alejandro Vera Hernandez

      Luis Alejandro Vera Hernandez

      student•
      hace 4 años

      Gracias, pregunta de examen jaja

    Stanley Melgar

    Stanley Melgar

    student•
    hace 4 años

    Como dato la diferencia entre target y currentTarget radica en que el primero hacer referencia al disparador del evento, donde debemos de interactuar para que este se ejecute. Por otro lado el currentTarget es el nodo padre en el que esta el disparador.

    Andres Felipe Pinchao Ramirez

    Andres Felipe Pinchao Ramirez

    student•
    hace 5 años

    MIS APUNTES EVENT DELEGATION 😎👌

    /*Utilizaremos nuestro proyecto anterior para que cuando le de click a cada uno de los elemento me salga un alert distinto */ const baseUrl = "https://platzi-avo.vercel.app"; const appNode = document.querySelector('#app'); /* 2 forma le agregaremos el escuchador de eventos al contenedor de nuestros elementos, a este patron se le conoce como delegacion de eventos estamos delegando a un solo nodo que es el padre de todos lo queremos escuchar que se encargue de manejar todos los eventos de esa zona. Es importante este patron cuando manejamos una gran cantidad de escuchadores y es manejada por la mayoria de frameworks importantates Esto hara que cuando demos click en cualquier parte del elemento se ejecute la alerta esto lo podemos arreglar Utilizando un condicional en la que utilizamos el parametro de la funcion que devuele el evento y entonces accedemos a la propiedad target a nodeName y le decimos que solo cuando el evento se hubique en el h2 dispare la alerta */ appNode.addEventListener('click', (event) => { if(event.target.nodeName === 'H2'){ window.alert("Hola"); } }); const formatPrice = price => { const newPrice = new window.Intl.NumberFormat("es-EN", { style: "currency", currency: "USD" }).format(price) return newPrice; } window .fetch(`${baseUrl}/api/avo`) .then(respuesta => respuesta.json()) .then(responseJson =>{ const todosLosItems = []; responseJson.data.forEach(item => { const imagen = document.createElement('img'); imagen.src = `${baseUrl}${item.image}`; imagen.className = "h-16 w-16 md:h-24 md:w-24 rounded-full mx-auto md:mx-0 md:mr-6" const titulo = document.createElement('h2'); titulo.className = "text-lg"; titulo.textContent = item.name; /* 1 forma de hacer que al dar click se ejecute una alerta Esto funciona pero hay que tener en cuenta que estamos agregando un eventListener por cada elemento que recibimos por parte de la API */ titulo.addEventListener('click', () => { window.alert("Hola"); }) const precio = document.createElement('div'); precio.className = "text-gray-600"; precio.textContent = formatPrice(item.price); priceAndTitle.className = "text-center md:text-left"; priceAndTitle.appendChild(titulo); priceAndTitle.appendChild(precio); const card = document.createElement("div"); card.className = "md:flex bg-white rounded-lg p-6 hover:bg-gray-300"; card.append(imagen, priceAndTitle); const container = document.createElement('div'); container.appendChild(card); todosLosItems.push(container); }); appNode.append(...todosLosItems) });
    Anfernee Valera

    Anfernee Valera

    student•
    hace 4 años

    Yo estuve curioseando y encontré que además de bubling también existe Capturing.

    Capturing.

    Esta forma de propagación funciona al revés que bubling, va desde el elemento mas afuera, hasta el evento seleccionado, activando así todos los padres que contuviesen el mismo evento.

    OJO

    No confundir Capturing con está técnica enseñada en clases llamada Event delegation la segunda sigue utilizando la forma de propagación Bubling Solo que le adjunta el Escuchador de eventos al padre, para así reaccionar a todos los clicks dentro de este.

    Jose David Villalobos Rodriguez

    Jose David Villalobos Rodriguez

    student•
    hace 4 años

    Importante destacar que los elementos dentro target.nodeName son todos en mayusculas. Si quisieras identificar un div sería "DIV" un input sería un "INPUT"

    Joel Eduardo Sánchez Herrera

    Joel Eduardo Sánchez Herrera

    student•
    hace 5 años

    El curso esta muy padre! pero neta todo en blanco? XDD mis ojos lloran

      Alvaro Ibáñez Vázquez

      Alvaro Ibáñez Vázquez

      student•
      hace 3 años

      La complejidad del ser humano crece a medida que se le brindan mas herramientas para su entorno

    Usuario anónimo

    Usuario anónimo

    user•
    hace 5 años

    Les comparto este artículo

    Alejandro Dotor

    Alejandro Dotor

    student•
    hace 5 años

    AYUDAAAAA!! Si yo quiero que el evento no sea para el H2 sino para el DIV que contiene toda la info(img, h...) Como seria el Event delegation

    Screen Shot 2021-01-24 at 11.58.56 AM.png

    No se si me explico, yo quiero que cuando se haga click en cualquier parte de este contenedor (no importa si es la imagen, el titulo, o el Background ETC) sala en consola que se hizo click (claro con event delegation, no vale seleccionar el contenedor con un querySelector )

      Jonathan 🦑 Alvarez

      Jonathan 🦑 Alvarez

      teacher•
      hace 5 años

      Hey hey!

      Se hace de forma similar a como muestro con el H2, solo que tenemos que:

      1. Validar que el nodo sea tipo DIV
      if (event.target.nodeName === 'DIV') { // ... }
      1. "Atrapar" únicamente el DIV que nos interesa.

      DIVs hay muchos, así que debemos identificar el que queremos. Para esto sugiero agregar una clase única al momento de crear este nodo, por ejemplo: "js-card-contenedor". Y así, el condicional quedaría como:

      if (event.target.nodeName === 'DIV' && event.target.classList.includes('js-card-contenedor')) { // ... }
      Alejandro Dotor

      Alejandro Dotor

      student•
      hace 5 años

      Graciaaaaas 💚💚

    Andrés Castellanos

    Andrés Castellanos

    student•
    hace 4 años

    ¿Por qué usar event delegation? Porque cuando agregas un nodo de manera dinámica con JS este no va a poder vincularse con un eventListener. Para ello se usa un padre que se haya cargado desde un inicio. Este articulo de medium lo explican detalladamente: https://medium.com/@bretdoucette/part-4-what-is-event-delegation-in-javascript-f5c8c0de2983 . Otra razón es porque afecta el rendimiento, aquí se habla de ello: https://stackoverflow.com/questions/28627606/does-adding-too-many-event-listeners-affect-performance

    CHRISTIAN OLIVER SOLANO NUÑEZ

    CHRISTIAN OLIVER SOLANO NUÑEZ

    student•
    hace 3 años

    evento con estilos tailwindcss

    sim.png

    const containerCards = document.querySelector('#container'); containerCards.addEventListener('click', (event) => { if(event.target.nodeName === 'H2'){ window.alert('Activaste un evento con el texto'); } if(event.target.nodeName === 'IMG'){ window.alert('Activaste un evento con la imagen'); } }); const image = document.createElement('img'); image.src = `${URLmain}${element.image}`; image.alt = element.name; image.className = 'w-11/12 rounded-full hover:opacity-75 cursor-pointer'; const title = document.createElement('h2'); title.textContent = element.name; title.className = 'ml-2 font-medium hover:text-green-500 cursor-pointer';
    Cristian Contreras

    Cristian Contreras

    student•
    hace 3 años

    Hola, comunidad. Alguien puede explicarme qué hace el método window.?

      Rodrigo Andre Gutierrez

      Rodrigo Andre Gutierrez

      student•
      hace 3 años

      esto lo saqué de desarrolloweb.com

      Window Hace referencia a la ventana actual. Es el objeto principal en la jerarquía y contiene las propiedades y métodos para controlar la ventana del navegador. De él dependen todos los demás objetos de la jerarquía. Vamos a ver la lista de sus propiedades y métodos.

      Jonathan Forero

      Jonathan Forero

      student•
      hace 3 años

      La variable "Window" en el contexto de los navegadores web se refiere a un objeto global que representa la ventana del navegador en la que se muestra un documento web. Es parte del modelo de objetos del navegador, que proporciona una interfaz para interactuar con los elementos de la página y realizar diversas acciones.

      El objeto "Window" contiene propiedades y métodos que permiten acceder y manipular la ventana del navegador, así como interactuar con los elementos de la página web cargada en dicha ventana. Algunas de las propiedades y métodos más comunes asociados con la variable "Window" incluyen:

      • Document: Proporciona acceso al objeto "Document" que representa el contenido de la página web cargada en la ventana del navegador. Permite realizar manipulaciones en la estructura del documento, acceder y modificar elementos HTML, cambiar estilos, agregar eventos y más.

      • Location: Proporciona información sobre la URL actual de la página web cargada en la ventana del navegador y permite redireccionar a otras páginas.

      • Navigator: Proporciona información sobre el navegador del usuario, como el nombre, la versión y el agente de usuario. También se utiliza para detectar características y capacidades específicas del navegador.

      • History: Proporciona acceso y control del historial de navegación del usuario. Permite realizar acciones como retroceder o avanzar en el historial de páginas visitadas.

      • Alert, Confirm, Prompt: Métodos que se utilizan para mostrar cuadros de diálogo al usuario con mensajes, solicitudes de confirmación o solicitudes de entrada de texto.

      Estas son solo algunas de las propiedades y métodos disponibles en el objeto "Window". La variable "Window" es esencial en la programación web, ya que permite interactuar con la ventana del navegador y crear aplicaciones web dinámicas y interactivas.

    Luciano Madroñal correa

    Luciano Madroñal correa

    student•
    hace 4 años

    Hola, hay algún método para saber si un elemento tiene un evento asignado?

      Alejandro Forero Vanegas

      Alejandro Forero Vanegas

      student•
      hace 4 años

      La forma que yo reviso si un elemento tiene un evento asignado lo hago a través del dev tools.

      Captura.PNG

      Jonathan Forero

      Jonathan Forero

      student•
      hace 3 años

      En JavaScript, no hay un método integrado para verificar si un elemento tiene un evento asignado directamente. Sin embargo, puedes utilizar algunas técnicas para determinar si se ha asignado un evento a un elemento. A continuación, te mostraré dos enfoques comunes:

      1. Comprobación de la existencia de un manejador de eventos directamente en la propiedad del elemento:

      Puedes verificar si un elemento tiene un evento asignado revisando la propiedad del elemento que corresponde al evento específico. Por ejemplo, si deseas verificar si se ha asignado el evento "click" a un elemento con el id "myElement", puedes hacer lo siguiente:

      var element = document.getElementById('myElement'); if (typeof element.onclick === 'function') { console.log('El elemento tiene un evento click asignado.'); } else { console.log('El elemento no tiene un evento click asignado.'); }

      Este enfoque comprueba directamente la existencia de un manejador de eventos en la propiedad específica del elemento. Sin embargo, este método solo funciona si el evento se ha asignado directamente a la propiedad del elemento y no a través de otros métodos como addEventListener().

      1. Uso de getEventListeners() (solo en navegadores con compatibilidad):

      Algunos navegadores modernos proporcionan una función llamada getEventListeners() que puede utilizarse para obtener una lista de eventos asignados a un elemento. Sin embargo, esta función no es parte de la especificación oficial de JavaScript y puede no estar disponible en todos los navegadores.

      var element = document.getElementById('myElement'); var eventListeners = getEventListeners(element); if (eventListeners.click && eventListeners.click.length > 0) { console.log('El elemento tiene un evento click asignado.'); } else { console.log('El elemento no tiene un evento click asignado.'); }

      Este método utiliza la función getEventListeners() para obtener una lista de eventos y sus manejadores asociados para el elemento especificado. Luego, se verifica si hay algún manejador de eventos para el evento específico que estás buscando.

      Es importante destacar que este segundo enfoque puede no funcionar en todos los navegadores, ya que no es parte de la especificación oficial. Por lo tanto, se recomienda utilizar el primer enfoque si deseas una solución más ampliamente compatible.

    Sebastian Rodriguez

    Sebastian Rodriguez

    student•
    hace 3 años

    QUE BUENA clase, estaba construyendo una e-commerce y queria que los productos se habrieran solo al dar click en la imagen. No olviden que para usar .nodeName es en mayuzcula: "IMG", "DIV" etc, perdí media hora con eso XD

    Usuario anónimo

    Usuario anónimo

    user•
    hace 4 años

    (○` u′○) ato curioso, las comparaciones del nodeName se hacen siempre en mayusculas. .

    Event delegation

    Al patron de la combinación de eventos y su forma del propagarse en el DOM se le llama “Event Delegation” o delegación de eventos.

    Ejemplo:

    // señalando a todos los P de un div.container document.querySelector("div.container").addEventListener("click", (event) => { console.log(event.target.nodeName) if (event.target.nodeName === "P") { window.alert("Hola") } })

    Nota: Los “nodeName” se refieren siempre en MAYUSCULAS!

    Nota2: El event delegation es un patron sumamente poderoso que debemos utilizar siempre que sea posible, especialmente cuando el numero de escuchadores de eventos sea relativamente grande o se espera que sea grande.

    Esta técnica la utiliza REACT, Angular, Svelte y todos los frameworks, pues cada vez que utilizamos eventos, estos frameworks no agregan directamente a los nos sino que lo agregan al body, al document o cualquier otro elemento que se considera la raíz de la aplicación.

      Facundo Martinez

      Facundo Martinez

      student•
      hace 3 años

      Muchas gracias!!

    Jose Manuel Montaño Saenz

    Jose Manuel Montaño Saenz

    student•
    hace 4 años

    Event delegation

    Es una solución eficaz para evitar el stopPropagation. Básicamente lo que debemos es colocar nuestro listener en el elemento padre y en la función a ejecutar colocamos una condicional para saber el tipo de selector que disparo el evento, ya con esta información ejecutamos código según el ejecutor del evento.

    Este patrón lo debemos usar siempre que sea posible y mas cuando la cantidad de listener es relativamente enorme.

    Camilo Perilla

    Camilo Perilla

    student•
    hace 5 años

    event.target siempre hará referencia al nodo que recibió el evento. Es muy posible que en este ejemplo este nodo sea un H2, IMG, o la etiqueta que muestra el precio. Para mostar la alerta cada vez que se de un click en la card sin importar que etiqueta interna recibio el click, podemos usar event.target.closest('clase de la card'). Usando la clase de la card, podemos obtener su nodo desde un node hijo.

      Erlyn David Ascarate Lachi

      Erlyn David Ascarate Lachi

      student•
      hace 4 años

      Oh. Que genial. Me sirvio :D

    Daniel David Mármol Rivero

    Daniel David Mármol Rivero

    student•
    hace 5 años
    appNode.addEventListener("click", (evento) => { if (evento.target.nodeName === "H2"){ window.alert('Hola'); } //De esta forma sólo funcionará para los títulos en el nodo H2 en el nodo padre document. });

    De esta forma se encarga de manejar todos los elementos y que escuche solo los que requerimos, esto se usa generalmente cuando los eventos y escuchadores son realmente grandes. Todos los framewoks (Angular, Vue.js, React JS, ect) lo usan por debajo agregándolo al body, document o cualquier que ellos consideren como la raíz.

    Fernando Quinteros Gutierrez

    Fernando Quinteros Gutierrez

    student•
    hace 5 años

    ¿Si deseáramos dejar de usar un evento con esta técnica, cuál sería la mejor forma de manejarlo? me surgió la duda debido a que estamos usando condicionales

      Jonathan 🦑 Alvarez

      Jonathan 🦑 Alvarez

      teacher•
      hace 5 años

      Muy buena pregunta!

      Todos los eventos se deben registrar con una función:

      element.addEventListener('click', miFuncion)

      Así que para des-registrar se debe indicar exactamente la misma función:

      element.removeEventListener('click', miFuncion)

      Es por eso, que si se necesita retirar un eventListener es mala idea hacerlo con funciones anónimas (funciones que no tienen nombre) o funciones inline. Por ejemplo, esta función no hay forma de des-registrarla porque no tiene un nombre que la identifique:

      element.addEventListener('click', () => console.log('holita'))

Escuelas

  • Desarrollo Web
    • Fundamentos del Desarrollo Web Profesional
    • Diseño y Desarrollo Frontend
    • Desarrollo Frontend con JavaScript
    • Desarrollo Frontend con Vue.js
    • Desarrollo Frontend con Angular
    • Desarrollo Frontend con React.js
    • Desarrollo Backend con Node.js
    • Desarrollo Backend con Python
    • Desarrollo Backend con Java
    • Desarrollo Backend con PHP
    • Desarrollo Backend con Ruby
    • Bases de Datos para Web
    • Seguridad Web & API
    • Testing Automatizado y QA para Web
    • Arquitecturas Web Modernas y Escalabilidad
    • DevOps y Cloud para Desarrolladores Web
  • English Academy
    • Inglés Básico A1
    • Inglés Básico A2
    • Inglés Intermedio B1
    • Inglés Intermedio Alto B2
    • Inglés Avanzado C1
    • Inglés para Propósitos Específicos
    • Inglés de Negocios
  • Marketing Digital
    • Fundamentos de Marketing Digital
    • Marketing de Contenidos y Redacción Persuasiva
    • SEO y Posicionamiento Web
    • Social Media Marketing y Community Management
    • Publicidad Digital y Paid Media
    • Analítica Digital y Optimización (CRO)
    • Estrategia de Marketing y Growth
    • Marketing de Marca y Comunicación Estratégica
    • Marketing para E-commerce
    • Marketing B2B
    • Inteligencia Artificial Aplicada al Marketing
    • Automatización del Marketing
    • Marca Personal y Marketing Freelance
    • Ventas y Experiencia del Cliente
    • Creación de Contenido para Redes Sociales
  • Inteligencia Artificial y Data Science
    • Fundamentos de Data Science y AI
    • Análisis y Visualización de Datos
    • Machine Learning y Deep Learning
    • Data Engineer
    • Inteligencia Artificial para la Productividad
    • Desarrollo de Aplicaciones con IA
    • AI Software Engineer
  • Ciberseguridad
    • Fundamentos de Ciberseguridad
    • Hacking Ético y Pentesting (Red Team)
    • Análisis de Malware e Ingeniería Forense
    • Seguridad Defensiva y Cumplimiento (Blue Team)
    • Ciberseguridad Estratégica
  • Liderazgo y Habilidades Blandas
    • Fundamentos de Habilidades Profesionales
    • Liderazgo y Gestión de Equipos
    • Comunicación Avanzada y Oratoria
    • Negociación y Resolución de Conflictos
    • Inteligencia Emocional y Autogestión
    • Productividad y Herramientas Digitales
    • Gestión de Proyectos y Metodologías Ágiles
    • Desarrollo de Carrera y Marca Personal
    • Diversidad, Inclusión y Entorno Laboral Saludable
    • Filosofía y Estrategia para Líderes
  • Diseño de Producto y UX
    • Fundamentos de Diseño UX/UI
    • Investigación de Usuarios (UX Research)
    • Arquitectura de Información y Usabilidad
    • Diseño de Interfaces y Prototipado (UI Design)
    • Sistemas de Diseño y DesignOps
    • Redacción UX (UX Writing)
    • Creatividad e Innovación en Diseño
    • Diseño Accesible e Inclusivo
    • Diseño Asistido por Inteligencia Artificial
    • Gestión de Producto y Liderazgo en Diseño
    • Diseño de Interacciones Emergentes (VUI/VR)
    • Desarrollo Web para Diseñadores
    • Diseño y Prototipado No-Code
  • Contenido Audiovisual
    • Fundamentos de Producción Audiovisual
    • Producción de Video para Plataformas Digitales
    • Producción de Audio y Podcast
    • Fotografía y Diseño Gráfico para Contenido Digital
    • Motion Graphics y Animación
    • Contenido Interactivo y Realidad Aumentada
    • Estrategia, Marketing y Monetización de Contenidos
  • Desarrollo Móvil
    • Fundamentos de Desarrollo Móvil
    • Desarrollo Nativo Android con Kotlin
    • Desarrollo Nativo iOS con Swift
    • Desarrollo Multiplataforma con React Native
    • Desarrollo Multiplataforma con Flutter
    • Arquitectura y Patrones de Diseño Móvil
    • Integración de APIs y Persistencia Móvil
    • Testing y Despliegue en Móvil
    • Diseño UX/UI para Móviles
  • Diseño Gráfico y Arte Digital
    • Fundamentos del Diseño Gráfico y Digital
    • Diseño de Identidad Visual y Branding
    • Ilustración Digital y Arte Conceptual
    • Diseño Editorial y de Empaques
    • Motion Graphics y Animación 3D
    • Diseño Gráfico Asistido por Inteligencia Artificial
    • Creatividad e Innovación en Diseño
  • Programación
    • Fundamentos de Programación e Ingeniería de Software
    • Herramientas de IA para el trabajo
    • Matemáticas para Programación
    • Programación con Python
    • Programación con JavaScript
    • Programación con TypeScript
    • Programación Orientada a Objetos con Java
    • Desarrollo con C# y .NET
    • Programación con PHP
    • Programación con Go y Rust
    • Programación Móvil con Swift y Kotlin
    • Programación con C y C++
    • Administración Básica de Servidores Linux
  • Negocios
    • Fundamentos de Negocios y Emprendimiento
    • Estrategia y Crecimiento Empresarial
    • Finanzas Personales y Corporativas
    • Inversión en Mercados Financieros
    • Ventas, CRM y Experiencia del Cliente
    • Operaciones, Logística y E-commerce
    • Gestión de Proyectos y Metodologías Ágiles
    • Aspectos Legales y Cumplimiento
    • Habilidades Directivas y Crecimiento Profesional
    • Diversidad e Inclusión en el Entorno Laboral
    • Herramientas Digitales y Automatización para Negocios
  • Blockchain y Web3
    • Fundamentos de Blockchain y Web3
    • Desarrollo de Smart Contracts y dApps
    • Finanzas Descentralizadas (DeFi)
    • NFTs y Economía de Creadores
    • Seguridad Blockchain
    • Ecosistemas Blockchain Alternativos (No-EVM)
    • Producto, Marketing y Legal en Web3
  • Recursos Humanos
    • Fundamentos y Cultura Organizacional en RRHH
    • Atracción y Selección de Talento
    • Cultura y Employee Experience
    • Gestión y Desarrollo de Talento
    • Desarrollo y Evaluación de Liderazgo
    • Diversidad, Equidad e Inclusión
    • AI y Automatización en Recursos Humanos
    • Tecnología y Automatización en RRHH
  • Finanzas e Inversiones
    • Fundamentos de Finanzas Personales y Corporativas
    • Análisis y Valoración Financiera
    • Inversión y Mercados de Capitales
    • Finanzas Descentralizadas (DeFi) y Criptoactivos
    • Finanzas y Estrategia para Startups
    • Inteligencia Artificial Aplicada a Finanzas
    • Domina Excel
    • Financial Analyst
    • Conseguir trabajo en Finanzas e Inversiones
  • Startups
    • Fundamentos y Validación de Ideas
    • Estrategia de Negocio y Product-Market Fit
    • Desarrollo de Producto y Operaciones Lean
    • Finanzas, Legal y Fundraising
    • Marketing, Ventas y Growth para Startups
    • Cultura, Talento y Liderazgo
    • Finanzas y Operaciones en Ecommerce
    • Startups Web3 y Blockchain
    • Startups con Impacto Social
    • Expansión y Ecosistema Startup
  • Cloud Computing y DevOps
    • Fundamentos de Cloud y DevOps
    • Administración de Servidores Linux
    • Contenerización y Orquestación
    • Infraestructura como Código (IaC) y CI/CD
    • Amazon Web Services
    • Microsoft Azure
    • Serverless y Observabilidad
    • Certificaciones Cloud (Preparación)
    • Plataforma Cloud GCP

Platzi y comunidad

  • Platzi Business
  • Live Classes
  • Lanzamientos
  • Executive Program
  • Trabaja con nosotros
  • Podcast

Recursos

  • Manual de Marca

Soporte

  • Preguntas Frecuentes
  • Contáctanos

Legal

  • Términos y Condiciones
  • Privacidad
  • Tyc promociones
Reconocimientos
Reconocimientos
Logo reconocimientoTop 40 Mejores EdTech del mundo · 2024
Logo reconocimientoPrimera Startup Latina admitida en YC · 2014
Logo reconocimientoPrimera Startup EdTech · 2018
Logo reconocimientoCEO Ganador Medalla por la Educación T4 & HP · 2024
Logo reconocimientoCEO Mejor Emprendedor del año · 2024
De LATAM conpara el mundo
YoutubeInstagramLinkedInTikTokFacebookX (Twitter)Threads