
批改狀態(tài):合格
老師批語:jq中不要套原生,這樣不好,要分開寫
- 使用jQuery完成購物車全選/全不選操作;
- 這現(xiàn)勾選/不勾選商品時購物車也能自動完成計算
head
中引入購物車樣式和jQuery庫
<!-- 購物車css樣式 -->
<link rel="stylesheet" href="style.css" />
<!-- 引入 jQuery 庫 -->
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
table {
border-collapse: collapse;
width: 90%;
text-align: center;
margin: auto;
}
table caption {
margin-bottom: 15px;
font-size: 1.5rem;
}
table th,
table td {
border-bottom: 1px solid #ccc;
padding: 5px;
font-weight: normal;
}
table thead tr:first-of-type {
background-color: #e6e6e6;
height: 3em;
}
table input[type="checkbox"] {
width: 1.5em;
height: 1.5em;
}
table tbody tr {
border-bottom: 1px solid #ccc;
}
table tbody tr:hover {
background-color: #f6f6f6;
cursor: pointer;
}
tbody img {
width: 3em;
}
tbody input[type="number"] {
width: 3em;
}
button {
width: 150px;
height: 30px;
outline: none;
border: none;
background-color: teal;
color: white;
letter-spacing: 5px;
}
button:hover {
opacity: 0.7;
cursor: pointer;
}
body
中添加購物車html是默認(rèn)的
<table>
<caption>
購物車
</caption>
<thead>
<tr>
<!-- 全選復(fù)選框 -->
<th><input type="checkbox" name="checkAll" id="check-all" checked /><label for="check-all">全選</label>
</th>
<th>圖片</th>
<th>品名</th>
<th>單位</th>
<th>單價/元</th>
<th>數(shù)量</th>
<th>金額/元</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<input type="checkbox" name="item" value="SN-1020" checked />
</td>
<td>
<a href=""><img src="images/p1.jpg" alt="" /></a>
</td>
<td>iPhone 11</td>
<td>臺</td>
<td class="price">4799</td>
<td><input type="number" min="1" value="1" /></td>
<td class="amount">xxxx</td>
</tr>
<tr>
<td>
<input type="checkbox" name="item" value="SN-1020" checked />
</td>
<td>
<a href=""><img src="images/p2.jpg" alt="" /></a>
</td>
<td>小米pro 11</td>
<td>部</td>
<td class="price">3999</td>
<td><input type="number" min="1" value="2" /></td>
<td class="amount">xxxx</td>
</tr>
<tr>
<td>
<input type="checkbox" name="item" value="SN-1030" checked />
</td>
<td>
<a href=""><img src="images/p3.jpg" alt="" /></a>
</td>
<td>MacBook Pro</td>
<td>臺</td>
<td class="price">18999</td>
<td><input type="number" min="1" value="1" /></td>
<td class="amount">xxxx</td>
</tr>
<tr>
<td>
<input type="checkbox" name="item" value="SN-1040" checked />
</td>
<td>
<a href=""><img src="images/p4.jpg" alt="" /></a>
</td>
<td>小米75電視</td>
<td>臺</td>
<td class="price">5999</td>
<td><input type="number" min="1" value="2" /></td>
<td class="amount">xxxx</td>
</tr>
<tr>
<td>
<input type="checkbox" name="item" value="SN-1050" checked />
</td>
<td>
<a href=""><img src="images/p5.jpg" alt="" /></a>
</td>
<td>Canon 90D單反</td>
<td>臺</td>
<td class="price">9699</td>
<td><input type="number" min="1" value="1" /></td>
<td class="amount">xxxx</td>
</tr>
</tbody>
<tfoot>
<tr style="font-weight: bolder; font-size: 1.2em">
<td colspan="5">總計:</td>
<td id="sum">xxxx</td>
<td id="total-amount">xxxx</td>
</tr>
</tfoot>
</table>
<div style="width: 90%; margin: 10px auto">
<button style="float: right; width: 100px">結(jié)算</button>
</div>
body
中 script
標(biāo)簽中添加js
// 使用jQuery完成購物車全選/全不選操作
// 全選復(fù)選框
const checkAll = $("#check-all");
// 獨(dú)立復(fù)選框
const checkItems = $("input[name=\"item\"]");
// 改變?nèi)x,獨(dú)立復(fù)選框也改變
checkAll.change(ev => checkItems.each(function () {
$(this).prop('checked', $(ev.target).is(':checked'));
}));
// 改變獨(dú)立復(fù)選框,改變?nèi)x
checkItems.change(() => checkAll.prop('checked', [...checkItems].every(item => item.checked)));
// 購物車,數(shù)據(jù)填充
function cart() {
// 獨(dú)立單價組
let pricesObj = $('.price').map((i, ele) => $(ele).text() * 1);
// 獨(dú)立數(shù)量組
let numbersObj = $('input[type="number"]').map((i, ele) => $(ele).val() * 1);
// 獨(dú)立金額組
let amountsObj = [pricesObj, numbersObj].reduce((total, curr) => total.map((i, item) => item * curr[i]));
// 獨(dú)立金額數(shù)據(jù)填充,由單品數(shù)量改變觸發(fā),與獨(dú)立復(fù)選框狀態(tài)無關(guān)
$('.amount').each((i, ele) => ($(ele).text(amountsObj[i])));
// 總數(shù)量,總金額的計算由獨(dú)立復(fù)選框選中狀態(tài)確定
// 獲取所有獨(dú)立復(fù)選框元素
let items = $("input[name=\"item\"]");
// 過濾出所有獨(dú)立復(fù)選框選中狀態(tài)的組
numbersObj = numbersObj.filter((i, ele) => $(items[i]).is(':checked'));
// 過濾出所有獨(dú)立復(fù)選框選中狀態(tài)的金額組
amountsObj = amountsObj.filter((i, ele) => $(items[i]).is(':checked'));
// 計算總數(shù)量和總金額
let sum = [...numbersObj].reduce((p, n) => p + n, 0);
let total = [...amountsObj].reduce((p, n) => p + n, 0);
// 填充總數(shù)量和總金額到頁面中
$('#sum').text(sum);
$('#total-amount').text(total);
}
// 改變單品數(shù)量時觸發(fā)
$('input[type="number"]').each((i, ele) => $(ele).change(function(){
cart();
}));
// 改變獨(dú)立復(fù)選框狀態(tài)時觸發(fā)
$("input[name=\"item\"]").each((i, item) => $(item).change(function(){
cart();
}));
// 全選狀態(tài)改變時觸發(fā)
$('#check-all').change(function(){
cart();
});
// 頁面載入完成后觸發(fā)
$(function(){
cart();
});
// 原生js購物車全選/全不選操作
// 全選復(fù)選框
const checkAll = document.getElementById('check-all');
// 獨(dú)立復(fù)選框
const checkItems = document.getElementsByName('item');
// 改變?nèi)x,獨(dú)立復(fù)選框也改變
checkAll.onchange = ev => checkItems.forEach(item => item.checked = ev.target.checked);
// 改變獨(dú)立復(fù)選框,改變?nèi)x
checkItems.forEach(item => item.onchange = () => checkAll.checked = [...checkItems].every(ele => ele.checked));
// 購物車,數(shù)據(jù)填充
function cart() {
// 獨(dú)立單價數(shù)組
let pricesArr = [...document.getElementsByClassName('price')].map(p => p.textContent * 1);
// 獨(dú)立數(shù)量數(shù)組
let numbersArr = [...document.querySelectorAll('input[type="number"]')].map(n => n.value * 1);
// 獨(dú)立金額數(shù)組
let amountsArr = [pricesArr, numbersArr].reduce((total, curr) => total.map((item, i) => item * curr[i]));
// 獨(dú)立金額數(shù)據(jù)填充,由單品數(shù)量改變觸發(fā),與獨(dú)立復(fù)選框狀態(tài)無關(guān)
document.querySelectorAll('.amount').forEach((ele, i) => (ele.textContent = amountsArr[i]));
// 總數(shù)量,總金額的計算由獨(dú)立復(fù)選框選中狀態(tài)確定
// 獲取所有獨(dú)立復(fù)選框元素
let items = document.getElementsByName('item');
// 過濾出所有獨(dú)立復(fù)選框選中狀態(tài)的數(shù)量數(shù)組
numbersArr = numbersArr.filter((ele, i) => [...items][i].checked);
// 過濾出所有獨(dú)立復(fù)選框選中狀態(tài)的金額數(shù)組
amountsArr = amountsArr.filter((ele, i) => [...items][i].checked);
// 計算總數(shù)量和總金額
let sum = numbersArr.reduce((p, n) => p + n, 0);
let total = amountsArr.reduce((p, n) => p + n, 0);
// 填充總數(shù)量和總金額到頁面中
document.getElementById('sum').textContent = sum;
document.getElementById('total-amount').textContent = total;
}
// 改變單品數(shù)量時觸發(fā)
document.querySelectorAll('input[type="number"]').forEach(ele => ele.onchange = cart);
// 改變獨(dú)立復(fù)選框狀態(tài)時觸發(fā)
document.getElementsByName('item').forEach(item => item.onchange = cart);
// 全選狀態(tài)改變時觸發(fā)
// 由于前面 check-all 已添加 onchange 事件,這里使用事件監(jiān)聽
document.getElementById('check-all').addEventListener('change', cart);
// 頁面載入完成后觸發(fā)
window.onload = cart;
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號