用script去做前端html表格分页/排序

news2024/12/23 22:11:06

前言:

掘弃掉与后端交互做分页和互导,有利有弊吧; 在小数据的时候,如果不停来回朝服务端发送请求,会造成堵塞.于是,放弃了之前的前后端ajax方式去请求分页表格,使用script去弄一个,降低服务器的压力;

整体思路图:

代码构造:

{% extends "order_header_same.html" %}

{% block body %}
<style>
    .small-select {
        height: 20px;
        padding: 1px 3px;
        font-size: 12px;
        line-height: 1;
    }
    .small-select.selected {
      background-color: #31b0d5; /* 自定义选中状态的背景颜色 */
    }
</style>



<style>
  nav.pagination-nav {
    width: 100%;
    display: flex;
    justify-content: center;
  }
</style>

<div class="container">
    <div class="table-responsive">
        <div style="margin-bottom: 10px">
            <a class="btn btn-primary" href="/order/create">
                <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>添 加</a>
        </div>
        <table class="table table-striped">
            <thead>
                <tr>
                    <th>订单ID</th>
                    <th>订单URL</th>
                    <th>
                        订单数量
                        <select onchange="sortTable(this, 2)" class="small-select" id="orderQtySelect">
                            <option value="N">- - -</option>
                            <option value="asc">升序</option>
                            <option value="desc">降序</option>
                        </select>
                    </th>
                    <th>
                        状态
                        <select onchange="filterTable(this)" class="small-select unique-class-or-id" id="statusSelect">
                            <option value="all">全 部</option>
                            <option value="1">等 待</option>
                            <option value="2">正在运行</option>
                            <option value="3">完 成</option>
                            <option value="4">失 败</option>
                            <option value="5">未 知</option>
                        </select>
                    </th>
                    <th>
                        创建时间
                        <select onchange="sortTableByDate(this, 4)" class="small-select" id="createTimeSelect">
                            <option value="N"> - - - </option>
                            <option value="asc">升序</option>
                            <option value="desc">降序</option>
                        </select>
                    </th>
                </tr>
            </thead>
            <tbody>
                {% for item in data_list %}
                <tr>
                    <th>{{ item.id }}</th>
                    <th>{{ item.url }}</th>
                    <th>{{ item.count }}</th>
                    <th data-status="{{ item.status }}">
                        <span class="label label-{{ status_dict[item.status].col }}">
                            {{ status_dict[item.status].sta }}
                        </span>
                    </th>
                    <th>{{ item.created_time }}</th>
                </tr>
                {% endfor %}
            </tbody>
        </table>

        <!-- 分页控制 -->
        <nav class="pagination-nav" aria-label="Table pagination">
            <ul class="pagination justify-content-center">
                <li class="page-item disabled">
                    <a class="page-link" href="#" tabindex="-1">上一页</a>
                </li>
                <li class="page-item active">
                    <a class="page-link" href="#">1</a>
                </li>
                <li class="page-item">
                    <a class="page-link" href="#">2</a>
                </li>
                <li class="page-item">
                    <a class="page-link" href="#">3</a>
                </li>
                <li class="page-item">
                    <a class="page-link" href="#">下一页</a>
                </li>
            </ul>
        </nav>
    </div>
</div>




