jQuery实现带分组数据的Table表头排序实例分析


Posted in Javascript onNovember 24, 2015

本文实例讲述了jQuery实现带分组数据的Table表头排序。分享给大家供大家参考,具体如下:

如下图:

jQuery实现带分组数据的Table表头排序实例分析

jQuery实现带分组数据的Table表头排序实例分析

要求:点击表头排序时,"分组"及"分组明细"的数据层次关系不变

从网上找了一段常规的table排序,改了改,以满足“分组支持”,贴在这里备份

<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
 <style type="text/css">
  .tbl-list, .tbl-list td, .tbl-list th {
   border: solid 1px #000;
   border-collapse: collapse;
   padding: 10px;
   margin: 15px;
  }
 </style>
 <script type="text/javascript" src="jquery.min.js"></script>
 <title>table sort</title>
 <script type="text/javascript">
  //排序 tableId: 表的id,iCol:第几列 ;dataType:iCol对应的列显示数据的数据类型
  function sortAble(th, tableId, iCol, dataType) {
   var ascChar = "▲";
   var descChar = "?";
   var table = document.getElementById(tableId);
   //排序标题加背景色
   for (var t = 0; t < table.tHead.rows[0].cells.length; t++) {
    var th = $(table.tHead.rows[0].cells[t]);
    var thText = th.html().replace(ascChar, "").replace(descChar, "");
    if (t == iCol) {
     th.css("background-color", "#ccc");
    }
    else {
     th.css("background-color", "#fff");
     th.html(thText);
    }
   }
   var tbody = table.tBodies[0];
   var colRows = tbody.rows;
   var aTrs = new Array;
   //将得到的行放入数组,备用
   for (var i = 0; i < colRows.length; i++) {
    //注:如果要求“分组明细不参与排序”,把下面的注释去掉即可
    //if ($(colRows[i]).attr("group") != undefined) {
     aTrs.push(colRows[i]);
    //}
   }
   //判断上一次排列的列和现在需要排列的是否同一个。
   var thCol = $(table.tHead.rows[0].cells[iCol]);
   if (table.sortCol == iCol) {
    aTrs.reverse();
   } else {
    //如果不是同一列,使用数组的sort方法,传进排序函数
    aTrs.sort(compareEle(iCol, dataType));
   }
   var oFragment = document.createDocumentFragment();
   for (var i = 0; i < aTrs.length; i++) {
    oFragment.appendChild(aTrs[i]);
   }
   tbody.appendChild(oFragment);
   //记录最后一次排序的列索引
   table.sortCol = iCol;
   //给排序标题加“升序、降序” 小图标显示
   var th = $(table.tHead.rows[0].cells[iCol]);
   if (th.html().indexOf(ascChar) == -1 && th.html().indexOf(descChar) == -1) {
    th.html(th.html() + ascChar);
   }
   else if (th.html().indexOf(ascChar) != -1) {
    th.html(th.html().replace(ascChar, descChar));
   }
   else if (th.html().indexOf(descChar) != -1) {
    th.html(th.html().replace(descChar, ascChar));
   }
   //重新整理分组
   var subRows = $("#" + tableId + " tr[parent]");
   for (var t = subRows.length - 1; t >= 0 ; t--) {
    var parent = $("#" + tableId + " tr[group='" + $(subRows[t]).attr("parent") + "']");
    parent.after($(subRows[t]));
   }
  }
  //将列的类型转化成相应的可以排列的数据类型
  function convert(sValue, dataType) {
   switch (dataType) {
    case "int":
     return parseInt(sValue, 10);
    case "float":
     return parseFloat(sValue);
    case "date":
     return new Date(Date.parse(sValue));
    case "string":
    default:
     return sValue.toString();
   }
  }
  //排序函数,iCol表示列索引,dataType表示该列的数据类型
  function compareEle(iCol, dataType) {
   return function (oTR1, oTR2) {
    var vValue1 = convert(removeHtmlTag($(oTR1.cells[iCol]).html()), dataType);
    var vValue2 = convert(removeHtmlTag($(oTR2.cells[iCol]).html()), dataType);
    if (vValue1 < vValue2) {
     return -1;
    }
    else {
     return 1;
    }
   };
  }
  //去掉html标签
  function removeHtmlTag(html) {
   return html.replace(/<[^>]+>/g, "");
  }
  //jQuery加载完以后,分组行高亮背景,分组明细隐藏
  $(document).ready(function () {
   $("tr[group]").css("background-color", "#ff9");
   $("tr[parent]").hide();
  });
  //点击分组行时,切换分组明细的显示/隐藏
  function showSub(a) {
   var groupValue = $(a).parent().parent().attr("group");
   var subDetails = $("tr[parent='" + groupValue + "']");
   subDetails.toggle();
  }
 </script>
