js实现简单的购物车 有图有代码

用JavaScript实现静态购物车功能

要求:
点击+号数量增加,点击-号数量递减;
实现全选、反选和删除功能;
求出小计、总数量和总价;

看效果图
在这里插入图片描述

  • CSS样式
<style>
        table{
            width: 900px;
            border-collapse: collapse;
            margin: 0 auto;
        }
        th{      
            border-top: 3px solid #a7cbff;
            background: #e2f2ff;
            text-align: center;
        }
        td{
            height: 80px;
            border: 1px solid #CADEFF;
            text-align: center;
            color: rgb(167, 159, 159);
            font-size: 14px;
        }
        tr:hover{
            background-color:#e2f2ff;
        }
        .count-input{
            width: 50px;
            text-align: center;
            height: 21px;
  

        }
        #foot td{
            height: 30px;
        }
        .reduce{
            position: relative;
            left: 5px;
            bottom: 2px;
        }
        .add{
            position: relative;
            right: 5px;
            bottom: 2px;
        }
        .reduce,.add{
            display: inline-block;
            width: 20px;
            height: 25px;
            background-color: #ccc;
            color: white;
            cursor: pointer;
        }
        span{
            cursor: pointer;
        }
        #allPrice{
            display: inline-block;
            width: 50px;
        }
        tfoot tr td{
            text-align: left;
        }
    </style>
  • body部分
    <table>
        <thead>
            <tr>
                <th><input type="checkbox" id="ckAll" onclick="checkAll()">全选</th>
                <th>商品</th>
                <th>单价</th>
                <th>数量</th>
                <th>小计</th>
                <th>操作</th>
            </tr>
        </thead>
        <tbody>
            <tr class="inline">
                <td><input type="checkbox" name="ck" onclick="check()"></td>
                <td>Casio/卡西欧 EX-TR350</td>
                <td>5999.88</td>
                <td>
                    <span class="reduce" onclick="reduceCount(this)">-</span>
                    <input type="text" value="1" class="count-input">
                    <span class="add" onclick="addCount(this)">+</span>
                </td>
                <td>5999.88</td>
                <td>
                    <span class="delete" onclick="del(this)">删除</span>
                </td>
            </tr>
            <tr class="inline">
                <td><input type="checkbox" name="ck" onclick="check()"></td>
                <td>Canon/佳能 PowerShot SX50 HS</td>
                <td>3888.50</td>
                <td>
                    <span class="reduce" onclick="reduceCount(this)">-</span>
                    <input type="text" value="1" class="count-input">
                    <span class="add" onclick="addCount(this)">+</span>
                </td>
                <td>3888.50</td>
                <td>
                    <span class="delete" onclick="del(this)">删除</span>
                </td>
            </tr>
            <tr class="inline">
                <td><input type="checkbox" name="ck" onclick="check()"></td>
                <td>Sony/索尼 DSC-WX300</td>
                <td>1428.50</td>
                <td>
                    <span class="reduce" onclick="reduceCount(this)">-</span>
                    <input type="text" value="1" class="count-input">
                    <span class="add" onclick="addCount(this)">+</span>
                </td>
                <td>1428.50</td>
                <td>
                    <span class="delete" onclick="del(this)">删除</span>
                </td>
            </tr>
            <tr class="inline">
                <td><input type="checkbox" name="ck" onclick="check()"></td>
                <td>Fujifilm/富士 instax mini 25</td>
                <td>640.60</td>
                <td>
                    <span class="reduce" onclick="reduceCount(this)">-</span>
                    <input type="text" value="1" class="count-input">
                    <span class="add" onclick="addCount(this)">+</span>
                </td>
                <td>640.60</td>
                <td>
                    <span class="delete" onclick="del(this)">删除</span>
                </td>
            </tr>
        </tbody>  
        <tfoot id="foot">
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td>总数:<span id="allCount"></span></td>
            <td>总价:<span id="allPrice"></span></td>
        </tr>
        </tfoot>
    </table>
  • script部分
