|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
引言
jQuery EasyUI是一套基于jQuery的用户界面插件集合,它为Web开发者提供了丰富的UI组件,其中数据网格(DataGrid)是最常用且功能最强大的组件之一。数据网格不仅能够展示大量数据,还提供了排序、分页、编辑等多种交互功能。排序作为数据网格的核心功能之一,能够帮助用户快速找到所需信息,提升数据浏览和分析的效率。本文将全面解析jQuery EasyUI数据网格排序功能的实现方法,从基础应用到高级技巧,并针对常见问题提供解决方案,助力开发者轻松掌握表格排序功能。
jQuery EasyUI数据网格基础
数据网格简介
jQuery EasyUI的数据网格(DataGrid)组件是一个用于显示表格格式数据的强大工具,它基于HTML表格构建,通过jQuery和EasyUI框架增强了其功能。数据网格可以从多种数据源加载数据,包括本地数据、远程URL等,并提供了丰富的功能,如列排序、分页、选择、编辑等。
基本配置和初始化
要使用jQuery EasyUI的数据网格,首先需要引入必要的CSS和JavaScript文件:
- <!-- 引入jQuery -->
- <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
- <!-- 引入EasyUI的CSS和JS -->
- <link rel="stylesheet" type="text/css" href="https://www.jeasyui.com/easyui/themes/default/easyui.css">
- <link rel="stylesheet" type="text/css" href="https://www.jeasyui.com/easyui/themes/icon.css">
- <script src="https://www.jeasyui.com/easyui/jquery.easyui.min.js"></script>
- <script src="https://www.jeasyui.com/easyui/locale/easyui-lang-zh_CN.js"></script>
复制代码
创建一个基本的数据网格可以通过HTML标记或JavaScript代码实现。以下是使用HTML标记创建数据网格的示例:
- <table id="dg" title="用户数据" class="easyui-datagrid" style="width:700px;height:250px"
- url="get_users.php"
- toolbar="#toolbar" pagination="true"
- rownumbers="true" fitColumns="true" singleSelect="true">
- <thead>
- <tr>
- <th field="id" width="50" sortable="true">ID</th>
- <th field="name" width="50" sortable="true">姓名</th>
- <th field="age" width="50" sortable="true">年龄</th>
- <th field="gender" width="50" sortable="true">性别</th>
- <th field="email" width="50" sortable="true">邮箱</th>
- </tr>
- </thead>
- </table>
复制代码
在上面的代码中,我们通过设置sortable="true"属性来使列可排序。当用户点击列标题时,数据网格会根据该列的数据进行排序。
使用JavaScript创建数据网格的示例如下:
- $('#dg').datagrid({
- url: 'get_users.php',
- columns:[[
- {field:'id',title:'ID',width:100,sortable:true},
- {field:'name',title:'姓名',width:100,sortable:true},
- {field:'age',title:'年龄',width:100,sortable:true},
- {field:'gender',title:'性别',width:100,sortable:true},
- {field:'email',title:'邮箱',width:100,sortable:true}
- ]],
- pagination: true,
- rownumbers: true,
- fitColumns: true,
- singleSelect: true
- });
复制代码
基础排序功能实现
简单排序的实现
在jQuery EasyUI数据网格中,实现简单的排序功能非常容易。只需在列定义中设置sortable: true属性,该列就会自动支持排序功能。当用户点击列标题时,数据网格会根据该列的值进行升序或降序排序。
以下是一个简单的排序示例:
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title>EasyUI 数据网格排序示例</title>
- <link rel="stylesheet" type="text/css" href="https://www.jeasyui.com/easyui/themes/default/easyui.css">
- <link rel="stylesheet" type="text/css" href="https://www.jeasyui.com/easyui/themes/icon.css">
- <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
- <script src="https://www.jeasyui.com/easyui/jquery.easyui.min.js"></script>
- </head>
- <body>
- <table id="dg" style="width:700px;height:250px"
- data-options="singleSelect:true,collapsible:true,url:'data.json',method:'get'">
- <thead>
- <tr>
- <th data-options="field:'id',width:80,sortable:true">ID</th>
- <th data-options="field:'name',width:100,sortable:true">姓名</th>
- <th data-options="field:'age',width:80,sortable:true">年龄</th>
- <th data-options="field:'gender',width:80,sortable:true">性别</th>
- <th data-options="field:'email',width:150,sortable:true">邮箱</th>
- </tr>
- </thead>
- </table>
- <script>
- $(function(){
- // 数据网格会在页面加载完成后自动初始化
- });
- </script>
- </body>
- </html>
复制代码
在上述示例中,我们为每个列都设置了sortable:true属性,这样用户就可以通过点击列标题来对数据进行排序。默认情况下,点击列标题会在升序、降序和默认顺序之间循环切换。
多列排序
jQuery EasyUI数据网格也支持多列排序功能,允许用户按照多个列的组合进行排序。要启用多列排序,需要设置multiSort:true属性,并且用户可以通过按住Ctrl键(在Mac上是Command键)点击多个列标题来实现多列排序。
以下是多列排序的示例:
- $('#dg').datagrid({
- url: 'get_users.php',
- multiSort: true, // 启用多列排序
- columns:[[
- {field:'id',title:'ID',width:100,sortable:true},
- {field:'name',title:'姓名',width:100,sortable:true},
- {field:'age',title:'年龄',width:100,sortable:true},
- {field:'gender',title:'性别',width:100,sortable:true},
- {field:'email',title:'邮箱',width:100,sortable:true}
- ]],
- pagination: true,
- rownumbers: true,
- fitColumns: true,
- singleSelect: true
- });
复制代码
在多列排序模式下,数据网格会按照用户点击列的顺序进行排序。例如,如果用户先点击”年龄”列,然后按住Ctrl键点击”性别”列,数据会首先按年龄排序,然后在年龄相同的情况下按性别排序。
远程排序与本地排序
jQuery EasyUI数据网格支持两种排序方式:本地排序和远程排序。
本地排序是指数据已经全部加载到客户端,排序操作在浏览器中完成。默认情况下,如果数据网格的数据源是本地数据(如JavaScript数组),则会使用本地排序。
以下是本地排序的示例:
- // 本地数据
- var data = [
- {id:1,name:'张三',age:25,gender:'男',email:'zhangsan@example.com'},
- {id:2,name:'李四',age:30,gender:'女',email:'lisi@example.com'},
- {id:3,name:'王五',age:28,gender:'男',email:'wangwu@example.com'},
- {id:4,name:'赵六',age:22,gender:'女',email:'zhaoliu@example.com'},
- {id:5,name:'钱七',age:35,gender:'男',email:'qianqi@example.com'}
- ];
- $('#dg').datagrid({
- data: data, // 使用本地数据
- columns:[[
- {field:'id',title:'ID',width:100,sortable:true},
- {field:'name',title:'姓名',width:100,sortable:true},
- {field:'age',title:'年龄',width:100,sortable:true},
- {field:'gender',title:'性别',width:100,sortable:true},
- {field:'email',title:'邮箱',width:100,sortable:true}
- ]],
- pagination: true,
- rownumbers: true,
- fitColumns: true,
- singleSelect: true
- });
复制代码
远程排序是指排序操作在服务器端完成。当数据量较大时,通常使用远程排序以提高性能。要启用远程排序,需要设置remoteSort:true属性,并为数据网格指定一个URL作为数据源。
以下是远程排序的示例:
- $('#dg').datagrid({
- url: 'get_users.php', // 远程数据源
- remoteSort: true, // 启用远程排序
- columns:[[
- {field:'id',title:'ID',width:100,sortable:true},
- {field:'name',title:'姓名',width:100,sortable:true},
- {field:'age',title:'年龄',width:100,sortable:true},
- {field:'gender',title:'性别',width:100,sortable:true},
- {field:'email',title:'邮箱',width:100,sortable:true}
- ]],
- pagination: true,
- rownumbers: true,
- fitColumns: true,
- singleSelect: true,
- // 当排序时,EasyUI会自动发送sort和order参数到服务器
- // sort: 排序字段名
- // order: 'asc' 或 'desc'
- onSortColumn: function(sort, order){
- // 可以在这里添加自定义的排序逻辑
- $(this).datagrid('reload'); // 重新加载数据
- }
- });
复制代码
在服务器端,需要接收并处理排序参数。以下是PHP服务器端处理排序的示例:
- <?php
- // 连接数据库
- $conn = mysqli_connect('localhost', 'username', 'password', 'database');
- if (!$conn) {
- die('连接失败: ' . mysqli_error($conn));
- }
- // 获取排序参数
- $sort = isset($_POST['sort']) ? $_POST['sort'] : 'id';
- $order = isset($_POST['order']) ? $_POST['order'] : 'asc';
- // 获取分页参数
- $page = isset($_POST['page']) ? intval($_POST['page']) : 1;
- $rows = isset($_POST['rows']) ? intval($_POST['rows']) : 10;
- $offset = ($page - 1) * $rows;
- // 构建SQL查询
- $sql = "SELECT * FROM users ORDER BY $sort $order LIMIT $offset, $rows";
- $result = mysqli_query($conn, $sql);
- // 获取总记录数
- $countSql = "SELECT COUNT(*) FROM users";
- $countResult = mysqli_query($conn, $countSql);
- $countRow = mysqli_fetch_row($countResult);
- $total = $countRow[0];
- // 构建返回数据
- $users = array();
- while ($row = mysqli_fetch_assoc($result)) {
- array_push($users, $row);
- }
- // 返回JSON格式数据
- echo json_encode(array(
- 'total' => $total,
- 'rows' => $users
- ));
- // 关闭数据库连接
- mysqli_close($conn);
- ?>
复制代码
高级排序技巧
自定义排序规则
有时,默认的排序规则可能无法满足特殊需求,例如对中文按照拼音排序、对日期格式进行特殊排序等。jQuery EasyUI数据网格允许我们通过自定义排序函数来实现这些特殊需求。
以下是一个自定义排序规则的示例,实现对中文姓名按照拼音排序:
- // 自定义排序函数
- function customSort(a, b) {
- // 这里可以使用第三方库如pinyin.js将中文转换为拼音
- // 假设我们已经有一个convertToPinyin函数
- var pinyinA = convertToPinyin(a.name);
- var pinyinB = convertToPinyin(b.name);
-
- if (pinyinA < pinyinB) {
- return -1;
- } else if (pinyinA > pinyinB) {
- return 1;
- } else {
- return 0;
- }
- }
- $('#dg').datagrid({
- url: 'get_users.php',
- columns:[[
- {field:'id',title:'ID',width:100,sortable:true},
- {field:'name',title:'姓名',width:100,sortable:true,sorter:customSort},
- {field:'age',title:'年龄',width:100,sortable:true},
- {field:'gender',title:'性别',width:100,sortable:true},
- {field:'email',title:'邮箱',width:100,sortable:true}
- ]],
- pagination: true,
- rownumbers: true,
- fitColumns: true,
- singleSelect: true
- });
复制代码
在上面的示例中,我们为”name”列指定了一个自定义的排序函数customSort,该函数会将中文姓名转换为拼音进行比较,从而实现按拼音排序的效果。
排序事件处理
jQuery EasyUI数据网格提供了多个与排序相关的事件,开发者可以通过监听这些事件来执行自定义操作。常用的排序事件包括:
• onSortColumn: 当用户对列进行排序时触发
• onBeforeSortColumn: 在列排序前触发,可以在此事件中取消排序操作
以下是一个使用排序事件的示例:
- $('#dg').datagrid({
- url: 'get_users.php',
- columns:[[
- {field:'id',title:'ID',width:100,sortable:true},
- {field:'name',title:'姓名',width:100,sortable:true},
- {field:'age',title:'年龄',width:100,sortable:true},
- {field:'gender',title:'性别',width:100,sortable:true},
- {field:'email',title:'邮箱',width:100,sortable:true}
- ]],
- pagination: true,
- rownumbers: true,
- fitColumns: true,
- singleSelect: true,
- // 在排序前触发
- onBeforeSortColumn: function(sort, order) {
- // 可以在这里添加条件判断
- // 如果返回false,则取消排序操作
- console.log('准备对列 "' + sort + '" 进行排序,排序方式: ' + order);
- return true; // 返回true继续排序
- },
- // 在排序后触发
- onSortColumn: function(sort, order) {
- console.log('已对列 "' + sort + '" 完成排序,排序方式: ' + order);
- // 可以在这里添加自定义操作,如更新其他UI元素
- $('#sortInfo').text('当前排序: ' + sort + ' (' + order + ')');
- }
- });
复制代码
动态列排序
在某些场景下,我们可能需要动态地改变列的排序属性,例如根据用户权限或系统设置来决定哪些列可以排序。jQuery EasyUI数据网格提供了方法来实现这种需求。
以下是一个动态列排序的示例:
- // 初始化数据网格
- $('#dg').datagrid({
- url: 'get_users.php',
- columns:[[
- {field:'id',title:'ID',width:100,sortable:false}, // 初始设置为不可排序
- {field:'name',title:'姓名',width:100,sortable:false},
- {field:'age',title:'年龄',width:100,sortable:false},
- {field:'gender',title:'性别',width:100,sortable:false},
- {field:'email',title:'邮箱',width:100,sortable:false}
- ]],
- pagination: true,
- rownumbers: true,
- fitColumns: true,
- singleSelect: true
- });
- // 根据用户权限动态启用列排序
- function enableColumnSortByPermission() {
- // 假设我们有一个检查用户权限的函数
- var userPermissions = getUserPermissions();
-
- // 如果用户有排序权限,则启用某些列的排序功能
- if (userPermissions.canSort) {
- var columns = $('#dg').datagrid('options').columns[0];
-
- // 启用特定列的排序功能
- for (var i = 0; i < columns.length; i++) {
- if (columns[i].field === 'name' || columns[i].field === 'age') {
- columns[i].sortable = true;
- }
- }
-
- // 重新渲染数据网格
- $('#dg').datagrid();
- }
- }
- // 页面加载完成后检查权限
- $(function(){
- enableColumnSortByPermission();
- });
复制代码
排序状态保存与恢复
在许多应用场景中,我们希望保存用户的排序状态,以便在用户下次访问页面时能够恢复之前的排序设置。jQuery EasyUI数据网格没有内置的排序状态保存功能,但我们可以通过一些方法来实现这一需求。
以下是一个排序状态保存与恢复的示例:
- // 初始化数据网格
- $('#dg').datagrid({
- url: 'get_users.php',
- columns:[[
- {field:'id',title:'ID',width:100,sortable:true},
- {field:'name',title:'姓名',width:100,sortable:true},
- {field:'age',title:'年龄',width:100,sortable:true},
- {field:'gender',title:'性别',width:100,sortable:true},
- {field:'email',title:'邮箱',width:100,sortable:true}
- ]],
- pagination: true,
- rownumbers: true,
- fitColumns: true,
- singleSelect: true,
- // 在排序后触发,保存排序状态
- onSortColumn: function(sort, order) {
- // 将排序状态保存到localStorage
- var sortState = {
- sort: sort,
- order: order
- };
- localStorage.setItem('datagridSortState', JSON.stringify(sortState));
- }
- });
- // 恢复排序状态
- function restoreSortState() {
- // 从localStorage获取保存的排序状态
- var savedState = localStorage.getItem('datagridSortState');
-
- if (savedState) {
- var sortState = JSON.parse(savedState);
-
- // 应用保存的排序状态
- $('#dg').datagrid('options').sortName = sortState.sort;
- $('#dg').datagrid('options').sortOrder = sortState.order;
-
- // 重新加载数据
- $('#dg').datagrid('reload');
- }
- }
- // 页面加载完成后恢复排序状态
- $(function(){
- restoreSortState();
- });
复制代码
在上面的示例中,我们使用了浏览器的localStorage来保存和恢复排序状态。当用户对列进行排序时,我们会将排序信息(排序字段和排序方式)保存到localStorage中。当页面再次加载时,我们会从localStorage中读取保存的排序信息,并应用到数据网格上。
常见问题与解决方案
排序不生效问题
在使用jQuery EasyUI数据网格排序功能时,有时会遇到排序不生效的问题。以下是可能导致排序不生效的原因及解决方案:
问题描述:点击列标题时,没有任何排序反应。
原因分析:最常见的原因是列没有设置为可排序。
解决方案:确保在列定义中设置了sortable: true属性。
- // 错误示例
- columns:[[
- {field:'name',title:'姓名',width:100}, // 缺少sortable属性
- ]]
- // 正确示例
- columns:[[
- {field:'name',title:'姓名',width:100,sortable:true}, // 添加sortable属性
- ]]
复制代码
问题描述:使用远程排序时,点击列标题后数据没有按照预期排序。
原因分析:服务器端没有正确处理排序参数,或者没有返回排序后的数据。
解决方案:确保服务器端正确接收并处理排序参数。
- // 前端代码
- $('#dg').datagrid({
- url: 'get_users.php',
- remoteSort: true,
- columns:[[
- {field:'name',title:'姓名',width:100,sortable:true},
- // 其他列...
- ]]
- });
- // PHP服务器端代码
- <?php
- $sort = isset($_POST['sort']) ? $_POST['sort'] : 'id'; // 获取排序字段
- $order = isset($_POST['order']) ? $_POST['order'] : 'asc'; // 获取排序方式
- // 构建SQL查询时使用排序参数
- $sql = "SELECT * FROM users ORDER BY $sort $order";
- // 执行查询并返回结果...
- ?>
复制代码
问题描述:数值型或日期型数据排序结果不正确。
原因分析:默认情况下,EasyUI将所有数据视为字符串进行排序,导致数值或日期排序不正确。
解决方案:为数值型或日期型列指定自定义排序函数。
- // 数值型排序函数
- function numberSort(a, b) {
- a = parseFloat(a);
- b = parseFloat(b);
- return a - b;
- }
- // 日期型排序函数
- function dateSort(a, b) {
- a = new Date(a);
- b = new Date(b);
- return a - b;
- }
- $('#dg').datagrid({
- columns:[[
- {field:'price',title:'价格',width:100,sortable:true,sorter:numberSort},
- {field:'date',title:'日期',width:100,sortable:true,sorter:dateSort},
- // 其他列...
- ]]
- });
复制代码
问题描述:列标题上没有显示排序图标。
原因分析:可能是CSS文件未正确加载,或者被其他样式覆盖。
解决方案:确保正确加载了EasyUI的CSS文件,并检查是否有其他样式覆盖。
- <!-- 确保正确引入CSS文件 -->
- <link rel="stylesheet" type="text/css" href="https://www.jeasyui.com/easyui/themes/default/easyui.css">
- <link rel="stylesheet" type="text/css" href="https://www.jeasyui.com/easyui/themes/icon.css">
复制代码
性能优化
当处理大量数据时,排序操作可能会导致性能问题。以下是一些优化数据网格排序性能的方法:
对于大量数据,建议使用远程排序,将排序操作放在服务器端执行。
- $('#dg').datagrid({
- url: 'get_users.php',
- remoteSort: true, // 启用远程排序
- // 其他配置...
- });
复制代码
结合分页功能,减少每次排序的数据量。
- $('#dg').datagrid({
- url: 'get_users.php',
- pagination: true, // 启用分页
- pageSize: 20, // 设置合理的每页记录数
- // 其他配置...
- });
复制代码
如果使用自定义排序函数,确保函数的效率尽可能高。
- // 低效的排序函数示例
- function inefficientSort(a, b) {
- // 每次排序都进行复杂的计算
- var valueA = complexCalculation(a.value);
- var valueB = complexCalculation(b.value);
- return valueA - valueB;
- }
- // 高效的排序函数示例
- function efficientSort(a, b) {
- // 直接比较数值
- return a.value - b.value;
- }
复制代码
对于极大量数据,可以考虑使用虚拟滚动技术,只渲染可见区域的数据。
- $('#dg').datagrid({
- url: 'get_users.php',
- scrollbarSize: 18,
- // 其他配置...
- });
复制代码
兼容性问题
jQuery EasyUI数据网格在不同浏览器中可能会有兼容性问题,特别是在排序功能方面。以下是一些常见的兼容性问题及解决方案:
问题描述:在Internet Explorer等旧版浏览器中,排序功能可能不正常。
解决方案:添加必要的polyfill或降级处理。
- <!--[if lt IE 9]>
- <script src="https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.5.9/es5-shim.min.js"></script>
- <script src="https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.5.9/es5-sham.min.js"></script>
- <![endif]-->
复制代码
问题描述:当页面同时使用多个JavaScript库时,可能会发生冲突,导致排序功能不正常。
解决方案:使用jQuery的noConflict方法,避免冲突。
- // 将jQuery的控制权让渡给其他库
- var $j = jQuery.noConflict();
- // 使用$j代替$
- $j('#dg').datagrid({
- // 配置...
- });
复制代码
问题描述:在移动设备上,点击列标题可能不会触发排序操作。
解决方案:添加触摸事件支持或使用响应式设计。
- // 添加触摸事件支持
- $(document).ready(function() {
- if ('ontouchstart' in window) {
- // 移动设备处理
- $('#dg').datagrid({
- // 配置...
- onClickCell: function(index,field,value) {
- // 自定义触摸处理逻辑
- }
- });
- } else {
- // 桌面设备处理
- $('#dg').datagrid({
- // 配置...
- });
- }
- });
复制代码
数据类型识别问题
在数据网格排序中,正确识别数据类型非常重要。如果数据类型识别不正确,排序结果可能会不符合预期。以下是一些常见的数据类型识别问题及解决方案:
问题描述:数值型数据(如价格、数量等)按照字符串排序,导致”100”排在”20”前面。
解决方案:为数值型列指定自定义排序函数。
- // 数值型排序函数
- function numberSort(a, b) {
- a = parseFloat(a);
- b = parseFloat(b);
- return a - b;
- }
- $('#dg').datagrid({
- columns:[[
- {field:'price',title:'价格',width:100,sortable:true,sorter:numberSort},
- // 其他列...
- ]]
- });
复制代码
问题描述:日期型数据按照字符串排序,导致”2023-01-01”排在”2022-12-31”前面。
解决方案:为日期型列指定自定义排序函数。
- // 日期型排序函数
- function dateSort(a, b) {
- a = new Date(a);
- b = new Date(b);
- return a - b;
- }
- $('#dg').datagrid({
- columns:[[
- {field:'createDate',title:'创建日期',width:100,sortable:true,sorter:dateSort},
- // 其他列...
- ]]
- });
复制代码
问题描述:一列中包含多种数据类型(如数字和字符串),导致排序结果不正确。
解决方案:编写能够处理混合数据类型的排序函数。
- // 混合数据类型排序函数
- function mixedTypeSort(a, b) {
- // 尝试将值转换为数字
- var numA = parseFloat(a);
- var numB = parseFloat(b);
-
- // 如果两个值都是数字,则按数字排序
- if (!isNaN(numA) && !isNaN(numB)) {
- return numA - numB;
- }
-
- // 否则按字符串排序
- var strA = String(a);
- var strB = String(b);
-
- if (strA < strB) {
- return -1;
- } else if (strA > strB) {
- return 1;
- } else {
- return 0;
- }
- }
- $('#dg').datagrid({
- columns:[[
- {field:'mixedData',title:'混合数据',width:100,sortable:true,sorter:mixedTypeSort},
- // 其他列...
- ]]
- });
复制代码
实际案例分析
实际项目中的应用场景
在实际项目中,jQuery EasyUI数据网格的排序功能可以应用于多种场景,例如:
1. 电商后台管理系统:商品列表可以按照价格、销量、库存等进行排序,帮助管理员快速了解商品情况。
2. 客户关系管理系统:客户列表可以按照客户等级、最近购买时间、消费金额等进行排序,帮助销售团队识别重要客户。
3. 数据分析平台:数据报表可以按照各种指标进行排序,帮助分析师快速发现数据中的趋势和异常。
4. 内容管理系统:文章列表可以按照发布时间、浏览量、评论数等进行排序,帮助编辑人员管理内容。
电商后台管理系统:商品列表可以按照价格、销量、库存等进行排序,帮助管理员快速了解商品情况。
客户关系管理系统:客户列表可以按照客户等级、最近购买时间、消费金额等进行排序,帮助销售团队识别重要客户。
数据分析平台:数据报表可以按照各种指标进行排序,帮助分析师快速发现数据中的趋势和异常。
内容管理系统:文章列表可以按照发布时间、浏览量、评论数等进行排序,帮助编辑人员管理内容。
完整示例代码
下面是一个完整的示例,展示了如何在实际项目中应用jQuery EasyUI数据网格的排序功能:
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title>商品管理系统</title>
- <link rel="stylesheet" type="text/css" href="https://www.jeasyui.com/easyui/themes/default/easyui.css">
- <link rel="stylesheet" type="text/css" href="https://www.jeasyui.com/easyui/themes/icon.css">
- <style>
- .datagrid-header-row .datagrid-cell {
- white-space: normal;
- height: auto;
- word-wrap: break-word;
- }
- .toolbar {
- padding: 5px;
- }
- .search-item {
- display: inline-block;
- margin-right: 10px;
- }
- </style>
- </head>
- <body>
- <h2>商品管理系统</h2>
-
- <!-- 搜索工具栏 -->
- <div id="toolbar" class="toolbar">
- <div class="search-item">
- <label>商品名称:</label>
- <input id="searchName" class="easyui-textbox" style="width:120px;">
- </div>
- <div class="search-item">
- <label>商品分类:</label>
- <select id="searchCategory" class="easyui-combobox" style="width:120px;">
- <option value="">全部分类</option>
- <option value="1">电子产品</option>
- <option value="2">服装</option>
- <option value="3">食品</option>
- <option value="4">图书</option>
- </select>
- </div>
- <div class="search-item">
- <a href="#" class="easyui-linkbutton" iconCls="icon-search" onclick="doSearch()">搜索</a>
- </div>
- <div class="search-item">
- <a href="#" class="easyui-linkbutton" iconCls="icon-reload" onclick="resetSearch()">重置</a>
- </div>
- </div>
-
- <!-- 数据网格 -->
- <table id="dg" title="商品列表" class="easyui-datagrid" style="width:100%;height:500px"
- url="get_products.php"
- toolbar="#toolbar" pagination="true"
- rownumbers="true" fitColumns="true" singleSelect="true"
- remoteSort="true" multiSort="true">
- <thead>
- <tr>
- <th field="id" width="50" sortable="true">ID</th>
- <th field="name" width="150" sortable="true">商品名称</th>
- <th field="category" width="80" sortable="true" formatter="formatCategory">分类</th>
- <th field="price" width="80" sortable="true" sorter="numberSort" formatter="formatPrice">价格</th>
- <th field="stock" width="80" sortable="true" sorter="numberSort">库存</th>
- <th field="sales" width="80" sortable="true" sorter="numberSort">销量</th>
- <th field="rating" width="80" sortable="true" sorter="numberSort" formatter="formatRating">评分</th>
- <th field="createTime" width="120" sortable="true" sorter="dateSort">创建时间</th>
- <th field="status" width="80" sortable="true" formatter="formatStatus">状态</th>
- </tr>
- </thead>
- </table>
-
- <!-- 排序信息显示 -->
- <div id="sortInfo" style="margin-top: 10px;"></div>
-
- <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
- <script src="https://www.jeasyui.com/easyui/jquery.easyui.min.js"></script>
- <script src="https://www.jeasyui.com/easyui/locale/easyui-lang-zh_CN.js"></script>
- <script>
- $(function(){
- // 页面加载完成后初始化
-
- // 从localStorage恢复排序状态
- restoreSortState();
- });
-
- // 数值型排序函数
- function numberSort(a, b) {
- a = parseFloat(a);
- b = parseFloat(b);
- return a - b;
- }
-
- // 日期型排序函数
- function dateSort(a, b) {
- a = new Date(a);
- b = new Date(b);
- return a - b;
- }
-
- // 格式化分类显示
- function formatCategory(value, row, index) {
- var categories = {
- '1': '电子产品',
- '2': '服装',
- '3': '食品',
- '4': '图书'
- };
- return categories[value] || value;
- }
-
- // 格式化价格显示
- function formatPrice(value, row, index) {
- return '¥' + parseFloat(value).toFixed(2);
- }
-
- // 格式化评分显示
- function formatRating(value, row, index) {
- var rating = parseFloat(value);
- var stars = '';
- for (var i = 1; i <= 5; i++) {
- if (i <= rating) {
- stars += '★';
- } else {
- stars += '☆';
- }
- }
- return stars + ' (' + rating + ')';
- }
-
- // 格式化状态显示
- function formatStatus(value, row, index) {
- if (value == '1') {
- return '<span style="color:green;">上架</span>';
- } else if (value == '0') {
- return '<span style="color:red;">下架</span>';
- } else {
- return value;
- }
- }
-
- // 搜索功能
- function doSearch() {
- $('#dg').datagrid('load', {
- name: $('#searchName').val(),
- category: $('#searchCategory').combobox('getValue')
- });
- }
-
- // 重置搜索
- function resetSearch() {
- $('#searchName').textbox('setValue', '');
- $('#searchCategory').combobox('setValue', '');
- $('#dg').datagrid('load', {});
- }
-
- // 保存排序状态到localStorage
- function saveSortState(sort, order) {
- var sortState = {
- sort: sort,
- order: order
- };
- localStorage.setItem('datagridSortState', JSON.stringify(sortState));
- }
-
- // 从localStorage恢复排序状态
- function restoreSortState() {
- var savedState = localStorage.getItem('datagridSortState');
-
- if (savedState) {
- var sortState = JSON.parse(savedState);
-
- // 应用保存的排序状态
- var dg = $('#dg');
- var opts = dg.datagrid('options');
-
- // 设置排序参数
- opts.sortName = sortState.sort;
- opts.sortOrder = sortState.order;
-
- // 更新排序信息显示
- updateSortInfo(sortState.sort, sortState.order);
-
- // 重新加载数据
- dg.datagrid('reload');
- }
- }
-
- // 更新排序信息显示
- function updateSortInfo(sort, order) {
- var columnTitle = '';
- var columns = $('#dg').datagrid('options').columns[0];
-
- // 查找排序列的标题
- for (var i = 0; i < columns.length; i++) {
- if (columns[i].field === sort) {
- columnTitle = columns[i].title;
- break;
- }
- }
-
- // 显示排序信息
- $('#sortInfo').text('当前排序: ' + columnTitle + ' (' + (order === 'asc' ? '升序' : '降序') + ')');
- }
-
- // 数据网格初始化配置
- $(document).ready(function() {
- $('#dg').datagrid({
- // 在排序前触发
- onBeforeSortColumn: function(sort, order) {
- console.log('准备对列 "' + sort + '" 进行排序,排序方式: ' + order);
- return true;
- },
- // 在排序后触发
- onSortColumn: function(sort, order) {
- console.log('已对列 "' + sort + '" 完成排序,排序方式: ' + order);
-
- // 保存排序状态
- saveSortState(sort, order);
-
- // 更新排序信息显示
- updateSortInfo(sort, order);
- }
- });
- });
- </script>
- </body>
- </html>
复制代码
在这个完整的示例中,我们实现了一个商品管理系统,包含以下功能:
1. 基本排序功能:所有列都支持排序,包括ID、商品名称、分类、价格、库存、销量、评分、创建时间和状态。
2. 自定义排序函数:为价格、库存、销量和评分等数值型数据提供了自定义排序函数,确保正确的数值排序;为创建时间提供了日期排序函数。
3. 远程排序:通过设置remoteSort="true"启用远程排序,排序操作在服务器端执行。
4. 多列排序:通过设置multiSort="true"支持多列排序,用户可以按住Ctrl键点击多个列标题进行组合排序。
5. 排序状态保存与恢复:使用localStorage保存用户的排序状态,并在页面重新加载时恢复之前的排序设置。
6. 排序信息显示:在数据网格下方显示当前的排序信息,包括排序列标题和排序方式(升序或降序)。
7. 搜索功能:提供了按商品名称和分类进行搜索的功能,与排序功能配合使用。
8. 数据格式化:对分类、价格、评分和状态等字段进行了格式化,提高数据的可读性。
基本排序功能:所有列都支持排序,包括ID、商品名称、分类、价格、库存、销量、评分、创建时间和状态。
自定义排序函数:为价格、库存、销量和评分等数值型数据提供了自定义排序函数,确保正确的数值排序;为创建时间提供了日期排序函数。
远程排序:通过设置remoteSort="true"启用远程排序,排序操作在服务器端执行。
多列排序:通过设置multiSort="true"支持多列排序,用户可以按住Ctrl键点击多个列标题进行组合排序。
排序状态保存与恢复:使用localStorage保存用户的排序状态,并在页面重新加载时恢复之前的排序设置。
排序信息显示:在数据网格下方显示当前的排序信息,包括排序列标题和排序方式(升序或降序)。
搜索功能:提供了按商品名称和分类进行搜索的功能,与排序功能配合使用。
数据格式化:对分类、价格、评分和状态等字段进行了格式化,提高数据的可读性。
总结与最佳实践
通过本文的介绍,我们全面了解了jQuery EasyUI数据网格排序功能的实现方法,从基础应用到高级技巧,并针对常见问题提供了解决方案。以下是一些关键点和最佳实践:
关键点总结
1. 基础排序实现:通过设置sortable: true属性可以轻松实现列的排序功能。
2. 本地排序与远程排序:根据数据量大小选择合适的排序方式,小数据量使用本地排序,大数据量使用远程排序。
3. 自定义排序函数:对于特殊数据类型(如数值、日期等),可以使用自定义排序函数确保正确的排序结果。
4. 多列排序:通过设置multiSort: true属性支持多列排序,满足复杂的数据分析需求。
5. 排序事件处理:利用onSortColumn和onBeforeSortColumn等事件,可以在排序前后执行自定义操作。
6. 排序状态保存:使用localStorage等技术保存用户的排序状态,提升用户体验。
基础排序实现:通过设置sortable: true属性可以轻松实现列的排序功能。
本地排序与远程排序:根据数据量大小选择合适的排序方式,小数据量使用本地排序,大数据量使用远程排序。
自定义排序函数:对于特殊数据类型(如数值、日期等),可以使用自定义排序函数确保正确的排序结果。
多列排序:通过设置multiSort: true属性支持多列排序,满足复杂的数据分析需求。
排序事件处理:利用onSortColumn和onBeforeSortColumn等事件,可以在排序前后执行自定义操作。
排序状态保存:使用localStorage等技术保存用户的排序状态,提升用户体验。
最佳实践
1. 合理选择排序方式:对于少量数据(通常少于1000条),使用本地排序可以提高响应速度。对于大量数据,使用远程排序可以减轻客户端压力,提高性能。
2. 对于少量数据(通常少于1000条),使用本地排序可以提高响应速度。
3. 对于大量数据,使用远程排序可以减轻客户端压力,提高性能。
4. 优化自定义排序函数:保持排序函数的简洁高效,避免在排序函数中进行复杂计算。对于需要复杂计算的字段,可以考虑在数据加载时预先计算并存储结果。
5. 保持排序函数的简洁高效,避免在排序函数中进行复杂计算。
6. 对于需要复杂计算的字段,可以考虑在数据加载时预先计算并存储结果。
7. 提供排序状态反馈:在界面上明确显示当前的排序状态,包括排序列和排序方式。使用直观的排序图标(如上升箭头和下降箭头)指示排序方向。
8. 在界面上明确显示当前的排序状态,包括排序列和排序方式。
9. 使用直观的排序图标(如上升箭头和下降箭头)指示排序方向。
10. 考虑移动设备兼容性:确保排序功能在移动设备上也能正常工作。对于触摸屏设备,可能需要调整点击区域的大小,提高用户体验。
11. 确保排序功能在移动设备上也能正常工作。
12. 对于触摸屏设备,可能需要调整点击区域的大小,提高用户体验。
13. 结合其他功能使用:将排序功能与搜索、过滤、分页等功能结合使用,提供更强大的数据管理能力。例如,用户可以先按条件搜索数据,然后对搜索结果进行排序。
14. 将排序功能与搜索、过滤、分页等功能结合使用,提供更强大的数据管理能力。
15. 例如,用户可以先按条件搜索数据,然后对搜索结果进行排序。
16. 性能优化:对于远程排序,确保服务器端正确实现排序逻辑,并优化SQL查询。对于本地排序,合理使用分页功能,避免一次性加载过多数据。
17. 对于远程排序,确保服务器端正确实现排序逻辑,并优化SQL查询。
18. 对于本地排序,合理使用分页功能,避免一次性加载过多数据。
19. 用户体验优化:保存用户的排序偏好,下次访问时自动应用。提供重置排序的功能,让用户可以轻松恢复默认排序。
20. 保存用户的排序偏好,下次访问时自动应用。
21. 提供重置排序的功能,让用户可以轻松恢复默认排序。
合理选择排序方式:
• 对于少量数据(通常少于1000条),使用本地排序可以提高响应速度。
• 对于大量数据,使用远程排序可以减轻客户端压力,提高性能。
优化自定义排序函数:
• 保持排序函数的简洁高效,避免在排序函数中进行复杂计算。
• 对于需要复杂计算的字段,可以考虑在数据加载时预先计算并存储结果。
提供排序状态反馈:
• 在界面上明确显示当前的排序状态,包括排序列和排序方式。
• 使用直观的排序图标(如上升箭头和下降箭头)指示排序方向。
考虑移动设备兼容性:
• 确保排序功能在移动设备上也能正常工作。
• 对于触摸屏设备,可能需要调整点击区域的大小,提高用户体验。
结合其他功能使用:
• 将排序功能与搜索、过滤、分页等功能结合使用,提供更强大的数据管理能力。
• 例如,用户可以先按条件搜索数据,然后对搜索结果进行排序。
性能优化:
• 对于远程排序,确保服务器端正确实现排序逻辑,并优化SQL查询。
• 对于本地排序,合理使用分页功能,避免一次性加载过多数据。
用户体验优化:
• 保存用户的排序偏好,下次访问时自动应用。
• 提供重置排序的功能,让用户可以轻松恢复默认排序。
通过遵循这些最佳实践,开发者可以充分利用jQuery EasyUI数据网格的排序功能,为用户提供高效、直观的数据浏览和管理体验。无论是在电商后台、客户关系管理系统,还是数据分析平台中,良好的排序功能都能显著提升系统的可用性和用户满意度。
总之,jQuery EasyUI数据网格的排序功能是一个强大而灵活的工具,通过掌握其基础用法和高级技巧,开发者可以轻松实现各种复杂的排序需求,为用户提供卓越的数据交互体验。 |
|