总结的常用的前端开发中的常见套路之购物车页面

2023-05-16

1.商品的全选和全不选  

  1. 获取页面中全选框所在的input,绑定其变change事件
  2. 获取全选框的状态
  3. 遍历获取商品对应的CheckBox,设置其选中状态和全选的保持一致
  4. 同时,当全选框状态发生变化时,结算中商品的总价格和总数目相应的需要改变。就需要计算页面中被选中的商品的总价格和总数目。
  5. 计算总价格和总数目,需要获取选中的商品的数目和小计,进行类加计算商品的总数目和总价格就,这里可以单独定义一个函数,以便后面复用
  6. 最后,需要设置被选中的商品的总数目和价格

  先贴上计算总件数和总价格的代码(说明:页面中出现的中括号,那个是django的模板注释,不过不影响前端代码。)

<script>
        // 计算被选中的商品的总件数和总价格
        function update_page_info() {
            // 获取所有被选中的商品的checkbox
            // 获取所有被选中的商品所在的ul元素,从而获取被选中的商品的数量和价格,计算小计
            total_count = 0;
            total_price = 0;
            $('.cart_list_td').find(':checked').parents('ul').each(function () {
                // 获取商品数目和小计
                count = $(this).find('.num_show').val();
                // 商品价格
                amount = $(this).children('.col07').text();
                // 累加计算商品总数目和价格
                count = parseInt(count);
                {# alert(count)#}
                amount = parseFloat(amount);
                {# alert(amount)#}
                total_count += count;
                total_price += amount;

            });
            // 设置被选中的商品总数目和价格
            $('.settlements').find('em').text(total_price.toFixed(2));
            $('.settlements').find('b').text(total_count)

        }
</script>

 


2.商品的全选和全不选代码

<script>
// 商品的全选和全不选,绑定全选的变化
        $('.settlements').find(':checkbox').change(function () {
            // 获取全选框的状态
            is_checked = $(this).prop('checked');
            // 遍历商品对应的checkbox,设置的选中状态和全选的保持一致
            $('.cart_list_td').find(':checkbox').each(function () {
                $(this).prop('checked', is_checked)
            });
            // 更新页面信息
            update_page_info()

        });
<script/>

3.商品对应的checkbox状态发生改变

  1. 当商品对应的checkbox状态发生改变时候,需要设置全选checkbox的状态
  2. 获取页面上所有被选中的商品的数目,并获取所有商品数目,判断他们的数目,如果前者小于后者,则设置全选框为未选中
<script>
        // 商品对应的checkbox状态发生改变时候,设置全选checkbox的状态
        $('.cart_list_td').find(':checkbox').change(function () {
            // 获取页面上所有的商品数目
            all_len = $('.cart_list_td').length;
{#            alert(all_len)#}
            // 获取页面上所有被选中的商品的数目
            checked_len = $('.cart_list_td').find(':checked').length;
{#            alert(checked_len)#}
            is_checked = true;
            // 判断如果页面上的所有被选中的商品数目小于页面上所有的商品数目,设置全选框架状态
            if (checked_len < all_len){
                $('.settlements').find(':checkbox').prop('checked', false);
            }
            else {
                $('.settlements').find(':checkbox').prop('checked', true);
            }

            // 更新页面信息
            update_page_info()
        });
<script/>

4. 用户点击,购物车中商品数目变化

  1. 购物车中商品数量的增加,减少,以及用户手动输入套路基本一致,这里总结下当用户点击商品数量增加时的情况,同时说明收两者的变化,同时涉及与后端交互的情况,也会一同提到。
  2. 用户点击修改购物车中商品,(后端数据库需要相应发生变化,后端需要前端传递的参数包括商品sku id以及商品数量),用户点击增加,绑定标签click事件,获取商品数量(增加或减少1,减少的话需要判断当数量减少为0时候的情况。如果是用户手动输入,则同样需要对用户输入进行校验,如果不合法,可以设置为之前输入的值),获取商品id,使用ajax发向后端发起post请求,携带后端需要的参数。
  3. 根据回调结果,进行相应判断,如果添加成功,需要重新设置商品数目,并重新计算商品小计(计算商品小计可以单独定义一个函数),判断该商品是否被选中,如果选中,更新页面信息(结算中的商品数目和价格需要跟随变化)
  4. 发起ajax请求需要注意的是,需要发起同步请求(ajax默认为异步,我们后面的判断依赖于回调的执行结果)
<script>
// 计算商品小计
function update_goods_amount(sku_ul) {
    // 需要获取商品数目和价格
    // count = $(sku_ul).find('.num_show').val();
    // price = $(sku_ul).children('.col05');

    count = sku_ul.find('.num_show').val();
    price = sku_ul.children('.col05').text();

    // 计算商品小计
    count = parseInt(count);
    price = parseFloat(price);
    amount = count * price;
    // 设置商品的小计
    sku_ul.children('.col07').text(amount.toFixed(2) + '元');

}

// 购物车增加减少逻辑基本相同,抽出共同部分为一个函数
error_update = false;
total = 0;
function update_remote_cart_info(sku_id, count) {
    csrf = $('input[name="csrfmiddlewaretoken"]').val();
    params = {'sku_id': sku_id, 'csrfmiddlewaretoken': csrf, 'count': count};
    // 设置ajax请求为同步()
    $.ajaxSettings.async = false;
    // post请求 发起ajax请求, /cart/update,参数:sku_id, 商品数目
    $.post('/cart/update', params, function (data) {
        if (data.res == 4){
            // 成功
            error_update = false;
            total = data.count;
        }
        else{
            // 失败
            error_update = true;
            alert(data.errmsg)
        }
        });

     // 设置ajax请求为异步
    $.ajaxSettings.async = true;

}

// 购物车中商品数量增加,绑定+ 所在a标签点击事件(涉及与后台交互)
$('.add').click(function () {
    // 获取商品数量,id,
    count = $(this).next().val();
    // 给标签增加id属性,在获取
    sku_id = $(this).next().attr('sku_id');
    count = parseInt(count) + 1;

    // 发ajax请求
    update_remote_cart_info(sku_id, count);

    // 判断是否添加成功
if (error_update == false){
    // 重新设置商品数目,点击完了加一之后的值
    $(this).next().val(count);
    // 计算商品小计
    amount = update_goods_amount($(this).parents('ul'));

    // 设置商品小计
{#            $(this).parents('ul').children('col07').text(amount);#}

    // 获取商品对应的checkbox的状态,如果选中,则更新页面信息
    is_checked = $(this).parents('ul').find(':checkbox').prop('checked');

    if (is_checked){
        // 更新页面信息
        update_page_info();
    }
    // 不管是否选中,都更新页面中购物车商品总数目
    // $('.total_count').children('em').text(data.count);(已经在post请求外面了,拿不到data,应该在上面定义)
    $('.total_count').children('em').text(total);
}
});

// 购物车记录减少
 $('.minus').click(function () {
    // 获取商品数量,id,
    count = $(this).prev().val();

    // 给标签增加id属性,在获取
    sku_id = $(this).prev().attr('sku_id');

    count = parseInt(count) - 1;
    // 判断
    if (count <= 0){
          return
    }

   // 发请求
     update_remote_cart_info(sku_id, count);

    // 判断是否减少成功
if (error_update == false){
    // 重新设置商品数目,点击完了减一之后的值
    $(this).prev().val(count);
    // 计算商品小计
    amount = update_goods_amount($(this).parents('ul'));

    // 设置商品小计
{#            $(this).parents('ul').children('col07').text(amount);#}

    // 获取商品对应的checkbox的状态,如果选中,则更新页面信息
    is_checked = $(this).parents('ul').find(':checkbox').prop('checked');

    if (is_checked){
        // 更新页面信息
        update_page_info();
    }
    // 不管是否选中,都更新页面中购物车商品总数目
    // $('.total_count').children('em').text(data.count);(data已经在post请求外面了,拿不到data,应该在上面定义)
    $('.total_count').children('em').text(total);
}
});

 // 获取用户鼠标进入时候的商品数量
pre_count = 0;
$('.num_show').focus(function () {
    pre_count = $(this).val();
});

 // 手动输入购物车商品数量,绑定失去焦点事件
$('.num_show').blur(function () {
    // 获取商品数量,id,
    count = $(this).val();

    // 给标签增加id属性,在获取
    sku_id = $(this).attr('sku_id');


    // 校验数据
    if (isNaN(count) || count.trim().length == 0 || parseInt(count) <= 0){
        // 不满足条件,数据非法,重置商品数目为之前的值()
        $(this).val(pre_count);
        return;
    }

   // 发请求
     update_remote_cart_info(sku_id, count);

    // 判断是否更新成功
if (error_update == false){
    // 重新设置商品数目,点击完了减一之后的值
    $(this).val(count);
    // 计算商品小计
    amount = update_goods_amount($(this).parents('ul'));

    // 设置商品小计
    $(this).parents('ul').children('col07').text(amount);

    // 获取商品对应的checkbox的状态,如果选中,则更新页面信息
    is_checked = $(this).parents('ul').find(':checkbox').prop('checked');

    if (is_checked){
        // 更新页面信息
        update_page_info();
    }
    // 不管是否选中,都更新页面中购物车商品总数目
    // $('.total_count').children('em').text(data.count);(data已经在post请求外面了,拿不到data,应该在上面定义)
    $('.total_count').children('em').text(total);
}
else {
    // 如果失败设置为之前的值
    $(this).val(pre_count);
}
});

<script/>

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

总结的常用的前端开发中的常见套路之购物车页面 的相关文章

  • 移动端软键盘和input遮挡问题

    零时解决方案 span class token doctype span class token punctuation lt span span class token doctype tag DOCTYPE span span clas
  • 如何获取 b站视频 纯播放

    通过视频页url直接拿到 BV1NV411v7Xp https www bilibili com video BV1NV411v7Xp spm id from 61 autoNext 发起请求 拿到 aid cid https api bi
  • vue3 ts vite 配置别名 导致报 无法找到对应莫模块的错误处理方式

    第一步 vite config ts alias span class token operator span span class token punctuation span span class token string 34 64
  • kl-waterfall 瀑布流

    文章目录 使用实现waterfall index文件kl waterfall item 使用 span class token operator lt span kl span class token operator span water
  • kl-anchor(vue锚点组件)

    文章目录 示例功能描述存在问题 使用实现 示例 功能描述 点击左侧导航栏 xff0c 右侧能滚动到指定的位置右侧滚动 xff0c 左侧能自动选中 存在问题 多次监听直接绑定滚动到了body 优化版本链接 使用 这儿是结合element ui
  • 银行家算法原理

    银行家算法原理
  • python 深度学习[数学基础-1-函数,极限]

    文章目录 函数 函数
  • python 深度学习-数学基础-2-导数

    z z的变化值比上距离的极限
  • python 深度学习-数学基础-3-微积分

  • rt-thread CAN通信(can dev write data failed!)解决,硬件定时器、以及CANfestival包的使用

    本文采用正点原子STM32f407ZGT6探索者 关于rtt的CAN通信配置可以参考RT Thread studio 添加CAN通信功能 按上面配置完成后串口会打印下图所示问题 xff1a xff08 can dev write data
  • (二)STM32串口总结(库函数版)

    一 STM32F103有两个串口 图中 TXD RXD 是相对 CH340G 来说的 xff0c 也就是 USB 串口的发送和接收引脚 而 USART1 RX 和 USART1 TX 则是相对于 STM32F103ZET6 来说的 也就是说
  • Matlab画图 线条的颜色、宽度等相关设置

    线条的属性有 xff1a Color 颜色 LineWidth 线条宽度 LineStyle 线型 LineJoin 线条边角的样式 AlignVertexCenters 锐化垂直线和水平线 线条属性的默认值为 0 0 0 39 39 39
  • 一、图像预处理

    四种图像的基本数据结构 xff1a Image 指Halcon的图像类型 Region 指图像中的一块区域 XLD 指图像中某一块区域的轮廓 Tuple 类似于数组 xff0c 用于存储一幅或多幅图像 内核矩阵的选择 xff1a 核越大越模
  • halcon边缘检测

    边缘检测 Ronny丶 博客园 寻找边缘的传统方法 xff0c 即图像中的暗 光转换 xff0c 是应用边缘滤波器 这些滤光器可以在光和暗区域的边界找到像素 从数学术语中来说 xff0c 这意味着这些滤波器决定了图像的梯度 此图像渐变通常作
  • ZED双目摄像头

    ZED stereol abs 配置踩过的坑 现在种树也不晚 博客园 介绍 xff1a CUDA CUDA 是 ZED SDK 使用的 NVIDIA 库 xff0c 用于在显卡上运行快速 AI 和计算机视觉任务 在 ZED SDK 安装过程
  • linux---五种高级IO模型

    阻塞IO模型非阻塞IO模型信号驱动IO模型异步IO模型多路转接IO模型高级IO重要概念 阻塞IO模型 在内核将数据准备好 xff0c 系统调用会一直等待 xff0c 所有的套接字默认都是阻塞IO方式 阻塞IO是最常见的IO模型 非阻塞IO模
  • Ubuntu错误处理集

    1 W GPG 错误 xff1a https developer download nvidia com compute cuda repos ubuntu1604 x86 64 Release 由于没有公钥 xff0c 无法验证下列签名
  • Linux下配置虚拟CAN

    1 加载vcan模块 sudo modprobe vcan 2 添加vcan0网卡 sudo ip link add dev vcan0 type vcan 3 查看当前CAN网络 ifconfig a 4 开启vcan0 sudo ip
  • ROS基础

    一 ROS的核心概念 节点 xff1a 节点管理器 xff1a 话题 xff1a 消息 xff1a 服务 xff1a 参数 xff1a 二 命令行工具的使用 命令行工具都是以ros开头的 常用命令 rostopicrosserviceros

随机推荐

  • Linux下编译Opencv和contrib

    1 安装准备 1 1 安装依赖项 sudo apt get install cmake sudo apt get install build essential libgtk2 0 dev libavcodec dev libavforma
  • YOLOv5和YOLOv7环境(GPU)搭建测试成功

    本来是用doc写的 xff0c 直接复制到这里很多图片加载缓慢 xff0c 我直接把doc上传到资源里面了 xff0c 0积分下载 xff1a 10条消息 YOLOv5和YOLOv7开发环境搭建和demo运行 Python文档类资源 CSD
  • 单片机通信总述——理论部分(CAN、串口、SPI、I2C等)

    一 基础概念 1 1 通信方法 并行通信 xff1a 传输原理 xff1a 数据各个位同时传输 xff1b 优点 xff1a 速度快 xff1b 缺点 xff1a 占用引脚资源多 是指使用 8 16 32 及 64 根或更多的数据线 有多少
  • Ubuntu系统搭建

    一 创建环境常见问题 1 1 windows11下打开虚拟机蓝屏问题 参考这篇文章 xff0c 控制面板 xff0c 启用和关闭windows功能 xff08 对话框 xff09 113条消息 VMware安装Ubuntu开启蓝屏解决方案
  • J-Link工具查看单片机内存等信息

    1 打开下图应用 2 输入 connect xff08 连接开发板 xff09 AC78013FDLA xff08 你的单片机型号 xff09 SWD xff08 仿真器接口 xff09 1000HZ xff08 接口速度 xff09 连接
  • Qt调用ffmpeg动态库和静态库及编译ffmpeg的方法

    一 编译 二 引入ffmpeg库文件 1 Qt工程下创建lib文件夹 xff0c lib文件夹下再创建ffmepg文件夹 2 将编译好的ffmpeg里面的include 和lib文件夹粘贴到如下文件夹下 xff08 3 xff09 在 pr
  • autoware花屏重影问题

    autoware 安装 花屏 重影问题 最近尝试下autoware来做建图 xff0c 无奈各类安装太过麻烦 xff0c 这里给几个小问题做下纪律 1 xff0c 安装过程 xff0c 走的官网那个 xff0c 事实证明官网教程最全面 xf
  • linux---select,poll,epoll的原理以及优缺点

    多路转接IO xff08 也叫IO多路复用 xff09 是一种处理高并发的IO事件监控 xff0c 同时对大量的描述符进行时间监控 xff0c 监控是否具备IO条件 就绪 xff1a 包括了读就绪事件 xff08 就是有数据到来的时候 xf
  • DTAM实现

    DTAM实现 这里是实现github上DTAM的一次记录 xff0c 主要是有些步骤的记录 需要下载的源码 xff08 可以多试试几个 xff0c 按照实现可能性排序 xff09 xff1a https github com Teddybe
  • jetson镜像克隆到固态再扩容简单方法

    jetson克隆方法很多 xff0c 我是自己把之前的sd镜像克隆做成img镜像了 然后烧写后之前是64g的后续烧写都是64g的不能把新的储存设备占满 这里有一个扩容和移植到固态的方法 主要分三步 xff1a 镜像克隆和烧录到sd卡使用固态
  • Orb_slam3 ROS ,D435i使用,ubuntu编译小记

    C 43 43 版本编译 先官网下载代码 xff0c 并下载安装官网所述安装包 git clone https github com UZ SLAMLab ORB SLAM3 git ORB SLAM3 下载完编译c 43 43 版本 cd
  • d455双目相机联合IMU标定

    感谢这两位博主的优秀文章 xff1a RealSense D455的标定并运行VINS FUSION Z Jin16的博客 CSDN博客 d455 标定 Realsense D435I标定 小岛 神酱的博客 CSDN博客 d435i参数 主
  • gitee发布示例

    简易的命令行入门教程 Git 全局设置 git config global user name 34 bnb 34 git config global user email 34 2207201665 64 qq com 34 创建 git
  • linux终端快捷指令创建

    使用这个打开gedit bashrc xff0c 把下面的按照下面的格式书写 xff1a alias lt 想要的快捷键 gt 61 操作指令 示例 xff1a alias sd 61 39 source devel setup sh 39
  • 使用vscode做得基础配置自动保存格式化

    vscode默认启用了根据文件类型自动设置tabsize的选项 34 editor detectIndentation 34 false 重新设定tabsize 34 editor tabSize 34 2 每次保存的时候自动格式化 34
  • OOQP 使用教程 c++

    最近学习了一下OOQP的使用在这里记录一下 在matlab代码中是quadprog xff0c 而这次使用OOQP也主要是为了计算二次规划问题 安装OOQP 首先是安装问题 xff0c 不得不说 xff0c 当时安装也花了不少时间 xff0
  • 物联网工程 | CAN(Controller Area Network)控制器局域网络答疑

    文章目录 概述一 CAN的物理设备二 CAN的物理传输三 CAN的多设备连接四 CAN编程 概述 本节以问答方式讲述CAN相关的一些疑点问题 一 CAN的物理设备 问 xff1a CAN需要什么样的物理设备支持才能算一个CAN网络 系统 x
  • 【无标题】

    前言 对于喜欢逛CSDN的人来说 xff0c 看别人的博客确实能够对自己有不小的提高 xff0c 有时候看到特别好的博客想转载下载 xff0c 但是不能一个字一个字的敲了 xff0c 这时候我们就想快速转载别人的博客 xff0c 把别人的博
  • VSCode中针对C语言的代码格式化配置

    默认格式化工具 打开设置 Ctrl 43 xff0c 选择 用户 配置 xff0c 找到 文本编辑器 Default Formatter xff1a 安装了C C 43 43 插件后 xff0c 即可选择 xff1a C C 43 43 m
  • 总结的常用的前端开发中的常见套路之购物车页面

    1 商品的全选和全不选 获取页面中全选框所在的input xff0c 绑定其变change事件获取全选框的状态遍历获取商品对应的CheckBox xff0c 设置其选中状态和全选的保持一致同时 xff0c 当全选框状态发生变化时 xff0c