【javaScript案例】之类似购物车的效果实现

2022-03-30 16:13:06 浏览数 (1)

这次的效果如下图:

实现的效果是在购物车界面选择想要选购的商品,提交后转到支付界面确认支付,最后支付成功后返回选购页面。

我们这篇文章只讲解选购的页面,支付界面见这篇文章:https://xinxin-l.github.io/2022/02/15/【javaScript案例】之支付10秒倒计时/

我们开始咯~

我们首先来实现html和css的部分:如下图

其实这个部分很考验基础功~,我们需要用到table标签,在td中写入对应的文字(具体可见下方的代码,可以根据自己的喜好添加样式)。

重点其实在于js的部分:

这个效果实现的基本功能如下:

  1. 勾选/不勾选第一列的框,对应第五列的小计中的价格会改变,下方的合计价格会改变
  2. 选择第一行第一列的全选按钮,下方所有的复选框都会被选中,对应的小计和合计中的价格都会发生改变
  3. 选择第四列中的-和 ,表示要选购该物品的数目,相应的小计和合计中的价格会发生改变
  4. 点击最后一列的删除键,相应的行会消失,同时合计数目会发生改变

要从哪下手呢,我们按照顺序来解决~

  1. 我们首先通过document.getElementsByTagName获取所有的复选框,然后通过onclick函数修改其checked属性,表示选中/不选中。要记住必须要通过一个变量来表示是从选中->未选中,还是未选中->选中。然后如何修改其内容呢? 我们可以通过parentNode来选出复选框对应的父节点,再在该父节点中选出对应小计中的innerText,修改其内容(要对应前面的单价)=======这样第一点就完成啦,其实还要多研究细节,有很多需要在注意的细节
  2. 关于全选实现的效果,我们可以和复选框修改内容使用部分相同的代码,(具体可见下面的代码),要记住我们还是需要记录一个变量来判断复选框是否被全选->判断对应的价格是否要发生变化。
  3. 关于通过加减来修改选购物品的数目,需要多加思考,因为涉及选购数目、小计价格、总计价格的改变,但是大概的思路跟第一点类似,就是通过该节点找到其父节点,然后修改该父节点下的不同子节点的innerText(但是在修改之前要判断一下对应的复选框是否被选中,若未被选中,就不需要改变相关价格了~)
  4. 最后一点,其实就简单啦,点击删除按钮的时候,我们需要修改的只有两点:一是display:none,二是如果复选框被选中,需要修改对应的合计的价格

好啦,大概思路就是以上几点啦,具体内容可以参考下面的代码:

代码语言:javascript复制
<!DOCTYPE html>
<html lang="en">
<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;
        }

        table{
            /* border:1px solid rgba(0,0,0,.3); */
            text-align: center;
            margin:60px auto;
            margin-bottom: 20px;
            width:500px;
            border-radius: 20px;
            border-spacing: 2px;
        }

        table td{
            border:2px solid rgba(0,0,0,.3);
            margin:0;
            width: 70px;
            height:60px;
            border-radius: 20px;
            box-shadow: 2px 3px 2px rgba(0,0,0,.3);
            }

        #hd td{
            font-weight:560;
        }

        tr :nth-child(6){
            cursor: pointer;
        }

        #bott{
            text-align: right;
            width: 450px;
            margin: 30px auto;
            font-size:23px;
        }

        #btn{
            width: 50px;
        }

        table td input{
            width: 16px;
            height: 16px;
        }

        .f,.z{
            margin: 0 5px;
            width: 17px;
        }

        table td,table button{
            background-color: rgba(135, 207, 235, 0.56);
        }

        #sub{
            width: 70px;
            height: 35px;
            margin-left: 60px;
        }
    </style>
