计算商品总价的java_数组

实现思路

一、搭建html结构,凡是需要操作数值的地方都用一个小盒子划分开(商品选中数量、单价、小计(已选同类商品价值总和)、商品总数、已选商品价值总和、选中商品中最高单价)

二、给每一个加/减操作button绑定一个onclick事件

1、获取当前button的父节点,用于快速找到其他需要操作的节点

2、点击button同类商品选中数量的加/减操作:
1)获取到存放商品数量的元素
2)获取到button属性flag,根据flag属性值判断进行何种运算
3)运算前保存元素中已有值oldNum,并创建变量存放计算所得新值nowNum
4)为避免出现负值,减法操作前首先判断oldNum数值是否大于0,大于0时才进行减法运算
5)将newNum写入元素

3、同类商品价值小计
1)获取存放小计数值的元素
2)获取存放单价的元素中的值(innerText)
3)将计算出的同类商品数量newNum与单价的乘积写入存放小计的元素

4、商品总件数
1)获取存放商品总件数的元素
2)获取到所有存放同类商品数量的元素
3)创建新变量存储商品总数量totalNum
4)for循环求和
5)将totalNum写入存放商品总件数的元素

5、商品总价值(同商品总件数)

6、已选商品中最贵单价
1)获取存放最贵单价的元素
2)获取所有li元素
3)将所有已选类型商品的单价存储入数组:判断这类商品的数量(通过其父元素li获取)是否大于0,只要大于0即将其单价(通过其父元素li获取)push入数组
4)创建新变量存储最贵单价maxMoney
5)如果单价数组中有值,就将数组升序排列并获取其中最大值:判断数组长度是否大于0,大于0将其最大值赋值给maxMoney
6)将maxMoney写入存放最贵单价的元素

具体实现

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        ul,
        ol {
            list-style: none;
        }

        #main {
            width: 479px;
            height: 591px;
            background: url("images/bg1.png");
            margin: 0 auto;
            color: #fff;
            padding: 30px;
            box-sizing: border-box;
            position: relative;
        }

        .shopContent li {
            display: flex;
            justify-content: space-evenly;
            align-items: center;
        }

        .shopContent button {
            width: 52px;
            height: 44px;
            border: none;
        }

        .add {
            background: url("images/add.png");
        }

        .sub {
            background: url("images/sub.png");
        }

        .num {
            width: 44px;
            height: 36px;
            line-height: 36px;
            text-align: center;
            border-radius: 5px;
            background: #fff;
            color: #333;
        }

        .shopInfo {
            position: absolute;
            bottom: 20px;
            left: 30px;
        }

        .shopInfo p {
            line-height: 40px;
        }
    </style>
</head>

<body>
    <div id="main">
        <ul class="shopContent">
            <li>
                <button class="add" flag="1"></button>
                <b class="num">0</b>
                <button class="sub" flag="0"></button>
                <span class="info">
                    单价:<b class="itemPrice">1</b>元 小计:<span class="xjMoney">0</span>元
                </span>
            </li>
            <li>
                <button class="add" flag="1"></button>
                <b class="num">0</b>
                <button class="sub" flag="0"></button>
                <span class="info">
                    单价:<b class="itemPrice">2</b>元 小计:<span class="xjMoney">0</span>元
                </span>
            </li>
            <li>
                <button class="add" flag="1"></button>
                <b class="num">0</b>
                <button class="sub" flag="0"></button>
                <span class="info">
                    单价:<b class="itemPrice">3</b>元 小计:<span class="xjMoney">0</span>元
                </span>
            </li>
        </ul>
        <div class="shopInfo">
            <p>
                商品共<span class="totalNum">0</span>件
            </p>
            <p>
                共花了<span class="totalMoney">0</span>元
            </p>
            <p>
                选中的商品中最贵的单价是<span class="specialItemPrice">0</span>元
            </p>
        </div>
    </div>
