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 => {
...