<script>
  // 根据状态栏,进行分页; 首次登陆的时候,默认全部可见,当点击状态栏的时候,就会更新页数等;

  var rowsPerPage = 8; // 每页显示的行数
  var numberOfPages; // 总页数
  var filteredRowCount; // 筛选后的行数


  function updatePagination() {

    numberOfPages = Math.ceil(filteredRowCount / rowsPerPage); // 根据每页行数计算总页数

    if (numberOfPages == 0) {
      numberOfPages = 1; // 至少有一页,即使没有数据
    }

    setupPagination(numberOfPages); // 设置分页控件
    displayData(1); // 显示第一页的数据
  }

  function setupPagination(totalPages) {
    var paginationUl = document.querySelector('.pagination'); // 获取分页控件的 ul 元素
    paginationUl.innerHTML = ''; // 清空分页控件内的内容

    paginationUl.innerHTML +=
      `<li class="page-item" id="prevPage"><a class="page-link" href="#" onclick="changePage(-1)">上一页</a></li>`; // 添加上一页按钮

    for (var page = 1; page <= totalPages; page++) {
      var isActive = page === 1 ? "active" : ""; // 第一页添加 active 类
      var li = `<li class="page-item ${isActive}"><a class="page-link" href="#" onclick="displayData(${page})">${page}</a></li>`; // 创建页码按钮
      paginationUl.innerHTML += li; // 添加页码按钮到分页控件
    }

    paginationUl.innerHTML +=
      `<li class="page-item" id="nextPage"><a class="page-link" href="#" onclick="changePage(1)">下一页</a></li>`; // 添加下一页按钮

    togglePrevNextButtons(1); // 切换前一页和后一页按钮状态
  }

  function displayData(pageNumber) {
    var table = document.querySelector(".table"); // 获取表格


    var displayedRows = document.querySelectorAll(".table tbody tr.displayed"); // 获取(filterTable)筛选后显示的行

    if (displayedRows.length === 0) {
    // 如果没有筛选后的显示行,可以设定默认行为或终止函数的执行
    // return; // 终止函数的执行
    // 或者设定默认行为,例如显示所有行
    displayedRows = document.querySelectorAll(".table tbody tr");
  }


    var start = (pageNumber - 1) * rowsPerPage; // 计算起始索引
    var end = start + rowsPerPage; // 计算结束索引

    for (var j = 0; j < displayedRows.length; j++) {
      displayedRows[j].style.display = j >= start && j < end ? "" : "none"; // 根据索引显示或隐藏行
    }


    var paginationItems = document.querySelectorAll(".pagination .page-item"); // 获取分页按钮元素
    paginationItems.forEach(item => {
      item.classList.remove("active"); // 移除所有按钮的 active 类
    });
    paginationItems[pageNumber].classList.add("active"); // 当前页按钮添加 active 类

    togglePrevNextButtons(pageNumber); // 切换前一页和后一页按钮状态
  }

  function togglePrevNextButtons(currentPage) {
    var prevPage = document.getElementById("prevPage"); // 获取前一页按钮
    var nextPage = document.getElementById("nextPage"); // 获取后一页按钮

    prevPage.classList.toggle("disabled", currentPage === 1); // 如果当前页为第一页,则禁用前一页按钮
    nextPage.classList.toggle("disabled", currentPage === numberOfPages || numberOfPages === 0); // 如果当前页为最后一页(或没有数据),则禁用后一页按钮
  }

  function changePage(step) {
    var currentPage = document.querySelector(".pagination .active a").textContent; // 获取当前页码
    currentPage = parseInt(currentPage, 10) + step; // 转换为数字并添加页面移动步长

    currentPage = Math.max(1, Math.min(numberOfPages, currentPage)); // 确保当前页在有效范围内

    displayData(currentPage); // 显示指定页的数据
  }

  function filterTable(select) {
    var filterValue = select.value; // 获取筛选条件

    var table = document.querySelector(".table"); // 获取表格
    var tr = table.getElementsByTagName("tr"); // 获取所有行
    var quan = 0; // 初始化符合筛选条件的行数

    for (var i = 1; i < tr.length; i++) {
      var td = tr[i].getElementsByTagName("th")[3]; // 获取状态列
      if (td) {
        var statusValue = td.getAttribute("data-status"); // 获取状态值
        if (filterValue === "all" || statusValue == filterValue) {
          tr[i].style.display = ""; // 显示行
          tr[i].classList.add("displayed"); // 添加"displayed"类以标记可见行
          quan++;
        } else {
          tr[i].style.display = "none"; // 隐藏行
          tr[i].classList.remove("displayed"); // 移除"displayed"类以标记隐藏行
        }
      }
    }


    filteredRowCount = quan; // 更新筛选后的行数
    updatePagination(); // 更新分页
    var statusSelect = document.getElementById("statusSelect");
    statusSelect.classList.add("selected");
    select.classList.add("selected"); // 添加选中样式

  }


  // 窗口加载完成后,进行筛选和分页

  window.onload = function () {

    var displayedRows = document.querySelectorAll(".table tbody tr"); // 获取初始时的所有行
    filteredRowCount = displayedRows.length; // 设置初始筛选后的行数为所有行数

    updatePagination(); // 更新分页

  };