<script>

        //获取元素
        var ckAll = document.getElementById('ckAll');
        var cks = document.getElementsByName('ck');
        var trs = document.getElementsByClassName('inline');
        var allCount = document.getElementById('allCount');
        var allPrice = document.getElementById('allPrice');
        var countInput = document.getElementsByClassName('count-input');

        //计算总数
        function sumCount(){
            var sum = 0;
            for(var i=0;i<cks.length;i++){
                if(cks[i].checked == true){
                    var num = Number(countInput[i].value);
                    sum += num;
                }
            }
            allCount.innerHTML = sum;
        }

        //计算总价
        function sumPrice(){
            var sum = 0;
            for(var i=0;i<cks.length;i++){
                if(cks[i].checked == true){
                    var p = Number(trs[i].children[4].innerHTML);
                    sum += p;
                }
            }
            allPrice.innerHTML = sum.toFixed(2);
        }
        
        //计算每一行的总价
        function inlinePrice(){
            for(var i=0;i<trs.length;i++){
                //获取每一行单价
                var price = Number(trs[i].children[2].innerHTML);
                //获取数量
                var num = Number(trs[i].children[3].children[1].value);
                //小计
                trs[i].children[4].innerHTML = (price * num).toFixed(2);

            }
        }

        //数量增加
        function addCount(e){
            // 获取input标签里的value值,数量
            var num =parseInt(e.previousElementSibling.value) ;
            //数量加1
            e.previousElementSibling.value = num+1;
            inlinePrice();
            sumPrice();
            sumCount();
        }

        //数量递减
        function reduceCount(e){
            var num = parseInt(e.nextElementSibling.value);
            if(num <= 0){
                alert("不能再减了");
                return;
            }

            e.nextElementSibling.value = num-1;
            inlinePrice();
            sumPrice();
            sumCount();
        }
       
        //全选和反选
        function checkAll(){
            for(var i=0;i<cks.length;i++){
                cks[i].checked = ckAll.checked;
            }
            sumPrice();
            sumCount();
        }

        //复选框的交互
        function check(){
            // 判断四个小的复选框有没有没被选中的,如果有一个,就把ckAllde的checked 变为false
            for(var i=0;i<cks.length;i++){
                if(cks[i].checked == false){
                    ckAll.checked = false;
                    sumPrice();
                    sumCount();
                    // 有一个小复选框为false,就不需要对其他复选框进行判断了,直接中止函数下面的执行语句
                    return;
                }
            }
            //循环结束后,如果小复选框checked的值都为true,ckAll的checked的值就为true
            ckAll.checked = true;
            sumPrice();
            sumCount();
        }

        //单行删除
        function del(e){
            e.parentElement.parentElement.remove();
            sumPrice();
            sumCount();
        }

    </script>

