HTML Academy
Special offer
Introduction to JavaScript in the browser21/23
Back to the list of tasks
  • 1. Script to start!
  • 2. Ready or not, here I come
  • 3. First class
  • 4. Find every single one
  • 5. Under cover
  • 6. Temporarily unavailable
  • 7. Special offer
  • 8. Summary of “JavaScript in the browser”. Part 1
  • 9. Twelfth program: “Ice cream test”
  • 10. Be careful, children!
  • 11. Creating a card
  • 12. Describe yourself
  • 13. Don’t repeat yourself
  • 14. Refactor and conquer
  • 15. Adding a picture
  • 16. One more function
  • 17. Check yourself
  • 18. Live data
  • 19. Got it in stock? What if I find one?
  • 20. Special offer
  • 21. Start the conveyor
  • 22. Summary of “JavaScript in the browser”. Part 2
  • 23. Thirteenth program: “Ice cream returns”
Summary of “JavaScript in the browser”. Part 2
  • Sign up
  • Log in

Loading…
Everything will be ready in few seconds

  • Theory
  • Theory
  • Comments

Start the conveyor

While we were writing the code, data was completely loaded from 1-Muffin. Data is stored in the cardsData object array.

Now there are a lot of products and we need to call createCard for each of them. It seems that it’s time to use the for loop.

Let’s write a loop that will go through the array of data. Within the loop, we will transfer the current element array[i] into the createCard function and insert the obtained result at the end of the product list. That way we will make the program universal for any number of cards.

The loop can look like this:

var item;

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

In this code, we first declare a variable, and then inside the loop, we override its value at each iteration. We use the variable only inside the loop. We don’t need it before and after the loop, and therefore it’s pointless to declare it outside the loop. Let’s take this into account and create a variable inside the loop at each iteration. Inside of it, we will record the result of calling createCard(array[i]), and then add the contents of this variable to the end of the product catalog. The loop will look like this:

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

Comments

  • index.html
  • style.css
  • script.js
HTML
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Catalog | 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: 500; font-size: 18px; line-height: 24px; } .product__price { max-width: 80px; margin: 0; text-align: right; font-weight: 300; font-size: 16px; 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: "Product of the day"; 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: "In stock"; } .product--unavailable { filter: grayscale(1) opacity(0.7); } .product--unavailable::after { content: "Out of stock"; } .product--special.product--available::after, .product--special.product--unavailable::after { left: 135px; }
JavaScript
var cardsData = [ { isAvailable: true, imgUrl: 'device/item-1.jpg', text: 'Selfie stick for beginners', price: 200, isSpecial: false }, { isAvailable: false, imgUrl: 'device/item-2.jpg', text: 'Professional selfie stick', price: 1500, isSpecial: false }, { isAvailable: true, imgUrl: 'device/item-3.jpg', text: 'Unsinkable selfie stick', price: 2500, isSpecial: false }, { isAvailable: true, imgUrl: 'device/item-4.jpg', text: 'Selfie stick “Follow me”', 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: 'Selfie stick for beginners', price: 200, isSpecial: true, specialPrice: 300 }; var cardItem = createCard(productInfo); cardList.appendChild(cardItem);

What didn’t you like in this task?

Thanks! We’ll fix everything at once!

Click inside the mini browser to put the focus in this window.

100%
Console
Goalscompleted
0
    1. Delete all the code below declaration of the cardList variable.
    2. At the end of the program, create a for loop, which iterates through the elements of the cardsData array, increasing the value of i from 0 to the length of the cardsData array.
    3. In the body of the loop, call the createCard function, transferring into it the current element of the cardsData array, and write the result of the call to the cardItem variable (declare this variable inside each iteration of the loop).
    4. Below, in the body of the loop, add cardItem to products list cardList.

    Cookies ∙ Privacy ∙ License Agreement ∙ About ∙ Contacts ∙ © HTML Academy OÜ, 2019−2025

    VISAMastercard

    Log in

    or

    Forgot your password?

    Sign up

    Sign up

    or
    Log in

    Restore access

    Have you forgotten your password or lost access to your profile? Enter your email connected to your profile and we will send you a link to restore access.

    Forgot to connect your email to the profile? Email us and we’ll help.