
批改狀態(tài):合格
老師批語:有沒有想到, 換種思路來實現(xiàn)同樣的功能呢, 是不是脫離了教學代碼就寫不出來呢, 多看看其它的源碼是有好處的
change-bg.js
var bg_item = document.querySelectorAll(".bg-items>.item");
bg_item.forEach(function (item) {
item.addEventListener("click", change_bg, false);
});
function change_bg(e) {
url = e.target.src;
document.body.style.cssText ="background: url(" + url + ") no-repeat center top;";
}
select-all.js
/** @format */
var selectAllBtn = document.querySelector("#check-all");
//獲取每個選項的復選框
var itemBtns = document.querySelectorAll("input[name=itemId]");
//獲取所有單價
prices = document.querySelectorAll("table>tbody>tr>td:nth-of-type(5)");
//獲取所有商品的數(shù)量
numbers = document.querySelectorAll("table>tbody>tr>td>input[type=number]");
// 獲取商品單價數(shù)組
var unitprice_array = getArrar(prices, "innerText");
// 獲取商品數(shù)量數(shù)組
var counts = getArrar(numbers, "value");
//初始化 默認為全選狀態(tài)
init();
function init() {
selectAllBtn.checked = true;
checkAll();
}
//監(jiān)聽全選按鈕狀態(tài)
selectAllBtn.addEventListener("change", checkAll, false);
//添加狀態(tài)刷新,當全選按鈕狀態(tài)改變時重新渲染頁面
selectAllBtn.addEventListener("change", refresh, false);
function refresh() {
autoCalculate();
}
//設置復選框的取消和選中狀態(tài)并添加默認值
function checkAll() {
itemBtns.forEach(function (btn) {
btn.checked = selectAllBtn.checked;
if (!selectAllBtn.checked) {
btn.parentNode.parentNode.children[5].children.counter.value = 0;
} else {
btn.parentNode.parentNode.children[5].children.counter.value = 1;
}
});
}
itemBtns.forEach(function (btn) {
btn.addEventListener("change", checkAllStatus, false);
});
function checkAllStatus() {
//獲取兄弟節(jié)點value值,實現(xiàn)取消選中自動重新計算
item_num = this.parentNode.parentNode.querySelector("td>input[type=number]").value;
if (this.checked == false && item_num > 0) {
this.parentNode.parentNode.querySelector("td>input[type=number]").value = 0;
} else {
this.parentNode.parentNode.querySelector("td>input[type=number]").value = 1;
}
changeStatus();
autoCalculate();
}
//設置復選框狀態(tài)
function changeStatus() {
var num = 0;
itemBtns.forEach(function (btn) {
if (btn.checked == true) {
num++;
}
});
// console.log(num);
selectAllBtn.checked = itemBtns.length == num;
}
//將傳入偽數(shù)組轉換為新的數(shù)組
function getArrar(array, attr_name) {
return Array.from(array).map((item) => parseInt(item[attr_name]));
}
//每個項目的金額
var amounts = getAmounts(unitprice_array, counts);
//將每個項目的金額渲染到表格中
let subtotal = document.querySelectorAll("tbody>tr>td:last-of-type");
//forEach的第二個參數(shù)為當前item的索引
subtotal.forEach((item, index) => (item.innerText = amounts[index]));
//計算每個項目的金額,返回一個新的數(shù)組
function getAmounts(unitprice_array, counts) {
let res = [];
for (var i = 0; i < counts.length; i++) {
let amount = unitprice_array[i] * counts[i];
res.push(amount);
}
return res;
}
//計算總金額并渲染到頁面
var totalNum = (document.querySelector("#total-num").innerText = getSum(counts));
var totalAmount = (document.querySelector("#total-amount").innerText = getSum(amounts));
//使用reduce方法計算數(shù)組每項的和
function getSum(array) {
return array.reduce((total, num) => total + num, 0);
}
//為數(shù)量控件添加change事件
numbers.forEach((item) => item.addEventListener("input", autoCalculate));
numbers.forEach((item) => item.addEventListener("input", autoSelect));
//當input[type=number]值改變時設置復選框選中,重新計算金額
function autoSelect() {
this.parentNode.parentNode.querySelector(
"td>input[name=itemId]"
).checked = true;
// 重新計算所有被選中復選框的數(shù)量
changeStatus();
}
//自動計算函數(shù)
function autoCalculate() {
counts = getArrar(numbers, "value");
amounts = getAmounts(unitprice_array, counts);
subtotal.forEach((item, index) => (item.innerText = amounts[index]));
totalNum = document.querySelector("#total-num").innerText = getSum(counts);
totalAmount = document.querySelector("#total-amount").innerText = getSum(amounts);
}
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>購物車全選</title>
<link rel="stylesheet" href="css/check-all.css" />
</head>
<body>
<div class="bg-items">
<div class='item'> <img src="img/1.jpg" alt=""></div>
<div class='item'><img src="img/2.jpg" alt=""></div>
<div class='item'> <img src="img/3.jpg" alt=""></div>
</div>
<table>
<caption>
購物車
</caption>
<thead>
<tr>
<th>
<input type="checkbox" name="checkAll" id="check-all" /><label
for="check-all">全選</label>
</th>
<th>ID</th>
<th>品名</th>
<th>單位</th>
<th>單價/元</th>
<th>數(shù)量</th>
<th>金額/元</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<input type="checkbox" name="itemId" value="SN-1010" />
</td>
<td>SN-1010</td>
<td>MacBook Pro電腦</td>
<td>臺</td>
<td>18999</td>
<td>
<input type="number" name="counter" value="1" min="1" step="1" />
</td>
<td></td>
</tr>
<tr>
<td>
<input type="checkbox" name="itemId" value="SN-1020" />
</td>
<td>SN-1020</td>
<td>iPhone手機</td>
<td>部</td>
<td>4999</td>
<td>
<input type="number" name="counter" value="2" min="1" step="1" />
</td>
<td></td>
</tr>
<tr>
<td>
<input type="checkbox" name="itemId" value="SN-1030" />
</td>
<td>SN-1030</td>
<td>智能AI音箱</td>
<td>只</td>
<td>399</td>
<td>
<input type="number" name="counter" value="3" min="1" step="1" />
</td>
<td></td>
</tr>
<tr>
<td>
<input type="checkbox" name="itemId" value="SN-1040" />
</td>
<td>SN-1040</td>
<td>SSD移動硬盤</td>
<td>個</td>
<td>888</td>
<td>
<input type="number" name="counter" value="4" min="1" step="1" />
</td>
<td></td>
</tr>
<tr>
<td>
<input type="checkbox" name="itemId" value="SN-1050" />
</td>
<td>SN-1050</td>
<td>黃山毛峰</td>
<td>斤</td>
<td>999</td>
<td>
<input type="number" name="counter" value="5" min="1" step="1" />
</td>
<td></td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan="5">總計:</td>
<td id="total-num"></td>
<td id="total-amount"></td>
</tr>
<tr>
<td colspan="7" style="border:none;">
<div style=" margin: 10px auto;">
<button style="float: right; width: 100px;">結算</button>
</div>
</td>
</tr>
</tfoot>
</table>
<script src="js/change-bg.js"></script>
<script src="js/select-all.js"></script>
</body>
</html>
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號