HTML如下:

<table class="heroinfo">
<thead title="点击排序">
<tr>
<th>英雄</th><th>力量</th><th>敏捷</th><th>智力</th><th>移速</th>
</tr>
</thead>
<tbody>
<tr>
<td>英雄1</td><td>28</td><td>32</td><td>20</td><td>300</td>
</tr>
<tr>
<td>英雄2</td><td>29</td><td>22</td><td>30</td><td>320</td>
</tr>
<tr>
<td>英雄3</td><td>25</td><td>30</td><td>25</td><td>310</td>
</tr>
<tr>
<td>英雄4</td><td>33</td><td>28</td><td>22</td><td>305</td>
</tr>
<tr>
<td>英雄5</td><td>27</td><td>36</td><td>20</td><td>330</td>
</tr>
</tbody>
</table>

效果如下:

一、原生JS实现:来自JS权威指南,比书上多了再次点击后逆序排列的功能

//查找表格的<th>元素,让它们可单击
function makeSortable(table) {
var headers=table.getElementsByTagName("th");
for(var i=0;i<headers.length;i++){
(function(n){
var flag=false;
headers[n].onclick=function(){
// sortrows(table,n);
var tbody=table.tBodies[0];//第一个<tbody>
var rows=tbody.getElementsByTagName("tr");//tbody中的所有行
rows=Array.prototype.slice.call(rows,0);//真实数组中的快照 //基于第n个<td>元素的值对行排序
rows.sort(function(row1,row2){
var cell1=row1.getElementsByTagName("td")[n];//获得第n个单元格
var cell2=row2.getElementsByTagName("td")[n];
var val1=cell1.textContent||cell1.innerText;//获得文本内容
var val2=cell2.textContent||cell2.innerText; if(val1<val2){
return -1;
}else if(val1>val2){
return 1;
}else{
return 0;
}
});
if(flag){
rows.reverse();
}
//在tbody中按它们的顺序把行添加到最后
//这将自动把它们从当前位置移走,故没必要预先删除它们
//如果<tbody>还包含了除了<tr>的任何其他元素,这些节点将会悬浮到顶部位置
for(var i=0;i<rows.length;i++){
tbody.appendChild(rows[i]);
} flag=!flag;
}
}(i));
}
} window.onload=function(){
var table=document.getElementsByTagName("table")[0];
makeSortable(table);
}

二、编写jQuery插件实现

;(function($){
$.fn.extend({
"makeSortable":function(){
var table=$(this),
headers=table.find('th');
for(var i=0,len=headers.length;i<len;i++){
(function(n){
var flag=false;
headers.eq(n).click(function() {
var tbody=table.children('tbody').eq(0);
var rows=tbody.children('tr');
rows=Array.prototype.slice.call(rows,0); rows.sort(function(row1,row2){
var val1=$(row1).children('td').eq(n).text();
var val2=$(row2).children('td').eq(n).text();
if(val1>val2){
return 1;
}else if(val1<val2){
return -1;
}else{
return 0;
}
}); if(flag){
rows.reverse();
} tbody.append(rows);
flag=!flag;
});
}(i));
} return this;
}
});
})(jQuery); $(function(){
$(".heroinfo").makeSortable();
});

两种方法均能实现点击一次实现从小到大排序,再次点击从大到小排序。

