Ajax获取PHP端csv转的json数据并js前端排序与分页

<?php
setlocale(LC_ALL, 'C'); //window:删除行首双斜杠if($_GET["act"]=="list"){
$csvFile = 'book.csv'; // 文件路径:制表符分隔文件
$data = [];
if (($handle = fopen($csvFile, 'r')) !== false) {$header = fgetcsv($handle,0,"\t"); // 读取表头while (($row = fgetcsv($handle,0,"\t")) !== false) {$data[] = array_combine($header, $row); // 将表头与数据组合}fclose($handle);
}
header('Content-Type: application/json');
echo json_encode($data);
exit();
}
?>
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>数据表格</title>
<style>
.container {margin: 20px;
}table {width: 100%;border-collapse: collapse;margin-bottom: 20px;
}th, td {border: 1px solid #ddd;padding: 5px;text-align: left;
}th {background-color: #f5f5f5;position: relative;padding-right: 25px;cursor: pointer;
}.sort-arrows {position: absolute;right: 5px;top: 50%;transform: translateY(-50%);display: flex;flex-direction: column;line-height: 8px;
}.arrow {font-size: 8px;color: #666;
}.arrow.active {color: red;
}.pagination {display: flex;gap: 10px;align-items: center;justify-content: center;
}button {padding: 5px 10px;cursor: pointer;
}select {padding: 5px;
}tr:nth-child(even) {background-color: #f9f9f9;
}tr:hover {background-color: #f5f5f5;
}
</style>
</head>
<body><div class="container"><table id="dataTable"><thead><tr id="headerRow"><!-- 表头将由JS动态生成 --></tr></thead><tbody id="tableBody"><!-- 数据行将由JS动态生成 --></tbody></table><div class="pagination"><button id="firstPage">首页</button><button id="prevPage">上一页</button><select id="pageSelect"></select><button id="nextPage">下一页</button><button id="lastPage">尾页</button></div></div>
<script>
class DataTable {constructor() {this.data = [];this.currentPage = 1;this.rowsPerPage = 10;this.sortColumn = null;this.sortDirection = 'asc';this.init();}init() {this.loadData();this.bindEvents();}async loadData() {try {const response = await fetch('?act=list&tt=tt');const jsonData = await response.json();this.data = jsonData;this.setupTable();this.renderTable();this.setupPagination();} catch (error) {console.error('数据加载失败:', error);}}setupTable() {if (this.data.length === 0) return;const headerRow = document.getElementById('headerRow');headerRow.innerHTML = '';// 创建表头Object.keys(this.data[0]).forEach(key => {const th = document.createElement('th');th.innerHTML = `${key}<div class="sort-arrows"><span class="arrow up" data-column="${key}">▲</span><span class="arrow down" data-column="${key}">▼</span></div>`;headerRow.appendChild(th);});}renderTable() {const tableBody = document.getElementById('tableBody');tableBody.innerHTML = '';// 排序数据let sortedData = [...this.data];if (this.sortColumn) {sortedData.sort((a, b) => {const aVal = a[this.sortColumn];const bVal = b[this.sortColumn];if (this.sortDirection === 'asc') {return aVal > bVal ? 1 : -1;} else {return aVal < bVal ? 1 : -1;}});}// 分页const start = (this.currentPage - 1) * this.rowsPerPage;const paginatedData = sortedData.slice(start, start + this.rowsPerPage);// 渲染数据行paginatedData.forEach(row => {const tr = document.createElement('tr');Object.values(row).forEach(value => {const td = document.createElement('td');td.textContent = value;tr.appendChild(td);});tableBody.appendChild(tr);});}setupPagination() {const totalPages = Math.ceil(this.data.length / this.rowsPerPage);const pageSelect = document.getElementById('pageSelect');pageSelect.innerHTML = '';for (let i = 1; i <= totalPages; i++) {const option = document.createElement('option');option.value = i;option.textContent = `第${i}页`;pageSelect.appendChild(option);}}bindEvents() {// 排序事件document.getElementById('headerRow').addEventListener('click', (e) => {const arrow = e.target.closest('.arrow');if (!arrow) return;const column = arrow.dataset.column;const isUp = arrow.classList.contains('up');// 重置所有箭头样式document.querySelectorAll('.arrow').forEach(a => a.classList.remove('active'));// 设置当前箭头样式arrow.classList.add('active');this.sortColumn = column;this.sortDirection = isUp ? 'asc' : 'desc';this.renderTable();});// 分页事件document.getElementById('firstPage').addEventListener('click', () => {this.currentPage = 1;this.renderTable();});document.getElementById('prevPage').addEventListener('click', () => {if (this.currentPage > 1) {this.currentPage--;this.renderTable();}});document.getElementById('pageSelect').addEventListener('change', (e) => {this.currentPage = parseInt(e.target.value);this.renderTable();});document.getElementById('nextPage').addEventListener('click', () => {const totalPages = Math.ceil(this.data.length / this.rowsPerPage);if (this.currentPage < totalPages) {this.currentPage++;this.renderTable();}});document.getElementById('lastPage').addEventListener('click', () => {this.currentPage = Math.ceil(this.data.length / this.rowsPerPage);this.renderTable();});}
}// 初始化表格
document.addEventListener('DOMContentLoaded', () => {new DataTable();
});
</script>
</body>
</html>

