Saltar al contenido principal
Codigo Heroe
Tarea anterior
JavaScript en el navegador19/19
A la lista de tareas
  1. 1. Conectar un script a la página
  2. 2. El método querySelector: buscar un elemento
  3. 3. El método classList.add: agregar una clase
  4. 4. El método querySelectorAll: buscar varios elementos
  5. 5. Recorrer una colección de elementos
  6. 6. Comprobar la propiedad isAvailable
  7. 7. Comprobar la propiedad isSpecial
  8. 8. La propiedad children: elementos hijos
  9. 9. El método createElement: crear un elemento
  10. 10. La propiedad textContent: contenido de texto
  11. 11. Una función para crear elementos
  12. 12. Simplificar el código con makeElement
  13. 13. La propiedad src: la ruta de la imagen
  14. 14. Una función para crear una tarjeta de producto
  15. 15. Probar la función que crea tarjetas
  16. 16. Usar un objeto de datos
  17. 17. Comprobar la disponibilidad del producto
  18. 18. Mostrar una oferta especial
  19. 19. Usar un arreglo de objetos
Lista de tareas
  • Matriz de skills
  • Cursos
  • Registro
  • Iniciar sesión

Loading…
En unos segundos, estará listo.

  • Teoría
  • Teoría

Usar un arreglo de objetos

Mientras escribíamos el código, llegó la exportación completa de 1-Cupcake. Los datos están en el arreglo de objetos cardsData.

Ahora hay muchos productos y necesitamos llamar a createCard para cada uno. Parece que llegó la hora de usar un ciclo for.

Escribiremos un ciclo que recorra el arreglo de datos. Dentro pasaremos el elemento actual arreglo[i] a createCard e insertaremos el resultado al final de la lista de productos. Así el programa funcionará con cualquier cantidad de tarjetas.

El ciclo podría verse así:

var item;

for (var i = 0; i < array.length; i++) {
  item = createCard(array[i]);
  list.appendChild(item);
}

Primero declaramos la variable y después cambiamos su valor en cada iteración. Pero solo la usamos dentro del ciclo: no la necesitamos antes ni después. Por eso colocaremos su declaración dentro del ciclo y le asignaremos en cada iteración el resultado de createCard(arreglo[i]). Luego insertaremos ese elemento al final del catálogo. El ciclo quedará así:

for (var i = 0; i < array.length; i++) {
  var item = createCard(array[i]);
  list.appendChild(item);
}
  • index.html
  • style.css
  • script.js
HTML
<!DOCTYPE html> <html lang="es"> <head> <meta charset="utf-8"> <title>Catálogo | Device</title> <link rel="stylesheet" href="device/setting.css"> <link rel="stylesheet" href="style.css"> </head> <body> <ul class="products"> </ul> <script src="script.js"></script> </body> </html>
CSS
.products { display: flex; flex-wrap: wrap; justify-content: space-between; width: 570px; margin: 20px auto; padding: 0; list-style: none; } .product { position: relative; display: flex; flex-wrap: wrap; justify-content: space-between; width: 270px; margin-bottom: 30px; } .product__image { order: -1; width: 270px; height: 380px; margin-bottom: 15px; } .product__title { max-width: 180px; margin: 0; font-weight: 700; font-size: 18px; line-height: 24px; } .product__price { max-width: 80px; margin: 0; text-align: right; font-weight: 300; font-size: 16px; font-variant-numeric: lining-nums; line-height: 27px; } .product--special { order: -1; width: 100%; height: 380px; flex-direction: column; justify-content: flex-start; align-content: space-between; } .product--special .product__title { width: 270px; max-width: 100%; margin-bottom: 10px; font-size: 28px; line-height: 36px; } .product--special .product__price { width: 270px; max-width: 100%; text-align: left; text-decoration: line-through; color: #cccccc; } .product--special .product__special-price { margin: 0; } .product--special .product__image { outline: 3px solid #ffc600; } .product--special::before { content: "Producto del día"; position: absolute; top: 0; left: 0; display: flex; justify-content: center; align-items: center; padding: 5px 10px; font-weight: 500; color: #111111; text-transform: uppercase; background-color: #ffc600; } .product--available::after, .product--unavailable::after { position: absolute; top: 343px; left: 50%; padding: 10px 5px 2px 5px; border-bottom: 1px solid #57c74b; transform: translateX(-50%); } .product--available::after { content: "Disponible"; } .product--unavailable { filter: grayscale(1) opacity(0.7); } .product--unavailable::after { content: "Agotado"; } .product--special.product--available::after, .product--special.product--unavailable::after { left: 135px; }
JavaScript
var cardsData = [ { isAvailable: true, imgUrl: 'device/item-1.jpg', text: 'Palo para selfies para principiantes', price: 200, isSpecial: false }, { isAvailable: false, imgUrl: 'device/item-2.jpg', text: 'Palo para selfies profesional', price: 1500, isSpecial: false }, { isAvailable: true, imgUrl: 'device/item-3.jpg', text: 'Palo para selfies insumergible', price: 2500, isSpecial: false }, { isAvailable: true, imgUrl: 'device/item-4.jpg', text: 'Palo para selfies «Sígueme»', price: 4900, isSpecial: true, specialPrice: 100 } ]; var makeElement = function (tagName, className, text) { var element = document.createElement(tagName); element.classList.add(className); if (text) { element.textContent = text; } return element; }; var createCard = function (product) { var listItem = makeElement('li', 'product'); var title = makeElement('h2', 'product__title', product.text); listItem.appendChild(title); var picture = makeElement('img', 'product__image'); picture.src = product.imgUrl; picture.alt = product.text; listItem.appendChild(picture); var price = makeElement('p', 'product__price', product.price); listItem.appendChild(price); var availabilityClass = 'product--available'; if (!product.isAvailable) { availabilityClass = 'product--unavailable'; } listItem.classList.add(availabilityClass); if (product.isSpecial) { listItem.classList.add('product--special'); var specialPrice = makeElement('p', 'product__special-price', product.specialPrice); listItem.appendChild(specialPrice); } return listItem; }; var cardList = document.querySelector('.products'); var productInfo = { isAvailable: true, imgUrl: 'device/item-1.jpg', text: 'Palo para selfies para principiantes', price: 200, isSpecial: true, specialPrice: 300 }; var cardItem = createCard(productInfo); cardList.appendChild(cardItem);

El código ha cambiado, haz clic en "Actualizar" o activa la ejecución automática.

Ha ido a otra página

Haga clic dentro del mininavegador para poner el foco en esta ventana.

100%
Consola
ObjetivosRealizado
0
    1. Elimina todo el código que está debajo de la declaración de cardList.
    2. Al final del programa, crea un ciclo for que recorra cardsData. Aumenta i desde 0 mientras sea menor que la longitud del arreglo.
    3. Dentro del ciclo, llama a createCard con el elemento actual de cardsData y guarda el resultado en la variable cardItem. Declara esta variable dentro del ciclo, en cada iteración.
    4. Debajo, dentro del ciclo, agrega cardItem a la lista de productos cardList.
    Codigo Heroe

    © 2023-2026, codigoheroe.com