JavaScript-点击表格的表头进行排序的更多相关文章

  1. QT中Qtableview视图表格中点击表头进行排序

    用QT写了一个小工具,主要是对Excel中大量的数据进行计算和显示. 写了有一段时间,然后断断续续的做一些修改和完善. 因为要显示的数据有多列,很自然的会想到要能够对显示的数据进行排序.如果直接操作m ...

  2. Jtable 表格按多列排序(支持中文汉字排序)

    这两天公司让做一个Jtable表格的排序,首先按A列排序,在A列相等时按B列排序,B列相等时按C列排序,ABC三列可以任意指定,最多分三列,这样的一个需求.由于我是大神,所以必须做了出来.ok,不自恋 ...

  3. AngularJS table 按照表头字段排序功能(升序和降序)

    一.表格按照表头排序 <!doctype html> <html ng-app="a3_4"> <head> <title>表头排序 ...

  4. HTML & CSS & JavaScript 从一个表格到一个灰阶颜色表 03

    工具1:HBuilder X 1.9.9.20190522 工具2:火狐浏览器 67.0.4 (64 位) 其实,我还想使用表格,做一个这样的颜色表,如下图所示: 如果按照之前的做法,把每一种颜色都列 ...

  5. 点击表格的单元格时实现变颜色,通过for循环为每个单元格添加一个onclick事件

    <title>无标题文档</title> <script type="text/javascript" language="javascri ...

  6. easyUI表格多表头实现

    项目中要实现表格多表头,结合网上的例子自己实现了一个,包含frozenColumns情况. 一,通过标签创建 效果: <table id="schoolGrid" class ...

  7. javascript生成表格增删改查 JavaScript动态改变表格单元格内容 动态生成表格 JS获取表格任意单元格 javascript如何动态删除表格某一行

    jsp页面表格布局Html代码 <body onload="show()"> <center> <input type="text" ...

  8. JavaScript:固定table的表头

    当表格数据很多,以致于容器块元素出现滚动条.而在滚动滚动条的时候,数据行会被块元素遮挡.若要保持表格的head部分始终在可视范围内,我们需要对表头进行特殊的样式设置.下面的jsp代码可以实现表头固定, ...

  9. HTML & CSS & JavaScript 从一个表格到一个灰阶颜色表 01

    工具1:HBuilder X 1.9.9.20190522 工具2:火狐浏览器 67.0.4 (64 位) 在开始之前,你需要了解一些基本的知识,不要求你能掌握,但是了解一下还是有益的: HTML 简 ...

随机推荐

  1. 【zookeeper】Apache curator的使用及zk分布式锁实现

    上篇,本篇主要讲Apache开源的curator的使用,有了curator,利用Java对zookeeper的操作变得极度便捷. 其实在学之前我也有个疑虑,我为啥要学curator,撇开涨薪这些外在的 ...

  2. Zookeeper数据存储总结

    Zookeeper快照文件和事物操作文件以文件的形式存储在硬盘上,以快照文件为主,日志文件为辅.因为当对内存数据进行变更的时候,会保证将事务操作记入log日志,而snapshot只是内存某一个时刻影像 ...

  3. javaweb 项目的异常处理

    首先关于异常的分类: java 中关于异常的分类情况是:throwable 是所有异常和错误的基类,下面在分为Error 和 Exception: 简单的异常体系结构如下图所示: 其中Exceptio ...

  4. iOS---UICollectlionView 的使用

    UICollectlionView继承自UIScrollerview,跟tableview的使用很相似. 下面是UIcollectionView的一些属性和代理方法. #import "Vi ...

  5. 【洛谷P4719】动态dp 动态dp模板

    题目大意:给你一颗$n$个点的树,点有点权,有$m$次操作,每次操作给定$x$,$y$,表示修改点$x$的权值为$y$. 你需要在每次操作之后求出这棵树的最大权独立集的权值大小. 数据范围:$n,m≤ ...

  6. POJ 2245

    //此题一看便是简单的回溯题用DFS+回溯便可以做出来了. #include <iostream> #define MAXN 20 using namespace std; int _m[ ...

  7. Distributed PostgreSQL on a Google Spanner Architecture – Query Layer

    转自:https://blog.yugabyte.com/distributed-postgresql-on-a-google-spanner-architecture-query-layer/ Ou ...

  8. 转载 linux umount 时出现device is busy 的处理方法--fuser

    http://www.cnblogs.com/spicy/p/6894333.html (原文链接) 当任何目录有 mount, 然后有程序使用/挂在那个目录上的话, 就没有办法 umount 掉, ...

  9. ILSpy工具使用

    Reflector是.NET开发中必备的反编译工具.即使没有用在反编译领域,也常常用它来检查程序集的命名规范,命名空间是否合理,组织类型的方法是否需要改善.举例说明,它有一个可以查看程序集完整名称的功 ...

  10. Python虚拟环境中pip install时没有权限问题

    virtualenv Permission denied 新建的python虚拟环境的目录的所属者必须是当前用户,才不会出现这种错误 比如 virtualenv py27 sudo chown zzf ...