Jonathan Alfonso
Juan Castro
ProfesorJose Castillo
Daniel Alberto Méndez Pérez
Jose Castillo
Victor Andres Barilin
Jonathan Guidi
Carlos Rodríguez
David Prado
Ameth Ordoñez Erazo
Juan José Verón
Ameth Ordoñez Erazo
Lisbeth Quintero
Gilbert Ardila
Marcelo Jorge Bellizia
Sergio Javier Lopez Olivera
Rigoberto Maldonado
Juan Fernando Yepes Muñoz
Roger Fernandes
Jorge Garcia
Juan Castro
ProfesorLautaro Els
Daniel Alberto Méndez Pérez
mars Dev
Dario Paladines
Gabriel Hernández Valdez
Yo creé una imagen de fondo para cada género de película con el color identificatorio, y le agregué un span con el título en el centro para que se puedan identificar.
movieImg.addEventListener('error', () => { movieImg.setAttribute('src', `images/bg-default-${movie.genre_ids[0]}.png`) const movieTitleText = document.createTextNode(movieImg.getAttribute('alt')); const movieTitle = document.createElement('span'); movieContainer.appendChild(movieTitle); movieTitle.appendChild(movieTitleText); })
Uffff. Esta propuesta me gusta muchísimo más que la mía. Muy bien ahí. :+1:
un shorthand para ese evento es:
movieImg.onerror = () =>{ movieImg.setAttribute('src', `${imgErrorUrl}`); movieImg.setAttribute('alt'), 'url-broke-img'; }
como los las peliculas que no tiene imagen, tampoco tiene datos se pueden ocultar con dispplay none..
movieImg.addEventListener('error', () => { movieImg.style.display= "none"; });
En todos los casos no es así.. hay varias películas que tienen la url rota, pero si poseen descripción.
No soy muy bueno con la creatividad, pero esto fue lo que hice! jajaja
Yo en vez utilizar un "addEventListener" con el evento "Error", utilice una condicional if(movie.poster_path === null){...} nose si fue la solucion mas optima, pero me funciono!
Las imágenes de tiipo place holder también ayudan mucho:
https://via.placeholder.com/300x450/5c218a/ffffff?text=${title}
.
.
Como la api nos devuelve un null al no tener imagen, podemos condicionar el src dentro e la función de agregar imagen:
const src = posterPath ? imgCorrecta : imgNoEncontrada
. Cambios en el commiit: Click aquí . . Referencia:
Para los que aun no se les aplique el LazyLoading en la pagina de Categorías. Revisen si agregando min-height en la categoría .genericList-container .movie-img se soluciona .
Nada, a mi no, y asi lo tengo:
.genericList-container .movie-img { height: 225px; min-height: 225px; max-height: 225px; width: 150px; min-width: 150px; max-width: 150px; }
@amethgabriel acuerdate de pasarle el true a getMoviesByCategory(id)
Yo no vi necesario cargar una imagen, solo cree una nueva clase en CSS para mostrar cuando no cargue la imagen: Queda así:
Primero que todo agrego en un dataset de la imagen, llamado data-img, el valor del path de la imagen, que si no existe, viene "null". Entonces en el observador agrego esta validación:
Básicamente lo que hago es agregarle una clase nueva si la imagen no existe.
La clase CSS es esta:
En el pseudoelemento ::before de la clase indicamos los estilos a mostrar cuando la imagen no cargue, además aprovechamos que el nombre de la pelicula está en el atributo "alt" y se muestra solo, sin hacer nada más.
Le agregué una imagen y un span con el título de la película.
movieImg.addEventListener('error', ()=>{ movieImg.setAttribute('src', 'https://img.icons8.com/arcade/512/popcorn.png') let movieTitle = document.createElement('span') movieTitle.textContent = movie.title console.log(movieTitle) movieContainer.insertAdjacentElement("afterbegin", movieTitle) movieTitle.style.fontWeight = 'bold' movieContainer.style.display = 'flex' movieContainer.style.flexDirection = 'column' movieContainer.style.alignItems = 'center' })
lo que yo hago es verificar si la propiedad poster_path esta vacía, si es así no muestro la película, en la busqueda de cada pelicula verifico lo mismo pero si el backdrop_path está vacío muestro el poster_path, si los dos están vacíos muestro otra imagen por defecto https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRb-j5czZKCBg2Og1We4HoVkt-YBX8dwiz_kQ&usqp=CAU
Le agregue el titulo y unos estilos para que quede con mejor accesibilidad.
css:
.movie-noLoad{ display: flex; align-items: center; justify-content: center; flex-direction: column; height: 237px; width: 47.5%; }
Yo lo solucioné detectando cuando era 'null' la direccion de la imagen al momento de cargar la película: . . .
Le puse esta imagen para que se viera mas divertido que el icono feo del navegador. Espero haber usado correctamente mi inglés, si no lo usé bien pido perdón
. Este es el código que usé, ahora iré a ver como lo hizo el profe :)
movieImg.addEventListener('error', () => { movieContainer.classList.add('error-img-msg'); movieContainer.textContent= ''; const errorImg = document.createElement('img'); errorImg.classList.add('error-img'); errorImg.src = './assets/undraw_location_search_re_ttoj.svg' const errorText = document.createElement('p') errorText.innerText = `We searched all the galaxies, but we couldn't find the image from this movie. This is the name of the movie: ${movie.original_title}.` movieContainer.append(errorImg, errorText); })
Esta es mi solución, agregar una imagen de 1x1 px en base64 y luego agregar el nombre de la pelicula en un span:
movieImg.addEventListener('error', () => { movieImg.setAttribute('src', `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mOMUez6DwAD8AIIOhah/wAAAABJRU5ErkJggg==`) const movieImgTitleSpan = document.createElement('span'); const movieImgTitle = document.createTextNode(movie.title); movieContainer.appendChild(movieImgTitleSpan); movieImgTitleSpan.appendChild(movieImgTitle); })
hay que agregar un poco de css:
.movie-container { cursor: pointer; position: relative; } .movie-container span { color: var(--purple-light-2); left: 0; margin: auto; padding: 10px; position: absolute; right: 0; text-align: center; top: 50%; transform: translate(0, -50%); width: 100%; }
Resultado búsqueda "demo":
mi solucion
Me gusta :clap:
esa es mi solucion
movie.poster_path !== null ? `https://image.tmdb.org/t/p/w300${movie.poster_path}` : `https://as01.epimg.net/meristation/imagenes/2021/04/26/reportajes/1619438192_264857_1619438392_sumario_normal.jpg` )
no se si esta bien pero me funciono
hice algo sencillo
movieImg.addEventListener('error', () => { movieImg.style.paddingTop = "100px"; movieImg.style.fontSize = "1.5rem"; });
.movie-container{ cursor: pointer; display: flex; text-align: center; }
Hola buenas tardes compañeros esta es mi solución :D
movies.map( movie => { //Creo una variable donde guardo toda la ruta donde le asigno el poster path de cada movie let posterImage = `https://image.tmdb.org/t/p/w300/${movie.poster_path}`; console.log("Pelicula creada!"); const $movieContainer = d.createElement('div'); $movieContainer.classList.add('movie-container'); const $img = d.createElement('img'); $img.classList.add('movie-img'); //Aqui sucede la magia //Indagando un poco en la pagina de placeholder se me ocurrio //ya que al no encontrarse con una image me devuelve null //con el metodo include verifico si existe "null" y si existe le agrego una placeholderImage sino le agrego el poster path $img.dataset.image = (!posterImage.includes('null')) ? posterImage : `https://via.placeholder.com/150/FFFF00/000000?text=${movie.title}`; $img.dataset.id = movie.id; $img.alt = `${movie.title}`; $movieContainer.appendChild($img); $fragment.appendChild($movieContainer); //Aquí está! addImage($img); });
Problema resuelto. Simplemente le agregue un condicional cuando esté creando la película, si es que el hash de la pelicula es null entonces crea una img
if ((movie.poster_path)== null){ const movieImg = document.createElement("img"); movieImg.classList.add("imagen"); movieImg.setAttribute("alt", movie.title); movieImg.setAttribute("src", "https://i.ibb.co/dKGRLmx/fposter-small-wall-texture-product-750x1000.jpg"); container.appendChild(movieImg); }else{ const movieImg = document.createElement("img"); movieImg.classList.add("imagen"); movieImg.setAttribute("alt", movie.title); movieImg.setAttribute("src", "https://image.tmdb.org/t/p/w300" + movie.poster_path); container.appendChild(movieImg); container.addEventListener("click", ()=>{ location.hash = "#movie=" + movie.id }) } })
A mi me pasaba ese error de CSS en un proyecto react con los intersection observer, cargaba todo y no sabia porque, lo encontre debbugeando y mi solución fue colocar un skeleton y que se observara ese elemento para hacer la carga de mas datos.
Haciendo asi que el skeleton se fuera recorriendo con cada carga nueva de datos haciendo que el observe diera: false.
Me sirvio asi y se ve bien :D