</script>
<script>
     // region订单数量栏的升降序排列
    function sortTable(select, n) {
        var table, rows, switching, i, x, y, shouldSwitch;
        var dir = select.value; // 取得选中的排序方式
        table = document.querySelector(".table");
        switching = true;
        // 无需再确定排序的方向,因为已由下拉框提供
        while (switching) {
            switching = false;
            rows = table.rows;
            for (i = 1; i < (rows.length - 1); i++) {
                shouldSwitch = false;
                x = rows[i].getElementsByTagName("TH")[n];
                y = rows[i + 1].getElementsByTagName("TH")[n];
                if (dir == "asc") {
                    if (parseInt(x.innerHTML) > parseInt(y.innerHTML)) {
                        shouldSwitch = true;
                        break;
                    }
                } else if (dir == "desc") {
                    if (parseInt(x.innerHTML) < parseInt(y.innerHTML)) {
                        shouldSwitch = true;
                        break;
                    }
                }
            }
            if (shouldSwitch) {
                rows[i].parentNode.insertBefore(rows[i + 1], rows[i]);
                switching = true;
            }
        }
    //激活'订单数量'栏就变色
    var orderQtySelect = document.getElementById("orderQtySelect");
    orderQtySelect.classList.add("selected");
    select.classList.add("selected"); // 添加选中样式


        // 重置其他选择框为无序状态
    var createTimeSelect = document.getElementById("createTimeSelect");
    createTimeSelect.value = "N"; // 设置为"- - -"选项
    createTimeSelect.classList.remove("selected");

    }
    //endregion

         // region   创建时间 栏上的 升降序排列
    function convertDateTime(dateTimeStr) {
        // 将日期时间字符串分割成日期和时间
        var parts = dateTimeStr.split(' ');
        var dateParts = parts[0].split('-');
        var timeParts = parts[1].split(':');

        // 构建一个新的日期对象
        return new Date(dateParts[0], dateParts[1] - 1, dateParts[2], timeParts[0], timeParts[1], timeParts[2]);
    }

    function sortTableByDate(select, columnIndex) {
        var table = select.parentNode.parentNode.parentNode.parentNode;
        var tbody = table.tBodies[0];
        var rows = Array.from(tbody.rows);

        // 根据选择框来决定排序方式(升序或降序)
        var sortOrder = select.value;

        // 实际的排序逻辑
        rows.sort(function(a, b) {
            // 对于每一行,提取并转换日期时间字符串,然后使用日期比较
            var dateA = convertDateTime(a.cells[columnIndex].textContent.trim());
            var dateB = convertDateTime(b.cells[columnIndex].textContent.trim());

            // 根据排序顺序返回比较结果
            return sortOrder === 'asc' ? dateA - dateB : dateB - dateA;
        });

        // 将排序过的行重新添加到tbody中
        rows.forEach(function(row) {
            tbody.appendChild(row);
        });
        // 激活'时间'栏就变色
        var createTimeSelect = document.getElementById("createTimeSelect");
    createTimeSelect.classList.add("selected");
    select.classList.add("selected"); // 添加选中样式
        // 重置其他选择框为无序状态
    var orderQtySelect = document.getElementById("orderQtySelect");
    orderQtySelect.value = "N"; // 设置为"- - -"选项
    orderQtySelect.classList.remove("selected");



    }
    //endregion



</script>



{% endblock %}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1217965.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​

软考-高级-系统架构设计师教程&#xff08;清华第2版&#xff09;【第9章 软件可靠性基础知识&#xff08;P320~344&#xff09;-思维导图】 课本里章节里所有蓝色字体的思维导图

什么是美国服务器,有哪些优势,适用于什么场景?

​  在互联网发展的过程中&#xff0c;服务器扮演着至关重要的角色。而美国作为全球信息技术的中心&#xff0c;其服务器在全球范围内受到广泛关注。  美国服务器是指在美国本土机房搭建并运行的服务器。其拥有带宽大、优质硬件、售后运维好、位置优越、数据安全性高以及免备…

C/C++输出整数部分 2021年12月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C输出整数部分 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C输出整数部分 2021年12月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 输入一个双精度浮点数f&#xff0c; 输出其整…

MapApp 地图应用

1. 简述 1.1 重点 1&#xff09;更好地理解 MVVM 架构 2&#xff09;更轻松地使用 SwiftUI 框架、对齐、动画和转换 1.2 资源下载地址: Swiftful-Thinking:https://www.swiftful-thinking.com/downloads 1.3 项目结构图: 1.4 图片、颜色资源文件图: 1.5 启动图片配置图: 2. Mo…

腾讯云服务器多少钱一年?腾讯云服务器88元一年,附优惠购买入口

腾讯云服务器可以以低至88元一年的价格购买&#xff01;这个价格可以说是非常实惠。现在&#xff0c;让我们一起来了解腾讯云服务器的价格以及如何购买优惠的服务器。 如何购买88元一年的腾讯云服务器&#xff1f; 购买腾讯云服务器非常简单&#xff0c;只需按照以下步骤&…

SpringBoot实现IP地址归属地查询

SpringBoot实现IP地址归属地查询 功能特性 标准化的数据格式 每个 IP 数据段的 region 信息都固定了格式&#xff1a; 国家|区域|省份|城市|ISP&#xff0c;只有中国的数据绝大部分精确到了城市&#xff0c;其他国家部分数据只能定位到国家&#xff0c;后前的选项全部是 0。…

聊一聊前端面临的安全威胁与解决对策

前端是用户在使用您的网站或Web应用程序时首先体验到的东西。如果您的Web应用程序的前端受到侵害&#xff0c;它可能会影响整个布局&#xff0c;并造成糟糕的用户体验&#xff0c;可能难以恢复。集成前端安全变得越来越重要&#xff0c;本文将指导您通过可以应用于保护您的Web应…

基于SSM的教学管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

