JS购物车计算器怎么写

这篇博客介绍了两种使用JavaScript实现购物车计算的方法。第一种方法详细展示了如何动态创建DOM元素,并为加减按钮添加事件监听器以更新商品数量、小计和总计。第二种方法通过事件委托实现了点击加减按钮时的商品计算,同时包含了数据模型、视图渲染和事件绑定的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一种

HTML部分:

<body>

<div class="box"id="computedBox">

<div class="top">

<!-- <div class="hang">

<i class="minus"></i>

<span class="pronum">2</span>

<i class="add"></i>

<span class="info">

单价: 12.5元 &nbsp;&nbsp;

小计: <em>0</em>元

</span>

</div> -->

</div>

<div class="bottom">

商品合计:<span class="pronum">0</span>&nbsp; 件

<br>

共花费了:<span class="pronum">0</span>&nbsp; 元

<br>

最贵商品单价:<span class="pronum">0</span>&nbsp; 元

</div>

</div>

<!-- IMPORT JS -->

<script src="js/computed.js"></script>

<script src="js/解构赋值.js"></script>

</body>

</html>

JS部分

const data = [{

id:1,

count:2,

price:12.5

}, {

id:2,

count:0,

price:10.5

}, {

id:3,

count:3,

price:8.5

}, {

id:4,

count:0,

price:8

}, {

id:5,

count:0,

price:14.5

}];

(function () {

// 首先获取需要操作的元素[对于需要未来获取的,先声明变量赋值初始值]

const computedBox = document.querySelector('#computedBox'),// 获取computedBox元素

topBox = computedBox.querySelector('.top'),//获取top元素

// bottomBox = computedBox.querySelectorAll('.bottom>span') //获取所有span

[countsBox, pricesBox, maxBox] = Array.from(computedBox.querySelectorAll('.bottom>span'))

let minusBtn = [],

addBtn = [],

pronums = [],

ems = [];

// 其次根据Data动态创建所需的行

const render = function render() {

let str = ``

data.forEach((item, index) => {

let { count, price } = item;

str += `<div class="hang">

<i class="minus"></i>

<span class="pronum">${count}</span>

<i class="add"></i>

<span class="info">

单价:${price}元 &nbsp;&nbsp;

小计:<em>${(count * price).toFixed(2)}</em>元

</span>

</div>`

});

topBox.innerHTML = str;

// 获取后续需要操作的盒子

minusBtn = Array.from(topBox.querySelectorAll('.minus'));

addBtn = Array.from(topBox.querySelectorAll('.add'));

pronums = Array.from(topBox.querySelectorAll('.pronum'));

ems = Array.from(topBox.querySelectorAll('em'));

console.log(minusBtn, addBtn, pronums, ems);

};

// 循环做事件绑定[未来优化:事件委托]

const handler = function handler() {

// 循环五轮,产生五个闭包===>减号按钮

minusBtn.forEach((minus, index) => {

minus.onclick = function () {

// 根据点击按钮的'索引'获取同行中数量盒子,小计盒子,单价

let pronum = pronums[index],

em = ems[index],

price = data [index].price;

// 计算新的值

let n = +pronum.innerHTML,

m = 0;

n--;

if (n < 0) n = 0;

m = (n * price).toFixed(2);

pronum.innerHTML = n;

em.innerHTML = m;

// 计算总计

computed();

};

});

// 非闭包实现"加号按钮"的事件绑定

for (var i = 0; i < addBtn.length; i++) {

var item = addBtn[i]

item.index = i;

item.onclick = function () {

let pronum = pronums[this.index],

em = ems[this.index],

price = data[this.index].price;

// 计算新的值

let n = +pronum.innerHTML,

m = 0;

n++;

m = (n * price).toFixed(2);

pronum.innerHTML = n;

em.innerHTML = m;

// 计算总计

computed();

};

}

};

// 计算总计信息

const computed = function computed() {

let counts = 0,

prices = 0,

max = [0];

pronums.forEach((pronum, index) => {

let n = +pronum.innerHTML,

price=data[index].price

counts += n;

prices += n * price;

if(n>0) max.push(price);

});

countsBox.innerHTML=counts;

pricesBox.innerHTML=prices.toFixed(2);

maxBox.innerHTML=Math.max(...max);

};

render();

handler();

computed();

})();

第二种

JS部分

(function () {

// 数据模型

const data = [{

id:1,

count:2,

price:12.5

}, {

id:2,

count:0,

price:10.5

}, {

id:3,

count:3,

price:8.5

}, {

id:4,

count:0,

price:8

}, {

id:5,

count:0,

price:14.5

}];

const computedBox = document.querySelector('#computedBox');

// 基于数据动态渲染视图

const render = function render() {

let str = ``,

counts=0,

prices=0,

max=[0];

// 拼接多行产品

str += `<div class="top">`;

data.forEach((item, index) => {

let { count, price } = item;

counts+=count;// 大的数等于小的数相加

prices+=count*price;// 小计等于个数*单价

if(count>0) max.push(price);// 如果个数大于0,单价会进行最大值输出

str += `<div class="hang" index="${index}">

<i class="minus"></i>

<span class="pronum">${count}</span>

<i class="add"></i>

<span class="info">

单价:${price}元 &nbsp;&nbsp;

小计:<em>${(count * price).toFixed(2)}</em>元

</span>

</div>`

});

str += `</div>`;

// 拼接汇总信息

str += `<div class="bottom">

商品合计:<span class="pronum">${counts}</span> &nbsp; 件

<br>

共花费了:<span class="pronum">${prices}</span> &nbsp; 元

<br>

最贵商品单价:<span class="pronum">${Math.max(...max)}</span> &nbsp; 元

</div>`

computedBox.innerHTML = str;

};

// 事件绑定 [事件委托] 点击每个按钮,也会触发computedbox的点击事件

computedBox.onclick=function(ev){

// 获取点击的哪一个元素 (事件源)

let target = ev.target;

if (target.tagName==="I"){

// 点击事件源的标签名是I:说明点击的是加减按钮[获取他爹身上的索引,再去data中找到对应项]

let index=+target.parentNode.getAttribute('index'),

item=data[index];

// 根据加减修改对应的数量值

if(target.className==="minus"){

item.count--;

if(item.count<0) item.count=0;

}else{

item.count++;

}

// 重新渲染视图

render();

}

};

render();

})();

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值