CursosEmpresasBlogLiveConfPrecios

Buscador de películas

Clase 13 de 17 • Curso de API REST con Javascript: Ejemplos con APIs reales

Clase anteriorSiguiente clase

Contenido del curso

Presentación del proyecto: PlatziMovies
  • 1
    TheMovieDB: análisis de su API

    TheMovieDB: análisis de su API

    07:15
  • 2
    Bocetos en papel y diseño en Figma

    Bocetos en papel y diseño en Figma

    08:05
Configuración inicial y maquetación del proyecto
  • 3
    Configuración del entorno de desarrollo

    Configuración del entorno de desarrollo

    16:53
  • 4
    Maquetación del proyecto: HTML y CSS

    Maquetación del proyecto: HTML y CSS

    18:34
Consumiendo la API
  • 5
    Lista de películas en tendencia

    Lista de películas en tendencia

    16:41
  • 6
    Lista de categorías

    Lista de categorías

    10:32
  • 7
    Migración a Axios

    Migración a Axios

    07:18
Navegación
  • 8
    Location y hash navigation

    Location y hash navigation

    17:17
  • 9
    Mostrando y ocultando secciones

    Mostrando y ocultando secciones

    22:05
  • 10
    Error: carga duplicada de datos

    Error: carga duplicada de datos

    06:30
Views
  • 11
    Filtrando películas por categoría

    Filtrando películas por categoría

    21:38
  • 12
    Retos: scrollTop y DRY

    Retos: scrollTop y DRY

    11:13
  • 13
    Buscador de películas

    Buscador de películas

    11:10
  • 14
    Retos: historial de navegación y página de tendencias

    Retos: historial de navegación y página de tendencias

    06:19
  • 15
    Endpoint de detalles de una película

    Endpoint de detalles de una película

    18:55
  • 16
    Lista de películas recomendadas

    Lista de películas recomendadas

    07:36