</body>
</html>
<script>
    /* 
    点击按钮的时候:让数量相应的增减

    怎么知道是加法按钮还是减法按钮?
    1.在结构中增加一个自定义属性flag,值1为加法,值0为减法
    2.用dom方法获取所有的加法、减法按钮
    3.根据li下面的第几个孩子button判断加减法按钮
    ...
    */
    //所有按钮(加、减)
    var btns = document.querySelectorAll(".shopContent button");
    //所有“件数”盒子
    var numArrayEle = document.querySelectorAll(".shopContent .num");
    //“总件数”盒子
    var totalNumEle = document.querySelector(".shopInfo .totalNum");
    //所有“小计”盒子
    var xjMoneyArrayEle = document.querySelectorAll(".shopContent .xjMoney");
    //“总钱数”盒子
    var totalMoneyEle = document.querySelector(".shopInfo .totalMoney");
    //li列表
    var lis=document.querySelectorAll(".shopContent li");
    //“选中商品最贵单价”盒子
    var specialItemPriceEle=document.querySelector(".shopInfo .specialItemPrice");

    for (var i = 0; i < btns.length; i++) {
        //给按钮绑定点击事件
        btns[i].onclick = function () {
            //获取当前button的flag属性,用于判断是加法还是减法按钮
            var flag = this.getAttribute("flag");
            //console.log(flag);
            //当前button的父节点,通过父节点可以获取需要操作的子盒子
            var parentEle = this.parentNode;
            //console.log(parentEle);
            //单价
            var itemPrice = Number(parentEle.querySelector(".itemPrice").innerText);
            //console.log(itemPrice);
            //“小计”盒子
            var xjMoneyEle = parentEle.querySelector(".xjMoney");
            //console.log(xjMoneyEle);
            //“件数”盒子,点击加/减法按钮影响里面的件数,每次变动 1
            var numEle = parentEle.querySelector(".num");
            //console.log(numEle);
            //记录“件数”盒子中原始数值,用于计算
            var oldNum = Number(numEle.innerText);
            //console.log(oldNum);
            //存放加/减运算后的“新件数”
            var nowNum = 0;
            //总件数
            var totalNum = 0
            //总钱数
            var totalMoney = 0;
            //件数大于0的商品单价数组
            var numAry=[];
            //选中商品中最贵的单价
            //var maxMoney=null;
            var maxMoney=0;
            //加法按钮
            if (flag == 1) {
                nowNum = oldNum + 1;
            } else {
                //减法按钮
                /* if (oldNum - 1 < 0) {
                    nowNum = 0;
                    return;
                }
                nowNum = oldNum - 1; */
                if(oldNum>0){
                    nowNum=oldNum-1;
                }
            }
            //修改“件数”盒子中的值为 新件数
            numEle.innerText = nowNum;
            //修改“小计”盒子中的值为 新件数*单价
            xjMoneyEle.innerText = nowNum * itemPrice;
            //通过for循环计算总数(拿到每一个件数小盒子中的值进行求和)
            for (var i = 0; i < numArrayEle.length; i++) {
                //总件数
                totalNum += Number(numArrayEle[i].innerText);

                //总钱数
                totalMoney += Number(xjMoneyArrayEle[i].innerText);
            }
            //console.log(totalNum);
            //修改“总件数”盒子中的数值
            totalNumEle.innerText = totalNum;
            //通过for循环计算总数(拿到每一个小计盒子中的值进行求和)
            /* for(var i=0;i<xjMoneyArrayEle.length;i++){
                totalMoney+=Number(xjMoneyArrayEle[i].innerText);
            } */
            //修改“总钱数”盒子中的数值
            totalMoneyEle.innerText = totalMoney;

            //获取已选商品的单价数组
            for(var i=0;i<lis.length;i++){
                var item=lis[i];
                //选中的商品(件数大于0)
                if(item.querySelector(".num").innerText>0){
                    //获取单价
                    var value=item.querySelector(".itemPrice").innerText;
                    numAry.push(value);
                }
            }
            /* 
            //未选择商品
            if(numAry.length<1){
                maxMoney="---";
            }else{
                //获取已选商品单价数组中的最大值
                maxMoney=numAry.sort(function(a,b){return a-b;})[numAry.length-1];
            } 
            */
            if(numAry.length>0){
                maxMoney=numAry.sort(function(a,b){return a-b})[numAry.length-1];
            } 

            //修改“选中商品最贵单价”盒子中的值
            specialItemPriceEle.innerText=maxMoney;
        }
    }
</script>