</head>
<body>
    <table>
        <tr id="hd">
            <td><button id="btn" style="background-color: snow;">全选</button></td>
            <td>商品名称</td>
            <td>单价</td>
            <td>数量</td>
            <td>小计</td>
            <td style="cursor: auto;">操作</td>
        </tr>
        <tr>    
            <td><input type="checkbox" name="" id="a"></td><td>巧克力</td><td>200</td><td><button class="f">-</button><span>1</span><button class="z"> </button></td><td>200</td><td class="del">删除</td>
        </tr>
        <tr>
            <td><input type="checkbox" name="" id="b"></td><td>奥利奥</td><td>100</td><td><button class="f">-</button><span>2</span><button class="z"> </button></td><td>200</td><td class="del">删除</td>
        </tr>
        <tr>
            <td><input type="checkbox" name="" id="c"></td><td>薯片</td><td>50</td><td><button class="f">-</button><span>2</span><button class="z"> </button></td><td>100</td><td class="del">删除</td>
        </tr>
        <tr>
            <td><input type="checkbox" name="" id="c"></td><td>奶茶</td><td>20</td><td><button class="f">-</button><span>2</span><button class="z"> </button></td><td>40</td><td class="del">删除</td>
        </tr>
    </table>
    <div id="bott">
        <span>总计:</span>
        <span id="total"></span>
        <button type="submit" id="sub">提交</button>
    </div>
    <script>
        let btns=document.getElementsByTagName("input");
        let total=document.getElementById("total");
        let f=document.getElementsByClassName("f");
        let z=document.getElementsByClassName("z");
        let del=document.getElementsByClassName("del");
        let sub=document.getElementById("sub");

        document.getElementById("btn").onclick=function(){
            let tem=true;
            for(let i=0;i<btns.length;i  ){
                let before=btns[i].checked;
                if(before===false){
                    tem=false;
                }
                btns[i].checked=true;
                click(i,before);
            }
            if(tem){
                total.innerText=0;
                for(let i=0;i<btns.length;i  ){
                btns[i].checked=false;
                }
            }
        }

        total.innerText=0;
        for(let i=0;i<btns.length;i  ){
            let before=btns[i].checked;
            btns[i].onclick=function(){
                if(btns[i].checked===false){
                    before=true;
                }
                if(btns[i].checked===true){
                    before=false;
                }
                click(i,before);
            }
        }

        function click(i,before){
            console.log(btns[i].checked);
            console.log(before)
            let par=btns[i].parentNode.parentNode;
            let price=par.childNodes[5].innerText;
            console.log(price)
            if(btns[i].checked === true && before === false && par.style.display!=="none"){
                total.innerText = parseInt(total.innerText) parseInt(price);
            }
            if(btns[i].checked === false && before === true && par.style.display!=="none"){
                total.innerText = parseInt(total.innerText)-parseInt(price);
            }
        }
        
        for(let i=0;i<f.length;i  ){
            f[i].onclick=function(){
                let num=Math.abs(parseInt(f[i].parentNode.innerText));
                let par=f[i].parentNode.parentNode;
                let little=parseInt(par.childNodes[5].innerText);
                let single=parseInt(par.childNodes[3].innerText);

                if(num > 0){
                    num--;
                    f[i].parentNode.childNodes[1].innerText=num;
                    par.childNodes[5].innerText=little-single;
                    if(btns[i].checked===true){
                        total.innerText = parseInt(total.innerText)-single;
                    }
                }
            }

            z[i].onclick=function(){
                let num=Math.abs(parseInt(f[i].parentNode.innerText));
                let par=f[i].parentNode.parentNode;
                let little=parseInt(par.childNodes[5].innerText);
                let single=parseInt(par.childNodes[3].innerText);
                num  ;
                f[i].parentNode.childNodes[1].innerText=num;
                par.childNodes[5].innerText=little single;
                if(btns[i].checked===true){
                    total.innerText = parseInt(total.innerText) single;
                }
            }
        }

        for(let i=0;i<del.length;i  ){
            del[i].onclick=function(){
                let par=del[i].parentNode;
                par.style.display="none";
                if(btns[i].checked===true){
                    total.innerText = parseInt(total.innerText) - parseInt(par.childNodes[5].innerText);
                }
            }
        }

        sub.onclick=function(){
            alert("总消费" total.innerText "元,确定要支付吗?");
            for(let i=0;i<btns.length;i  ){
                btns[i].checked=false;
            }
            total.innerText=0;
            location.href="../特效/支付10秒钟.html";
        }
    

    </script>
</body>
</html>

0 人点赞