好的,下面我将为您提供一个简单购物车示例,使用Vue.js和Node.js构建。在这个示例中,我们将使用Vue.js来呈现购物车的用户界面,使用Node.js来处理购物车的业务逻辑和数据库交互。 首先,我们将创建一个名为“shopping-cart”的文件夹,并在其中创建另外两个文件夹:client和server。在client文件夹中,我们将使用Vue.js创建一个简单前端应用程序,而在server文件夹中,我们将使用Node.js创建一个后端服务器来处理购物车相关的逻辑。 **1. 前端部分** 在client文件夹中,我们将创建以下文件和文件夹: - **index.html** - 这是我们的主页面,用于呈现购物车的用户界面。 - **app.js** - 这是我们的Vue.js应用程序的主要JavaScript文件,用于管理购物车的状态和交互。 - **assets**文件夹 - 这个文件夹包含一些图像和CSS文件,用于美化我们的用户界面。 下面是index.html的代码: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Shopping Cart</title> <link rel="stylesheet" href="assets/style.css"> </head> <body> <div id="app"> <h1>Shopping Cart</h1> <ul> <li v-for="(item, index) in cartItems" :key="index"> {{ item.name }} - {{ item.price }} - {{ item.quantity }} <button @click="removeItem(index)">Remove</button> </li> </ul> <p>Total: {{ total }}</p> <hr> <form @submit.prevent="addItem"> <input type="text" v-model="newItem.name" placeholder="Item Name"> <input type="number" v-model="newItem.price" placeholder="Price"> <input type="number" v-model="newItem.quantity" placeholder="Quantity"> <button>Add Item</button> </form> </div> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script src="app.js"></script> </body> </html> ``` 在这个HTML文件中,我们使用了Vue.js的指令v-for和v-model来呈现购物车中的所有物品,并使用v-on指令来绑定删除和添加物品的事件。我们还定义了一个form元素,用于添加新物品。 下面是app.js代码: ```javascript var app = new Vue({ el: '#app', data: { cartItems: [], newItem: { name: '', price: '', quantity: '' } }, computed: { total: function() { var sum = 0; for (var i = 0; i < this.cartItems.length; i++) { sum += this.cartItems[i].price * this.cartItems[i].quantity; } return sum; } }, methods: { addItem: function() { this.cartItems.push({ name: this.newItem.name, price: this.newItem.price, quantity: this.newItem.quantity }); this.newItem.name = ''; this.newItem.price = ''; this.newItem.quantity = ''; }, removeItem: function(index) { this.cartItems.splice(index, 1); } } }); ``` 在这个JavaScript文件中,我们使用Vue.js的实例来定义购物车的数据和方法。我们使用cartItems数组来存储购物车中的物品,并使用newItem对象来存储新物品的信息。我们还定义了一个计算属性来计算购物车的总价值,并使用addItem和removeItem方法来添加和删除物品。 **2. 后端部分** 在server文件夹中,我们将创建以下文件和文件夹: - **package.json** - 这是我们的Node.js应用程序的配置文件,用于管理依赖项和脚本。 - **index.js** - 这是我们的Node.js应用程序的主要JavaScript文件,用于创建服务器并处理购物车相关的逻辑。 - **routes**文件夹 - 这个文件夹包含一些路由文件,用于处理不同的HTTP请求。 下面是package.json的代码: ```json { "name": "shopping-cart", "version": "1.0.0", "description": "A simple shopping cart app using Vue.js and Node.js", "main": "index.js", "dependencies": { "body-parser": "^1.19.0", "express": "^4.17.1" }, "scripts": { "start": "node index.js" } } ``` 在这个文件中,我们定义了我们的应用程序的名称、版本、描述、依赖项和脚本。我们使用了express和body-parser模块来创建服务器和解析HTTP请求体。 下面是index.js代码: ```javascript const express = require('express'); const bodyParser = require('body-parser'); const app = express(); const port = 3000; app.use(bodyParser.json()); let cartItems = []; app.get('/cartItems', (req, res) => { res.send(cartItems); }); app.post('/cartItems', (req, res) => { const newItem = req.body; cartItems.push(newItem); res.send('Item added to cart'); }); app.delete('/cartItems/:id', (req, res) => { const id = req.params.id; cartItems.splice(id, 1); res.send('Item removed from cart'); }); app.listen(port, () => { console.log(`Server running on port ${port}`); }); ``` 在这个JavaScript文件中,我们使用了express模块来创建一个HTTP服务器,并使用body-parser模块来解析HTTP请求体。我们定义了一个名为cartItems的数组来存储购物车中的物品,并使用GET、POST和DELETE方法来处理不同的HTTP请求。我们使用GET方法来获取购物车中的物品,使用POST方法来添加新物品,使用DELETE方法来删除物品。 **3. 运行应用程序** 现在我们已经完成了我们的购物车应用程序的前端和后端部分。我们可以使用以下命令来启动我们的应用程序: ``` cd shopping-cart/server npm install npm start ``` 这将启动我们的Node.js服务器,并在端口3000上监听请求。接下来,我们可以使用以下命令来启动我们的Vue.js应用程序: ``` cd shopping-cart/client npm install npm run serve ``` 这将启动我们的Vue.js应用程序,并在端口8080上运行。现在,我们可以在浏览器中访问http://localhost:8080,以查看我们的购物车应用程序的用户界面。 在用户界面中,我们可以添加新物品、删除物品和查看总价值。当我们添加或删除物品时,我们的Vue.js应用程序将向我们的Node.js服务器发送HTTP请求,并更新购物车的状态。我们的Node.js服务器将根据HTTP请求的类型和参数来更新cartItems数组,并返回HTTP响应以告知客户端操作是否成功。 以上就是一个简单购物车示例,使用Vue.js和Node.js构建。您可以根据自己的需求和偏好来扩展和改进这个示例。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值