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

前言:

掘弃掉与后端交互做分页和互导,有利有弊吧; 在小数据的时候,如果不停来回朝服务端发送请求,会造成堵塞.于是,放弃了之前的前后端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.rhkb.cn/news/196207.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

stm32入门建议跳过固件库去学习hal库吗?

stm32入门建议跳过固件库去学习hal库吗? 如果要以单片机作为以后的工作方向&#xff0c;建议还是深入了解一下单片机的原理与机制&#xff0c;比如串口收发的时候&#xff0c;内部的寄存器是怎么工作的&#xff0c;中断又是怎么工作的&#xff0c;然后我们又是怎么进行中断处…

uniapp优化h5项目-摇树优化,gzip压缩和删除console.log

1.摇树优化 勾选摇树优化,打包删除死代码 2.gzip压缩和删除console.log 安装插件webpack和compression-webpack-plugin webpack插件 npm install webpack4.46.0 --save-devcompression-webpack-plugin插件 npm install compression-webpack-plugin6.1.1 --save-devconst Com…

代码随想录算法训练营第25天|216.组合总和III 17.电话号码的字母组合

JAVA代码编写 216. 组合总和III 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回。 示例 1: 输入: k …

【观察】华为:数智世界“一触即达”,应对数智化转型“千变万化”

毫无疑问&#xff0c;数智化既是这个时代前进所趋&#xff0c;也是国家战略所指&#xff0c;更是所有企业未来发展进程中达成的高度共识。 但也要看到&#xff0c;由于大量新兴技术的出现&#xff0c;技术热点不停的轮转&#xff0c;加上市场环境的快速变化&#xff0c;让数智化…

数据结构--栈与队列

目录 前言 1.栈 1.1栈的概念及结构 1.2接口函数 1.3函数实现 1.4如何使用 2.队列 2.1队列的概念及结构 2.2接口函数 2.3函数实现 2.4如何使用 前言 前面我们已经学习了顺序表和链表&#xff0c;今天我们来学习栈与队列&#xff0c;这两种结构也属于线性表&#xff0c;实…

顺序表(数据结构与算法)

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

从0开始学习JavaScript--JavaScript 流程控制

JavaScript中的流程控制结构是编写结构化、可读性强的代码的关键。本文将深入研究JavaScript中的流程控制&#xff0c;包括条件语句、循环结构、跳转语句等&#xff0c;并通过丰富的示例代码来更全面地了解和运用这些概念。 条件语句 条件语句用于基于不同的条件执行不同的代…

架构开发与优化咨询和实施服务

服务概述 得益于硬件平台算力的提升&#xff0c;汽车电子电气架构的集成度逐渐提高&#xff0c;从单体ECU、到功能域集成控制器、到区域集成控制器&#xff0c;多域融合成为了目前行业中软件工程的重要工作内容。同时&#xff0c;在传统控制器C代码开发的基础上&#xff0c;C、…

C#中.NET 7.0 Windows窗体应用通过EF访问新建数据库

目录 一、 操作步骤 二、编写EF模型和数据库上下文 三、移植&#xff08;Migrations&#xff09;数据库 四、编写应用程序 五、生成效果 前文已经说过.NET Framework4.8 控制台应用通过EF访问已经建立的和新建的数据库。 前文已经说过.NET 6.0 控制台应用通过EF访问…

μC/OS-II---事件标志组管理1(os_flag.c)

目录 事件标志组创建事件标志组删除事件标志组获取/等待 当任务要与多个事件同步时&#xff0c;就要使用事件标志组。一个事件标志就是一个二值信号&#xff0c;事件标志组是若干二值信号的组合。使用事件标志组同步任务分为独立性同步和关联性同步。 事件标志组创建 flags&a…

MySql分区

一、什么是分区 MySQL分区是一种数据库设计和管理技术&#xff0c;它允许你将表分割成独立的、具有特定规则的存储单元。每个分区可以独立地进行管理&#xff0c;包括备份、恢复和优化。分区的主要目的是提高查询性能、简化维护以及实现数据的更有效管理。 以下是MySQL分区的…

IDEA 集成 Docker 插件一键部署 SpringBoot 应用

目录 前言IDEA 安装 Docker 插件配置 Docker 远程服务器编写 DockerFileSpringBoot 项目部署配置SpringBoot 项目部署结语 前言 随着容器化技术的崛起&#xff0c;Docker成为了现代软件开发的关键工具。在Java开发中&#xff0c;Spring Boot是一款备受青睐的框架&#xff0c;然…

PCL 半径滤波剔除噪点(二)

目录 一、算法原理二、注意事项三、代码实现一、算法原理 PCL半径滤波是删除在输入的点云一定范围内没有达到足够多领域的所有数据点。通俗的讲:就是以一个点p给定一个范围r,领域点要求的个数为m,r若在这个点的r范围内部的个数大于m则保留,小于m则删除。因此,使用该算法时…

阎良区公益创投之“小飞机大梦想” 航模DIY主题活动

创造是人类探索迈出的第一步&#xff0c;科学是开启奇妙世界的金钥匙。为进一步提升“未来星”对科技知识的兴趣&#xff0c;培养他们的科学创新精神&#xff0c;11月16日&#xff0c;阎良区社会组织公益创投——“未来星”助力乡村留守儿童成长计划项目在阎良区聚宝小学开展“…

【淘宝API】商品详情+搜索商品列表接口

淘宝商品详情API接口可以使用淘宝开放平台提供的SDK或API来获取。这些接口可以用于获取商品的详细信息&#xff0c;如标题、价格、描述、图片等。 以下是使用淘宝开放平台API获取商品详情的步骤&#xff1a; 注册淘宝开放平台账号&#xff0c;并创建应用&#xff0c;获取应用…

【具身智能评估1】具身视觉语言规划(EVLP)仿真环境汇总

参考论文&#xff1a;Core Challenges in Embodied Vision-Language Planning 论文作者&#xff1a;Jonathan Francis, Nariaki Kitamura, Felix Labelle, Xiaopeng Lu, Ingrid Navarro, Jean Oh 论文原文&#xff1a;https://arxiv.org/abs/2106.13948 论文出处&#xff1a;Jo…

C#学习相关系列之Linq常用方法---排序(一)

一、构建数据 public class Student_1{public int ID { get; set; }public string Name { get; set; }public int Chinese { get; set; }public int Math { get; set; }public int English { get; set; }public override string ToString(){return string.Format("ID:{0},…

企业视频数字人有哪些应用场景

来做个数字人吧&#xff0c;帮我干点活吧。 国内的一些数字人&#xff1a; 腾讯智影 腾讯智影数字人是一种基于人工智能技术的数字人物形象&#xff0c;具有逼真的外观、语音和行为表现&#xff0c;可以应用于各种场景&#xff0c;如新闻播报、文娱推介、营销、教育等。 幻…

医院数字化LIS(检验信息系统)源码

临床检验信息管理系统&#xff08;LIS&#xff09;是利用计算机连接医疗设备&#xff0c;通过计算机信息处理技术&#xff0c;将医院检验科或实验室的临床检验数据进行自动收集、存储、处理、提取、传输和交换&#xff0c;满足所有授权用户的功能需求。 一、系统概述 1.LIS&am…

性能测试【第三篇】Jmeter的使用

线程数:10 ,设置10个并发 Ramp-Up时间(秒):所有线程在多少时间内启动,如果设置5,那么每秒启动2个线程 循环次数:请求的重复次数,如果勾选"永远"将一直发送请求 持续时间时间:设置场景运行的时间 启动延迟:设置场景延迟启动时间 响应断言 响应断言模式匹配规则 包括…