</head>
<body>
 <table id="tableId" class="tbl-list" cellpadding="0" cellspacing="0">
  <thead>
   <tr>
    <th>序号</th>
    <th onclick="sortAble(this,'tableId', 1,'string')"
     style="cursor:pointer">姓名</th>
    <th onclick="sortAble(this,'tableId', 2, 'date')"
     style="cursor:pointer">生日</th>
    <th onclick="sortAble(this,'tableId', 3, 'int')"
     style="cursor:pointer">年龄</th>
    <th onclick="sortAble(this,'tableId', 4, 'float')"
     style="cursor:pointer">工资</th>
   </tr>
  </thead>
  <tbody>
   <tr group="A">
    <td>1</td>
    <td><a href="#" onclick="showSub(this)">Group-A</a></td>
    <td>01/12/1982</td>
    <td>25</td>
    <td>1000.50</td>
   </tr>
   <tr parent="A">
    <td>2</td>
    <td>A-01</td>
    <td>01/09/1982</td>
    <td>25</td>
    <td>2000.10</td>
   </tr>
   <tr parent="A">
    <td>3</td>
    <td>A-02</td>
    <td>01/10/1982</td>
    <td>26</td>
    <td>2000.20</td>
   </tr>
   <tr group="B">
    <td>4</td>
    <td><a href="#" onclick="showSub(this)">Group-B</a></td>
    <td>10/14/1999</td>
    <td>18</td>
    <td>1000.20</td>
   </tr>
   <tr parent="B">
    <td>5</td>
    <td>B-01</td>
    <td>02/12/1982</td>
    <td>19</td>
    <td>3000.20</td>
   </tr>
   <tr parent="B">
    <td>6</td>
    <td>B-02</td>
    <td>03/12/1982</td>
    <td>20</td>
    <td>3000.30</td>
   </tr>
   <tr group="C">
    <td>7</td>
    <td><a href="#" onclick="showSub(this)">Group-C</a></td>
    <td>10/14/1980</td>
    <td>8</td>
    <td>1000.30</td>
   </tr>
   <tr parent="C">
    <td>8</td>
    <td>C-01</td>
    <td>03/12/1981</td>
    <td>17</td>
    <td>3100.30</td>
   </tr>
  </tbody>
 </table>
</body>
</html>

希望本文所述对大家jQuery程序设计有所帮助。

Javascript 相关文章推荐
JavaScript 异步调用框架 (Part 1 - 问题 &amp; 场景)
Aug 03 Javascript
通过javascript的匿名函数来分析几段简单有趣的代码
Jun 29 Javascript
JSON+HTML实现国家省市联动选择效果
May 18 Javascript
JS中getYear()和getFullYear()区别分析
Jul 04 Javascript
JS或jQuery获取ASP.NET服务器控件ID的方法
Jun 08 Javascript
jQuery on()方法示例及jquery on()方法的优点
Aug 27 Javascript
jQuery+canvas实现简单的球体斜抛及颜色动态变换效果
Jan 28 Javascript
原生js实现无缝轮播图效果
Jan 11 Javascript
Node.js+jade抓取博客所有文章生成静态html文件的实例
Sep 19 Javascript
vue移动端下拉刷新和上拉加载的实现代码
Sep 08 Javascript
jquery无缝图片轮播组件封装
Nov 25 jQuery
解决layer 关闭当前弹窗 关闭遮罩层 input值获取不到的问题
Sep 25 Javascript
JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)
Nov 24 #Javascript
JS获取数组最大值、最小值及长度的方法
Nov 24 #Javascript
基于jquery实现日历签到功能
Sep 11 #Javascript
Jquery1.9.1源码分析系列(六)延时对象应用之jQuery.ready
Nov 24 #Javascript
如何解决ligerUI布局时Center中的Tab高度大小
Nov 24 #Javascript
JS实现图片高亮展示效果实例
Nov 24 #Javascript
JS截取字符串实例详解
Nov 24 #Javascript
You might like
ThinkPHP开发框架函数详解:C方法
2015/08/14 PHP
Laravel 集成微信用户登录和绑定的实现
2019/12/27 PHP
JavaScript类和继承 prototype属性
2010/09/03 Javascript
使用jQuery模板来展现json数据的代码
2010/10/22 Javascript
qTip2 精致的基于jQuery提示信息插件
2012/02/17 Javascript
通过JQuery实现win8一样酷炫的动态磁贴效果(示例代码)
2013/07/13 Javascript
jQuery控制TR显示隐藏的几种方法
2014/06/18 Javascript
JQuery实现动态适时改变字体颜色的方法
2015/03/10 Javascript
Jquery使用css方法改变样式实例
2015/05/18 Javascript
AngularJS中处理多个promise的方式
2016/02/02 Javascript
浅谈js键盘事件全面控制
2016/12/01 Javascript
学习vue.js中class与style绑定
2016/12/03 Javascript
Vue.js实现的购物车功能详解
2019/01/27 Javascript
Electron整合React使用搭建开发环境的步骤详解
2020/06/07 Javascript
[01:09:10]NB vs Liquid Supermajor小组赛 A组胜者组决赛 BO3 第一场 6.2
2018/06/04 DOTA
python基础教程之获取本机ip数据包示例
2014/02/10 Python
Python os模块介绍
2014/11/30 Python
利用Python和OpenCV库将URL转换为OpenCV格式的方法
2015/03/27 Python
python获取mp3文件信息的方法
2015/06/15 Python
Django开发中的日志输出的方法
2018/07/02 Python
tensorflow 加载部分变量的实例讲解
2018/07/27 Python
使用Python画股票的K线图的方法步骤
2019/06/28 Python
python中selenium操作下拉滚动条的几种方法汇总
2019/07/14 Python
浅谈pytorch池化maxpool2D注意事项
2020/02/18 Python
python3格式化字符串 f-string的高级用法(推荐)
2020/03/04 Python
简单了解Python多态与属性运行原理
2020/06/15 Python
PyCharm Ctrl+Shift+F 失灵的简单有效解决操作
2021/01/15 Python
美国高端寝具品牌:Coyuchi
2017/02/08 全球购物
日本酒店、民宿、温泉旅馆、当地旅行团中文预订:e路东瀛
2019/12/09 全球购物
初中生三年学习生活的自我评价
2013/11/03 职场文书
中学生获奖感言
2014/02/04 职场文书
安踏广告词改编版
2014/03/21 职场文书
群众路线教育实践活动对照检查材料
2014/09/22 职场文书
2014年平安建设工作总结
2014/11/19 职场文书
工作证明书
2015/06/15 职场文书
大学军训口号大全
2015/12/24 职场文书