 数据示范:制表符分隔的,可以直接excel复制粘贴

姓名	学号	身份证号	科目1	科目2	科目3	科目4	科目5	科目.	科目N
李一	10001001	90001001	87	84	75	91	83	76	87
李二	10001002	90001002	95	81	81	71	60	82	99
李三	10001003	90001003	68	80	65	79	68	71	91
李四	10001004	90001004	82	80	75	90	87	64	81
李五	10001005	90001005	60	64	61	71	73	85	61

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

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

相关文章

基于树莓派的边缘端 AI 目标检测、目标跟踪、姿态估计 视频分析推理 加速方案:Hailo with ultralytics YOLOv8 YOLOv11

文件大纲 加速原理硬件安装软件安装基本设置系统升级docker 方案Demo 测试目标检测姿态估计视频分析参考文献前序树莓派文章hailo加速原理 Hailo 发布的 Raspberry Pi AI kit 加速原理,有几篇文章介绍的不错 https://ubuntu.com/blog/hackers-guide-to-the-raspberry-pi-ai-ki…

PETR/PETRv2/StreamPETR论文阅读

1. PETR PETR网络结构如下&#xff0c;主要包括image-backbone&#xff0c;3D Coordinates Generator&#xff0c;3D Position Encoder&#xff0c;transformer Decoder四个模块。 把N 个视角的图像输入到骨干网络中以提取 2D 多视图特征。在 3D 坐标生成器中&#xff0c;首先…

EHOME视频平台EasyCVR多品牌摄像机视频平台监控视频编码H.265与Smart 265的区别?

在视频监控领域&#xff0c;技术的不断进步推动着行业向更高效、更智能的方向发展。特别是在编码技术方面&#xff0c;Smart 265作为一种新型的视频编码技术&#xff0c;相较于传统的H.265&#xff0c;有明显优势。这种技术的优势在EasyCVR视频监控汇聚管理平台中得到了充分的体…

《基于深度学习的车辆行驶三维环境双目感知方法研究》

复原论文思路&#xff1a; 《基于深度学习的车辆行驶三维环境双目感知方法研究》 1、双目测距的原理 按照上述公式算的话&#xff0c;求d的话&#xff0c;只和xl-xr有关系&#xff0c;这样一来&#xff0c;是不是只要两张图像上一个测试点的像素位置确定&#xff0c;对应的深…

新手小白学习docker第八弹------实现MySQL主从复制搭建

目录 0 引言1 实操1.1 新建主服务器容器1.2 书写配置文件1.3 重启master实例1.4 进入mysql-master容器master容器实例内创建数据同步用户 1.5 新建从服务器容器1.6 书写配置文件1.7 重启slave实例1.8 查看主从同步状态1.9 进入mysql-slave容器1.9.1 配置主从复制1.9.2 查看主从…

微信小程序之路由跳转传数据及接收

跳转并传id或者对象 1.home/index.wxml <!--点击goto方法 将spu_id传过去--> <view class"item" bind:tap"goto" data-id"{{item.spu_id}}"> 结果: 2.home/index.js goto(event){// 路由跳转页面,并把id传传过去//获取商品idlet i…

前海华海金融创新中心的工地餐点探寻

​前海的工地餐大部分都是13元一份的哈。我在前海华海金融创新中心的工地餐点吃过一份猪杂饭&#xff0c;现做13元一份。我一般打包后回公司吃或直接桂湾公园找个环境优美的地方吃饭。 ​我点的这份猪杂汤粉主要是瘦肉、猪肝、肉饼片、豆芽和生菜&#xff0c;老板依旧贴心问需要…

reduce-scatter:适合分布式计算;Reduce、LayerNorm和Broadcast算子的执行顺序对计算结果的影响,以及它们对资源消耗的影响

目录 Gather Scatter Reduce reduce-scatter:适合分布式计算 Reduce、LayerNorm和Broadcast算子的执行顺序对计算结果的影响,以及它们对资源消耗的影响 计算结果理论正确性 资源消耗方面 Gather 这个也很好理解,就是把多个进程的数据拼凑在一起。 Scatter 不同于Br…

移门缓冲支架:减少噪音,提升生活质量

移门缓冲支架不仅是一个简单的五金配件&#xff0c;更是提升家居生活质量的有效工具。通过减少门关闭时的噪音&#xff0c;移门缓冲支架能够创造一个安静、舒适的生活环境。以下是移门缓冲支架在减少噪音、提升生活质量方面的详细解析&#xff1a; 1. 显著降低关门噪音问题&…

模型运行速度笔记: s/epoch VS s/iter

1 概念介绍 在模型训练中&#xff1a; s/epoch 表示每个epoch所需的秒数&#xff0c;即完成一轮完整数据集训练的时间。s/iter 表示每个iteration&#xff08;迭代&#xff09;所需的秒数&#xff0c;即处理一个batch的时间。 它们的关系是&#xff1a; 2 举例 比如我tra…

JavaWeb笔记整理——Spring Task、WebSocket

目录 SpringTask ​cron表达式 WebSocket SpringTask cron表达式 WebSocket

PET-文件包含-FINISHED

include发生错误报warning&#xff0c;继续执行。require发生错误直接error&#xff0c;不继续执行 无视扩展名&#xff0c;只要能解析&#xff0c;就能当可执行文件执行&#xff0c;哪怕文件后缀或没后缀 1 条件竞争 pass17 只需要知道tmp的路径。把xieshell.jpg上传&…

rust逆向初探

rust 逆向葵花宝典 rust逆向技巧 rust逆向三板斧&#xff1a; [!NOTE] 快速定位关键函数 (真正的main函数)&#xff1a;观察输出、输入&#xff0c;字符串搜索&#xff0c;断点等方法。定位关键 加密区 &#xff1a;根据输入的flag&#xff0c;打硬件断点&#xff0c;快速捕获…

vue项目npm run serve出现【- Network: unavailable】(从排查到放弃)

1. 问题现象 环境&#xff1a; 系统&#xff1a;win11node&#xff1a;v16.20.2“vue”: “2.6.10” 执行npm run serve启动vue项目&#xff0c;期望&#xff1a; App running at:- Local: http://localhost:9528/ - Network: http://x.x.x.x:9528/实际&#xff1a; App runn…

项目技术栈-解决方案-web3去中心化

web3去中心化 Web3 DApp区块链:钱包:智能合约:UI:ETH系开发技能树DeFi应用 去中心化金融P2P 去中心化网络参考Web3 DApp 区块链: 以以太坊(Ethereum)为主流,也包括Solana、Aptos等其他非EVM链。 区块链本身是软件,需要运行在一系列节点上,这些节点组成P2P网络或者半…

贝叶斯网络——基于概率的图模型(详解)

贝叶斯网络&#xff08;Bayesian Network&#xff0c;简称BN&#xff09;是一种基于概率图模型的表示方法&#xff0c;用于表示变量之间的依赖关系&#xff0c;并通过条件概率推断变量间的关系。它通过有向无环图&#xff08;DAG&#xff09;来描述变量之间的依赖关系&#xff…

组件间通信(组件间传递数据)

组件间通信(组件间传递数据) 在 Vue.js 中&#xff0c;组件间通信是开发者需要经常处理的任务&#xff0c;特别是在构建具有多层次组件的复杂应用时。根据组件之间的关系和数据流的复杂程度&#xff0c;可以采用不同的通信方式。以下是常用的几种组件间通信方式&#xff1a; …

使用Element UI实现前端分页,及el-table表格跨页选择数据,切换分页保留分页数据,限制多选数量

文章目录 一、前端分页1、模板部分 (\<template>)2、数据部分 (data)3、计算属性 (computed)4、方法 (methods) 二、跨页选择1、模板部分 (\<template>)2、数据部分 (data)3、方法 (methods) 三、限制数量1、模板部分 (\<template>)2、数据部分 (data)3、方法…

GitLab 如何跨版本升级?

本分分享 GitLab 跨版本升级的一些注意事项。 众所周知&#xff0c;GitLab 的升级必须要严格遵循升级路径&#xff0c;否则就会出现问题&#xff0c;导致升级失败。因此&#xff0c;在 GitLab 升级之前需要做好两件事情&#xff1a; 当前版本的确认升级路径的确认 极狐GitLa…

网上商城系统设计与Spring Boot框架

3 系统分析 当用户确定开发一款程序时&#xff0c;是需要遵循下面的顺序进行工作&#xff0c;概括为&#xff1a;系统分析–>系统设计–>系统开发–>系统测试&#xff0c;无论这个过程是否有变更或者迭代&#xff0c;都是按照这样的顺序开展工作的。系统分析就是分析系…