javascript_series5_ajax_data_attribute

by aelgy369

HTML

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Ajax practice</title>
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
</head>

<body>
  <div id="id"></div>
  <div class="container d-flex justify-content-center mt-5">
    <div class="card w-100">
      <div>
        <button id='btn' class="btn btn-primary mt-2 ms-2">Load Products</button>
      </div>
      <hr>
      <div class="card-body">
        <ul id="list" class="row list-unstyled">
        </ul>
      </div>
    </div>
  </div>

  <div id="detailBtn" class="modal fade" tabindex="-1" aria-hidden="true">
    <div class="modal-dialog">
      <div class="modal-content">
        <div class="modal-header">
          <h1 class="modal-title fs-5" id="itemTitle"></h1>
        </div>
        <div class="modal-body">
          <div id="card" class="card" style="width: 24rem;">
            <img id="itemImage" class="card-img-top" alt="...">
            <div class="card-body">
              <h5 id="item-price" class="text-danger fw-bold"></h5>
              <h6 id="item-category" class="mb-2 text-body-secondary"></h6>
              <p id="item-description" class="card-text">
              </p>
            </div>
          </div>
        </div>
        <div class="modal-footer">
          <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
        </div>
      </div>
    </div>
  </div>

  <script src="main.js" defer></script>
  <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"
    integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz"
    crossorigin="anonymous"></script>
</body>

CSS

#itemImage {
  aspect-ratio: 1 / 1;
  width: 300px;
  object-fit: contain;
  object-position: center;
}

JavaScript

const list = document.querySelector('#list')
const url = 'https://fakestoreapi.com/products'
let a = [];

function loadProduct() {
  fetch(url)
    .then(res => {
      return res.json()
    })
    .then(json => {
      a = json;
      if (list.firstElementChild) {
        list.innerHTML = '';
      } else {
        render();
      }
    })
    .catch(error => {
      const itemId = document.querySelector('#id');
      const errorMessage = document.createElement('div')
      errorMessage.innerHTML = [
        `<div class="alert alert-danger alert-dismissible" role="alert">`,
        `   <div>抱歉,請稍後重新嘗試。</div>`,
        '   <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>',
        '</div>'
      ].join('')

      itemId.append(errorMessage)
    })
}

function render() {
  let str = "";
  a.forEach((item) => {
    str += `
        <li class="col-md-4 col-lg-3 mb-3">
          <div class="card text-bg-light h-100">
            <img class="object-fit-contain h-50" src="${item.image}">
            <div class="card-body d-flex flex-column">
              <h5 class="card-title flex-grow-1 mt-5">${item.title}</h5>
              <div class="container">
                <div class="row">
                  <button id="detail" class="btn btn-primary col-5" data-id="${item.id}" data-title="${item.title}" data-category="${item.category}" data-description="${item.description}" data-img="${item.image}" data-price="${item.price}" data-bs-toggle="modal" data-bs-target="#detailBtn">Details</button>
                  <div class="col"></div>
                  <button id="delete" class="btn btn-danger col-5" data-id="${item.id}">Delete</button>
                </div>
              </div>
            </div>
          </div>
        </li>
    `;
  })
  list.innerHTML = str;
}


const btn = document.querySelector('#btn');
btn.onclick = loadProduct;

// show Alert function
function showModal(id) {
  fetch(url + "/" + id)
    .then(res => {
     ...