腾讯云服务器价格表查询,腾讯云服务器怎么买便宜?

你是否需要搭建一个属于自己的网站&#xff0c;但是又不知道该如何选择和购买服务器&#xff1f;腾讯云服务器价格表查询&#xff0c;让你轻松了解各款服务器的价格及配置信息&#xff0c;帮助你选择最合适的服务器。同时&#xff0c;我们还为你提供了腾讯云服务器的优惠购买入…

利用jquery对HTML中的名字进行替代

想法&#xff1a;将网页中经常要修改的名字放在一个以jquery编写的js文件中&#xff0c;如果需要修改名字&#xff0c;直接修改js文件中的名字即可。 新建name_07.html文件&#xff0c;写入下面的代码&#xff1a; <!DOCTYPE html> <html> <head><meta …

【docker启动的Jenkins时,遇到时区问题处理】

1、查看容器中的时区 [rootlocalhost jenkins]# docker exec -it jenkins cat /etc/timezone Etc/UTC而本地使用的是Asia/shanghai [rootlocalhost jenkins]# timedatectl | grep Time zoneTime zone: n/a (CST, 0800)###查看 [rootlocalhost jenkins]# cd /usr/share/zoneinf…

UnitTest + Selenium 完成在线加法器自动化测试

1. 任务概述 利用 UnitTest 与 Selenium 编写自动化用例&#xff0c;测试在线加法器中的整数单次加法功能【如123 】 人工操作流程&#xff08;测试 12 是否等于 3&#xff09;&#xff1a; 打开在线加法器点击按钮1&#xff0c;再点击按钮&#xff0c;再点击按钮2&#xff0c…

opencv(2): 视频采集和录制

视频采集 相关API VideoCapture()cap.read()&#xff1a; 返回两个值&#xff0c;第一个参数&#xff0c;如果读到frame&#xff0c;返回 True. 第二个参数为相应的图像帧。cap.release() VideoCapture cv2.VideoCapture(0) 0 表示自动检测&#xff0c;如果在笔记本上运行&…

PHP写一个电商 Api接口需要注意哪些?考虑哪些?

随着互联网的飞速发展&#xff0c;前后端分离的开发模式越来越流行。编写一个稳定、可靠和易于使用的 API 接口是现代互联网应用程序的关键。本文将介绍在使用 thinkphp6 框架开发 电商API 接口时需要注意的要点和考虑的问题&#xff0c;并提供详细的逻辑步骤和代码案例。 1. …

Dubbo协议详解

前言特点应用场景Dubbo协议示例Dubbo协议的不足拓展 前言 Dubbo协议是一种高性能、轻量级的开源RPC框架&#xff0c;主要设计目的是解决分布式系统中服务调用的一些常见问题&#xff0c;例如服务负载均衡、服务注册中心、服务的远程调用等。它支持多种语言&#xff0c;例如Jav…

人工智能基础_机器学习038_中国人寿保费预测(EDA数据探索)_导包_数据探索_---人工智能工作笔记0078

注意 EDA是Exploratory Data Analysis(探索性数据分析)的缩写,它是一种统计分析方法,旨在了解数据的基本特征,并发现数据中的规律和模式。EDA通常是数据分析流程的开始阶段,主要使用可视化工具和统计指标来描述数据的基本特征,如数据的分布、中位数、均值、方差等。通过…

pip 问题

升级pip命令&#xff1a; python -m pip install --upgrade pippip不能下载pytorch&#xff1a; 这个问题我一直没解决。不知道有哪位大佬可以留言给我。把whl文件下载到本地也没有&#xff0c;pip不会进行本地文件夹搜索。

用归并排序算法merge_sort( )求解 逆序对的数量 降低时间复杂度为 nlogn

题目简述 给定一个序列有n个数&#xff0c;求n个数中逆序对的个数&#xff0c;逆序对的定义&#xff1a;i < j && a[i] > a[j]。 输入格式 第一行包含一个整数n。 第二行包含 n 个整数&#xff08;所有整数均在1~1e9范围内&#xff09;&#xff0c;表示整数数…

基于STM32微控制器的巡线小车控制研究

## 一、引言 巡线小车是一种常见的智能车型&#xff0c;通常用于参加各类智能车比赛或者教学实验。本文将基于STM32微控制器对巡线小车进行控制研究&#xff0c;主要包括硬件设计和软件编程两个方面。通过该研究&#xff0c;将实现让巡线小车沿着指定轨迹巡线行驶&#xff0c;并…

LEEDCODE 220 存在重复元素3

class Solution { public:int getId(int a, int valuediff){// 值// return a/(valuediff1);return a < 0 ? (a ) -) / (valuediff 1) - 1 : a / (valuediff 1);}public: unordered_map<int, int> bucket;bool containsNearbyAlmostDuplicate(vector<int>&am…