基于jquery库写出来的代码
欢迎指导
html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin:0;
padding:0;
}
body {
font-size:13px;
}
input {
vertical-align:middle;
}
a {
text-decoration:none;
color:#333333;
}
.fl {
float:left;
}
.fr {
float:right;
}
.pro-main {
width:1000px;
margin:100px auto;
}
.cart-info .all,.cart-info .pro-info,.cart-info .dj-price,.cart-info .num-pro,.cart-info .zj-price,.cart-info .cz {
float:left;
}
.cart-info {
height:40px;
line-height:40px;
background-color:#EFEFEF;
}
.cart-info .all {
width:80px;
padding:0px 15px;
}
.cart-info .all input {
margin-right:8px;
}
.cart-info .pro-info {
width:500px;
}
.cart-info .dj-price {
width:80px;
}
.cart-info .num-pro {
width:120px;
}
.cart-info .zj-price {
width:110px;
}
.cart-info .cz {
width:80px;
}
.cart-main {
margin-top:15px;
}
.cart-item {
border:1px solid #EFEFEF;
padding:15px;
overflow:hidden;
margin-bottom:15px;
}
.cart-j {
width:30px;
}
.pro-item {
width:560px;
}
.pro-item .pro-img {
width:80px;
height:80px;
}
.pro-item .pro-title {
width:225px;
line-height:1.8;
padding:0px 15px;
}
.pro-item .pro-gg {
width:185px;
padding:0px 15px;
font-size:10px;
color:#666;
}
.price-g {
width:80px;
color:black;
font-weight:bold;
}
.price-num {
width:95px;
margin-right:30px;
background-color:#EFEFEF;
/* border:1px solid #EFEFEF;
*/
}
.price-num .increment,.price-num .decrement {
width:20px;
float:left;
text-align:center;
}
.price-num .num {
float:left;
width:50px;
text-align:center;
}
.price-jiner {
width:110px;
color:red;
font-weight:bold;
}
.price-caozuo {
width:40px;
}
.priceAll {
margin:0px 20px;
}
.priceAll span {
padding:0px 8px;
color:#f22d00;
font-weight:bold;
font-size:15px;
}
.spnum em {
font-style:normal;
padding:0px 8px;
color:#f22d00;
font-weight:bold;
font-size:15px;
}
.js-btn {
display:block;
width:100px;
text-align:center;
background-color:#f22d00;
color:white;
}
.pro-item img {
width:80px;
}
</style>
<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
<script src="vue.js"></script>
</head>
<body>
<div class="pro-main">
<div class="cart-info">
<div class="all"><input type="checkbox" class="allCheck">全选</div>
<div class="pro-info">商品信息</div>
<div class="dj-price">单价</div>
<div class="num-pro">数量</div>
<div class="zj-price">金额</div>
<div class="cz">操作</div>
</div>
<div class="cart-main">
<div class="cart-item">
<div class="cart-j fl">
<input type="checkbox" class="j-check" >
</div>
<div class="pro-item fl">
<div class="pro-img fl"><img src="https://www.jq22.com/img/cs/500x500-1.png" alt=""></div>
<div class="pro-title fl">西部数据(WD)蓝盘 1TB1</div>
<div class="pro-gg fl">SATA6Gb/s 7200转64MB 台式机械硬盘(WD10EZEX)</div>
</div>
<div class="price-g fl">¥28.60</div>
<div class="price-num fl">
<a href="javascript:;" class="increment">+</a>
<input type="text" value="1" class="num">
<a href="javascript:;" class="decrement">-</a>
</div>
<div class="price-jiner fl">¥28.60</div>
<div class="price-caozuo fl"><a href="#" class="del-d">删除</a></div>
</div>
<div class="cart-item">
<div class="cart-j fl">
<input type="checkbox" class="j-check">
</div>
<div class="pro-item fl">
<div class="pro-img fl"><img src="https://www.jq22.com/img/cs/500x500-1.png" alt=""></div>
<div class="pro-title fl">西部数据(WD)蓝盘 1TB2</div>
<div class="pro-gg fl">SATA6Gb/s 7200转64MB 台式机械硬盘(WD10EZEX)</div>
</div>
<div class="price-g fl">¥28.60</div>
<div class="price-num fl">
<a href="javascript:;" class="increment">+</a>
<input type="text" value="1" class="num">
<a href="javascript:;" class="decrement">-</a>
</div>
<div class="price-jiner fl">¥28.60</div>
<div class="price-caozuo fl"><a href="javascript:;" class="del-d">删除</a></div>
</div>
<div class="cart-item">
<div class="cart-j fl">
<input type="checkbox" class="j-check">
</div>
<div class="pro-item fl">
<div class="pro-img fl"><img src="https://www.jq22.com/img/cs/500x500-1.png" alt=""></div>
<div class="pro-title fl">西部数据(WD)蓝盘 1TB3</div>
<div class="pro-gg fl">SATA6Gb/s 7200转64MB 台式机械硬盘(WD10EZEX)</div>
</div>
<div class="price-g fl">¥28.60</div>
<div class="price-num fl">
<a href="javascript:;" class="increment">+</a>
<input type="text" value="1" class="num">
<a href="javascript:;" class="decrement">-</a>
</div>
<div class="price-jiner fl">¥28.60</div>
<div class="price-caozuo fl"><a href="javascript:;" class="del-d">删除</a></div>
</div>
</div>
<div class="cart-info">
<div class="all fl"><input type="checkbox" class="allCheck">全选</div>
<div class="fl">
<a href="#" class="clearAll">删除</a>
<a href="javascirpt:;" class="All-a">清除购物车的宝贝</a>
</div>
<div class="fr" style="width: 500px;">
<div class="spnum fl">
已选商品<em>0</em>件
</div>
<div class="priceAll fl">合计(不含运费): <span>0.00</span></div>
<div class="jiesuan fr"><a href="#" class="js-btn">结算</a></div>
</div>
</div>
</div>
</body>
</html>
$(function(){
/*
1、全选
·单选当点击一行时状态变为选择状态
·当全选时所有行状态变为选择状态
·当取消全选时选择的行取消选择状态
2、增加数量
·当点击加号时input加一
3、减少数量
·当点击减号是input减一
·注意!变为0时则删除此行
4、删除目标信息
1、点击删除进行删除
2、根据radio状态删除
3、点击之后直接全部删除购物车的宝贝
5、结算
根据radio状态来结算
·商品有多少件
shopping_index
·合计的金额
result_money
*/
//购物车清空的话则为true
var delete_state = false;
function format(){
$('.spnum em').text(0);
$('.priceAll span').text(0.00.toFixed(2));
}
//当该元素发生改变则调用次函数
$(".allCheck").change(function(){
//如果当前元素的checked为true
if($(this).prop("checked")){
//将子radio的状态改变成true
$(".j-check").prop("checked",true)
//因为有两个全选则需要把另外一个状态改掉
$(".allCheck").prop("checked",true)
getSum()
}else{
//否则将状态改为false
$(".j-check").prop("checked",false)
$(".allCheck").prop("checked",false)
//直接重置
format()
}
})
//遍历.j-check里所有的元素
function delete_item(){
$(".j-check").map(function(index,value){
//找到cecked为true的元素
if($(value).prop("checked")){
//寻找到父级为.cart-item的元素并删除
$(value).parents(".cart-item").remove()
format()
getSum()
}
})
if($(".j-check").length==0){
if(delete_state){
alert("别再点啦 已经清除完啦")
throw new Error("已删除完毕")
}
delete_state=true
}
}
$(".clearAll").click(function(event){
//阻止页面刷新
event.preventDefault();
delete_item()
})
//清空宝贝
$(".All-a").click(function(){
if(!delete_state){
format();
$(".cart-main").children().remove();
delete_state = true;
//遍历.j-check里所有的元素
}else{
alert("别再点啦 已经清除完啦")
throw new Error("已删除完毕")
}
})
//单个删除
$(".price-caozuo").click(function(){
//更新数据在调用getsum
$(this).siblings(".price-num").children(".num").val(0)
$(this).siblings(".price-jiner").text("¥" + 0.00.toFixed(2))
//遍历.j-check里所有的元素
if($(".cart-item").length==0){
delete_state=true
}
getSum();
//查找该元素父级为.cart-item的元素删除
$(this).parents(".cart-item").remove()
})
function increment(index,value){
const num = $($(".num")[index]);//获取num[index]元素
let num_number = 1;//数量
let price_un = $($(".price-g")[index]).text().replace("¥","")//商品单价
let price_jiner = $($(".price-jiner")[index])//行金额
var price_row;//暂时存放的行金额
//判断 class等于decrement的则进入
if(value.prop("class")=="decrement"){
//给穿过来的元素绑定点击事件
value.click(function(){
//这个一定得加
//重新获取数量赋值给num_number
num_number = Number(num.val())
//减一
num_number -= 1;
//一定要注意顺序减了之后再判断
//重新设置金额 金额等于数量乘以单价
price_row = Number(price_un) * Number(num_number)
if(num_number<1){
//小于1则删除
console.log($(value))
//也是其中的一个bug
//选择行删除之后金额与件数都不会删减
//原因是没有取消radio选中
//注意顺序!!
//将金额,单价变为0
//在调用getsum
price_jiner.text("¥" + 0.00.toFixed(2))
num.prop("value",0);
getSum()
//这里出现这个bug的原因是删除了这行,你就不能对元素进行更新了,
//解决方案将判断放到更新完之后去
$(value).parents(".cart-item").remove()
}
//重新设置num的value值
num.prop("value",num_number);
//调用text函数重新赋值金额
price_jiner.text("¥" + Math.round(price_row))
getSum()
})
//这里以防万一也是要判断的value.prop("class")=="increment"
//懒的写了
}else{
value.click(function(){
//道理同上
num_number = Number(num.val())
num_number += 1;
price_row = Number(price_un) * Number(num_number)
num.prop("value",num_number);
price_jiner.text("¥" + Math.round(price_row))
getSum()
})
}
}
//数量加一
//调用函数
$(".increment").map(function(index,value){
increment(index,$(this))
})
//数量减一
//调用函数
$(".decrement").map(function(index,value){
increment(index,$(this));
})
// function result_shopping(value){
// $(value).click(function(){
// let result_m =$(this).parents(".cart-item").children(".price-jiner")
// var result_mo = Number($(result_m).text().replace("¥",""))
// if($(value).prop("checked")){
// shopping_index++
// result_money+=result_mo
// }else{
// shopping_index--
// if(shopping_index<0){
// shopping_index=0;
// return -1;
// }
// result_money-=result_mo
// }
// $(".priceAll span").text("¥"+result_money.toFixed(2))
// $(".spnum em").text(shopping_index)
// })
// }
// $(".j-check").map(function(index,value){
// result_shopping(value)
// })
function getSum() {
// 总数量
var num = 0;
// 总价
var money = 0;
// 遍历数量
$('.num').each(function(i, ele) {
//i:当前元素下标
//ele:当前元素
//判断当前元素的父级(.price-num)除自己以外中的元素(.cart-j)下级中的(.j-check)的元素(checked)是否为true
if ($(this).parent('.price-num').siblings('.cart-j').find('.j-check').prop('checked')) {
//num=num+ele的value值
num += parseInt($(ele).val());
//如果num大于他的长度则吧他的长度返还给num
if(num >= $(".num").length){
num =$(".num").length
}
$('.spnum em').text(num);
}
});
//遍历金额
$('.price-jiner').each(function(i, ele) {
//如果当前元素除自己以外(.cart-j)下的(.j-check)的元素('checked')为true
if ($(this).siblings('.cart-j').find('.j-check').prop('checked')) {
//money = money+解析小数(ele的text值(小数点后面一位))
money += parseFloat($(ele).text().substr(1));
$('.priceAll span').text(money.toFixed(2));
}
})
}
$(".j-check").click(function(){
if($(this).prop("checked")){
getSum()
}else{
getSum()
//解决getsum的缺陷
//问题:当单击radio时出现金额与数量当取消时则不会调用getsum函数
//为chencked的元素长度等于0的话则表明当前没有为chenched的值了
if($(".j-check:checked").length == 0){
//格式化
format()
}
}
})
})