Próximos pasos
  • 17
    Toma el Curso Profesional de Consumo de API REST con JavaScript

    Toma el Curso Profesional de Consumo de API REST con JavaScript

    02:19
    Edmir Galván Vázquez

    Edmir Galván Vázquez

    student•
    hace 4 años

    Mi solucion es esta:

    En la funcion donde manejamos el evento click de arrowBtn ya no ponemos que nos devuelva a '#home', sino a la URL que estuvimos anteriormente.

    Esto se logra mediante window.history que tiene varios metodos y entre ellos 'back()' que nos permite ir a la URL anterior que visito el usuario.

    arrowBtn.addEventListener('click', () => { location.hash = window.history.back(); });
      CHRISTIAN OLIVER SOLANO NUÑEZ

      CHRISTIAN OLIVER SOLANO NUÑEZ

      student•
      hace 4 años

      solución muy funcional

      Christian Velázquez

      Christian Velázquez

      student•
      hace 3 años

      Gracias! Buen tip!!

    Ricardo Andres Ojeda Silva

    Ricardo Andres Ojeda Silva

    student•
    hace 4 años

    Usando el método trim() se pueden evitar fallas en la búsqueda cuando haya espacios en blanco al principio o al final del string.

    searchFormBtn.addEventListener('click', () => { location.hash = `#search=${searchFormInput.value.trim()}`; });
      Diego Alejandro Presiga

      Diego Alejandro Presiga

      student•
      hace 4 años

      Que buen aporte!! Sin duda los detalles valen mucho!

      Leal Brigitte

      Leal Brigitte

      student•
      hace 3 años

      Detalles importantes. Graciaaas

    Antonio Rafael González Ferrer

    Antonio Rafael González Ferrer

    student•
    hace 3 años

    Buscando en la doc de Mozilla modifiqué el evento del arrowBtn:

    arrowBtn.onclick = () => window.history.back()
    Amauri Guillén

    Amauri Guillén

    student•
    hace 3 años

    Para evitar errores con búsquedas de 2 o más palabras separadas por un espacio, podemos usar decodeURI para decodificar el hash y obtener el string sin "%20".

    const query = decodeURI(location.hash.split("=")[1]); getMoviesBySearch(query)
    Orangel Jose Gonzalez Urbina

    Orangel Jose Gonzalez Urbina

    student•
    hace 4 años

    Esta es la forma que encontré 😬

    arrowBtn.addEventListener('click', () => { history.go(-1) });
      Christian Velázquez

      Christian Velázquez

      student•
      hace 3 años

      También, interesante solución. Gracias.

      JOSE RANGEL

      JOSE RANGEL

      student•
      hace 3 años

      Esta solución me ayudó. El window.history.back() hace un refresh de la página.

    Alan Cabrera

    Alan Cabrera

    student•
    hace 3 años

    Para solucionar el reto usé "window.history.back()" y además agregué un feature en el que si le das click al titúlo "Platzi Movies" te regresara al home. Para hacerlo solo habilité el título en esa pantalla quitandole la clase "inactive", y le agregué un addEventListener que redirigiera al home. Ponemos un "cursor: pointer" en css para que sea algo intuitivo en desktop y listo.

    Captura de pantalla de 2022-08-04 18-27-28.png
    Captura de pantalla de 2022-08-04 18-27-39.png
    Captura de pantalla de 2022-08-04 18-27-46.png

      Matias Diaz

      Matias Diaz

      student•
      hace 3 años

      Excelente! Yo termine removiendo la clase de 'inactive' para el titulo en la sección de 'categorías' y la de 'trends' porque use un poco por la app y me pareció incomodo no poder volver al home.

    Fernando Orozco Velasquez

    Fernando Orozco Velasquez

    student•
    hace 3 años

    Usando el método "decodeURI()" pude solucionar el problema de los espacios en blanco y el de tildes para realizar la búsqueda.

    Screenshot 2023-05-12 at 18.50.50.png
    Screenshot 2023-05-12 at 18.50.24.png

    async function getMoviesBySearch(query) { query = decodeURI(query); const { data } = await api(`search/movie`, { params: { query, }, }); const movies = data.results; genericSection.innerHTML = ""; createMovies(movies, genericSection);
    Kengya Moncada

    Kengya Moncada

    student•
    hace 3 años

    Amo ♥ éstas clases , la verdad he sentido mas confianza, me ha ayudado a reflexionar sobre mis proyectos anteriores. GRACIAS!!!

    Humberto Delgado

    Humberto Delgado

    student•
    hace 3 años

    El método solo funciona para quitar los espacios de un Sting al final y al comienzo. Estos métodos cumplen con la finalidad: espero los sirva

    location.hash = location.hash = `#search=${searchFormInput.value.replace(/\s+/g, '')}` location.hash = `#search=${searchFormInput.value.split(" ").join("")}`
    location.hash = `#search=${searchFormInput.value.split(" ").join("")}`
    Misael Gomez

    Misael Gomez

    student•
    hace 3 años

    Para eliminar los espacios en blanco, a los extremos y en el centro, podemos aplicar los siguientes métodos .split() y .join()

    searchFormBtn.addEventListener('click', ()=>{ location.hash='#search=' + searchFormInput.value.split(" ").join(''); console.log(searchFormInput.value.split(" ").join('')); });

    Dejo la documentación y un ejemplo https://pixonauta.com/eliminar-espacios-en-blanco-de-un-string-con-javascript/

    spiderman.png
    Manuel Cabos

    Manuel Cabos

    student•
    hace 2 años

    🚧 Problemas con el history.back(), tengo que retroceder 2 veces

    Si a alguien más le pasa que cuando hace una búsqueda o cuando le da al botón de search, y luego intenta retroceder ++tiene que hacerlo 2 veces++, ya sea con el botón de la flecha o con el buscador, esta es la solución que encontré agregando como parámetro el evento e y la función e.preventDefault(); :

    searchFormBtn.addEventListener('click', (e) => { if (searchFormInput.value.length > 0) { location.hash = `${SEARCH_HASH}=${searchFormInput.value}`; } e.preventDefault(); // Fix para que funcione correctamente el history.back() });

    . Estuve repasando mi código varias horas, debuggeando y regresando a commits anteriores, pero no encontré el problema, me pasa desde que creé el evento click para el botón del buscador, si alguien más sabe porque pasa, si estoy haciendo algo mal conoce otra solución, me avisa, dejo mi repo por si acaso 👀

      Henry Alexander Velásquez Rosas

      Henry Alexander Velásquez Rosas

      student•
      hace 2 años

      Me sirvió, gracias.

      Alirio Isea

      Alirio Isea

      student•
      hace un año

      Me funciono esta solución, gracias!! también llevaba rato probando y nada funcionaba jaja

    Eliezer Hernandez

    Eliezer Hernandez

    student•
    hace 3 años

    ¿Esta forma de ocultar componentes y mostrarlos dependiendo de la navegación es la forma actual de desarrollar páginas webs? Tenía entendido que para cada página existía un correspondiente archivo HTML con la estructura correspondiente a esa página, la manera de desarrollar ha cambiado o solo es una alternativa con sus ventajas.

      Juan Castro

      Juan Castro

      teacher•
      hace 3 años

      Sí y no. En este curso estamos desarrollando una Single Page Application, una aplicación que funciona en una sola página. Pero ¿cómo añadimos navegación en aplicaciones de una sola página? Hay muchas formas. Literalmente cada quien lo implementa como mejor funcione para su proyecto (o siguiendo las convenciones de su framework de preferencia). En este caso durante el curso implementamos nuestro propio router con JS vanilla. :D

    Cristian Zapata

    Cristian Zapata

    student•
    hace 3 años

    en la función getMoviesBySearch, pueden agregar este string para que les salga el nombre de lo que buscaron,

    headerCategoryTitle.innerHTML = 'Results for: ' + query;

    y en searchPage()

    headerCategoryTitle.classList.remove('inactive');
    Kevin Daniel Hincapie Lumbaque

    Kevin Daniel Hincapie Lumbaque

    student•
    hace 3 años

    Debo decir que mi código es diferente, he manejado de otra manera la navegabilidad y no tiene sentido para mi: 1- escuchar al icono de búsqueda para luego 2- leer el value del imput y 3-pasarlo al hash para luego volver a 4-leer el hash teniendo que aplicar métodos para separar el hash del valor y luego 5- realizar la solicitud 6- renderizar resultado

    Así que yo preferí hacerlo menos enredado, se aparta de la lógica que veníamos manejando con los hash pero no me parece eficiente enredar todo mas solo por seguir el patrón.. Lo que hice fue básicamente escuchar el evento de click sobre el icono y el evento de enter en el input y llamar a mi función render que lee el valor del input, hace una validacion sencilla para confirmar que no esta vacío el input y procede a quitar los espacios del query (la gente no siempre busca solo una palabra) para luego usarlo en el hash, mientras se hace la solicitud a la api y se crea la interfaz con el resultado, al final limpio el input para que este vacío

    export async function renderSearchModal() { const searchForm = document.querySelector(".search__input"); if (searchForm.value.lenght > 0) { const searchedValue = searchForm.value; const arraySearch = searchedValue.split(" "); location.hash = `search=${arraySearch.join("_")}`; const searchList = await getSearchedMovie(searchedValue); const searchModal = createSearchModal(searchList, searchedValue); body.append(searchModal); searchForm.value = " "; } }
    Ariel Ezequiel Biazzo Genua

    Ariel Ezequiel Biazzo Genua

    student•
    hace 3 años

    Holaa!

    No se si probaron en buscar con una separcion ej:_ star wars_

    Pues si lo hacen, la API no les devolvera nada ya que cuando tomamos el valor de la busqueda desde el hash, la palabra star wars se ve asi: "star%20wars"

    Soluciones:

    • Cambiar el codigo y en vez de tomar star wars de la url, pueden hacerlo tomando el valor del input.value, es lo mismo, solo deben pasarle a una nueva funcion como parametro el valor del input.

    • (MUCHO MAS FACIL) Hacer un codigo similar que trabaje con estos errores, asi:

    //funcion anonima que se llama inmediatamente para trabajar con la url (function getUrlParams() { const [_, query] = location.hash.split("=") let arrayStr, newQuery; if(query.includes("%20")) { arrayStr = query.split("%20") newQuery = arrayStr.join(" ") } console.log(newQuery) showMoviesSearched(newQuery) //headerCategoryTitle.innerHTML = name })();
    Luis Miguel Rojas Franco

    Luis Miguel Rojas Franco

    student•
    hace 3 años

    El buscador solo puede funcionar sin espacios? o se podría realizar algo como que si en el buscador coloco por ejemplo: “The Batman” pueda mostrarme los resultados sin mostrar la página sin resultados? intente usando decodeURI() para quitar los espacios pero no se pudo siempre muestra en el navegador en los espacios el %20 :(

      Juan Castro

      Juan Castro

      teacher•
      hace 3 años

      Yep, la URL traduce carácteres "especiales" (como los espacios) de esta forma. Habría que "traducirlos" manualmente. :thinking:

    Federico Maidana

    Federico Maidana

    student•
    hace 3 años

    Resulta que realice un buscador, funciona bárbaro en la versión de escritorio. Pero cuando intento utilizarlo en la versión móvil, directamente no funciona. Acá les dejo el repositorio, para que puedan ver el código. repositorio

      Juan Castro

      Juan Castro

      teacher•
      hace 3 años

      ¿Qué parte no funciona, Fede? Lo único que encontré fue que no funciona el viewport para tener el zoom. Pero la funcionalidad del buscador sí corre.

      Federico Maidana

      Federico Maidana

      student•
      hace 3 años

      Había un pequeño error (que me consumió toda la tarde LOL). Resulta que si entrabas al sitio desde el celular y utilizas el buscador, no funcionaba. Y esto se debe a que el teclado de los celulares siempre ponen a la primera letra en mayúsculas, de esta forma JAMAS iba a funcionar el buscador en el celular. Así que simplemente puse el valor del input en minúscula Y YA TODO funciono correctamente.

      Así que ya está resuelto. Gracias Juan por la ayuda.

    Ricardo Alfonso Chavez Vilcapoma

    Ricardo Alfonso Chavez Vilcapoma

    student•
    hace 3 años

    Mi solución usando métodos al alcance la mano :D

    arrowBtn.addEventListener("click",()=>{ location.hash = window.history.back(); //para guardar las URL que visita el usuario se usa window.history y par regresar al anterior el método back() });
    Hernan D`Andreis

    Hernan D`Andreis

    student•
    hace 2 años

    Como opcion a lo que propone el profe se puede agregar una variable que escuche el evento de click en el boton de search y capture el value de input en una variable que después pasamos como parametro a la función

    searchFormBtn.addEventListener('click', () => { let value = searchFormInput.value getSearchMovis(value) location.hash = `search=${value}` })
    Donovan RM

    Donovan RM

    student•
    hace 2 años

    Para el tema de buscar con espacios usé el siguiente codigo en el searchPage():

    const [searc, query] = location.hash.split('='); const busqueda = decodeURIComponent(query); console.log(busqueda); headerCategoryTitle.innerHTML= `Resultados: ${busqueda}` getMoviesBySearch(busqueda);
      Henry Alexander Velásquez Rosas

      Henry Alexander Velásquez Rosas

      student•
      hace 2 años

      Con expresiones regulares sería algo así:

      . Dentro de la función searchPage:

      const [_, query] = location.hash.split("="); // %20%20%20fury%20%20 const [name] = query.match(/[A-Za-z]+/g); showSearch(query);

      Igualmente en el addEventListener:

      searchFormBtn.addEventListener("click", () => { const [name] = searchFormInput.value.match(/[A-Za-z]+/g); location.hash = `#search=${name}`; });

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