js实现table排序-sortable.js
方案一、引用sortable.js包
/* <th class="thcss" style="width: 40px;" onclick="sortAble('tbThead',0,'int')">
序号
</th>
*/
function ieOrFireFox(ob) {
var s = "";
if (ob!=null&&ob!=undefined) {
if (ob.text != null && ob.text != undefined)
return ob.text;
var s = ob.innerText;
}
return s.substring(0, s.length);
}
//排序 tableId: 表的id,iCol:第几列 ;dataType:iCol对应的列显示数据的数据类型
function sortAble(tableId, iCol, dataType) {
var table = document.getElementById(tableId);
var tbody = table.tBodies[0];
var colRows = tbody.rows;
var aTrs = new Array;
//将将得到的列放入数组,备用
for (var i=0; i < colRows.length; i++) {
aTrs[i] = colRows[i];
}
//判断上一次排列的列和现在需要排列的是否同一个。
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;
}
//将列的类型转化成相应的可以排列的数据类型
function convert(sValue, dataType) {
switch(dataType) {
case "int":
return parseInt(sValue);
case "float":
return parseFloat(sValue);
case "date":
return new Date(Date.parse(sValue));
default:
return sValue.toString();
}
}
//排序函数,iCol表示列索引,dataType表示该列的数据类型
function compareEle(iCol, dataType) {
return function (oTR1, oTR2) {
var vValue1 = convert(ieOrFireFox(oTR1.cells[iCol]), dataType);
var vValue2 = convert(ieOrFireFox(oTR2.cells[iCol]), dataType);
if (vValue1 < vValue2) {
return -1;
} else if (vValue1 > vValue2) {
return 1;
} else {
return 0;
}
};
}
方案二、
<script type="text/javascript" src="../../js/CJL.0.1.min.js"></script>
<script type="text/javascript">
var TableOrder = function (table, options) {
this._checked = []; //存放checkbox和radio集合
var tBody = $$(table).tBodies[0];
this._tBody = tBody; //tbody对象
this._rows = $$A.map(tBody.rows, function (o) { return o; }); //行集合
this._setOptions(options);
}
TableOrder.prototype = {
_repair: $$B.ie6 || $$B.ie7, //在ie6/7才需要修复bug
//设置默认属性
_setOptions: function (options) {
this.options = {//默认值
index: 0, //td索引
property: "innerHTML", //获取数据的属性
type: "string", //比较的数据类型
desc: true, //是否按降序
compare: null, //自定义排序函数
value: null, //自定义取值函数
repair: this._repair, //是否解决checkbox和radio状态恢复bug
onBegin: function () { }, //排序前执行
onEnd: function () { } //排序后执行
};
$$.extend(this.options, options || {});
},
//排序并显示
sort: function () {
//没有排序对象返回
if (!arguments.length) { return false };
var orders = Array.prototype.slice.call(arguments);
//执行附加函数
orders[0].onBegin();
//排序
this._rows.sort($$F.bind(this._compare, this, orders, 0));
//获取集合
var repair = this._repair && $$A.some(orders, function (o) { return o.repair; });
repair && this._getChecked();
//显示表格
var frag = document.createDocumentFragment();
$$A.forEach(this._rows, function (o) { frag.appendChild(o); });
this._tBody.appendChild(frag);
//恢复状态
repair && this._setChecked();
//执行附加函数
orders[0].onEnd();
},
//比较函数
_compare: function (orders, i, tr1, tr2) {
var od = orders[i], value1 = this._value(od, tr1), value2 = this._value(od, tr2)
, result = od.compare ? od.compare(value1, value2) : //使用自定义排序函数
typeof value2 == "string" ? value1.localeCompare(value2) : (value1 - value2);
//如果result是0(值相同)同时有下一个排序对象的话继续比较否则根据desc修正结果并返回
return !result && od[++i] ? this._compare(orders, i, tr1, tr2) : (od.desc ? -1 : 1) * result;
},
//获取比较值
_value: function (order, tr) {
var td = tr.cells[order.index], att = order.property
, data = order.value ? order.value(td) : //使用自定义取值函数
att in td ? td[att] : td.getAttribute(att);
//数据转换
switch (order.type.toLowerCase()) {
case "int":
return parseInt(data, 10) || 0;
case "float":
return parseFloat(data, 10) || 0;
case "date":
return Date.parse(data) || 0;
case "bool":
return data === true || String(data).toLowerCase() == "true" ? 1 : 0;
case "string":
default:
return data.toString() || "";
}
},
//创建并返回一个排序对象
creat: function (options) {
return $$.extend($$.extend({}, this.options), options || {});
},
//获取要修正的checkbox和radio集合
_getChecked: function () {
this._checked = $$A.filter(this._tBody.getElementsByTagName("input"), function (o) {
return (($$B.ie6 && o.type == "checkbox") || o.type == "radio") &&
o.checked != o.defaultChecked;
});
},
//设置checkbox和radio集合的checked
_setChecked: function () {
$$A.forEach(this._checked, function (o) { o.checked = !o.defaultChecked; });
}
}
</script> <script type="text/javascript">
var to = new TableOrder("idTable"), odID = to.creat({ type: "int", desc: false }), arrOrder = []; function ClearCss() { $$A.forEach(arrOrder, function (o) { o.className = ""; }); } function SetCheck(td) { return td.getElementsByTagName("input")[0].checked; } $$A.forEach([
["idCount", { index: 0, type: "int"}],
["idLiuShuiHao", { index: 1}],
["idYingShouHao", { index: 2}],
["idXYDWMC", { index: 3}],
["idZWMC", { index: 4}],
["idDanHao", { index: 5}],
["idShouRu", { index: 6, type: "int"}],
["idZhiChu", { index: 7, type: "int"}],
["idLZSJ", { index: 8}],
["idFKSJ", { index: 9}],
["idGZBM", { index: 10}],
["idJZY", { index: 11}],
["idFK", { index: 12}],
["idSG", { index: 13}],
["idBZ", { index: 14}] ], function (arr) {
var o = $$(arr[0]), order = to.creat(arr[1]);
order.onBegin = function () { ClearCss(); odID.desc = this.desc; }
order.onEnd = function () {
o.className = this.desc ? "desc" : "asc"; //设置样式
this.desc = !this.desc; //取反排序
}
o.onclick = function () { to.sort(order, odID); }
arrOrder.push(o); //记录排序项目(这里主要用来设置样式)
}); $$("idNum").onclick(); ////////////////////////////////////////////////////////////////////// var od1 = to.creat({ index: 1, onEnd: ClearCss,
compare: function (value1, value2) {
var re = /[\u4E00-\u9FA5]/, v1 = re.test(value1), v2 = re.test(value2);
return v1 == v2 ? 0 : (v1 ? 1 : -1);
}
})
, od2 = to.creat({ index: 2, type: "date" }), od3 = to.creat({ type: "int" }); $$("idBtn").onclick = function () { to.sort(od1, od2, od3); }
</script>
js实现table排序-sortable.js的更多相关文章
- js实现table排序(jQuery下的jquery.sortElements)
项目中要实现table排序的功能. 网上有非常多解决方式,非常多都基于jQuery. jquery.tablesorter.大小17KB.只是他的首页在ie10下兼容性有点问题. DataTables ...
- html5支持drag的拖放排序插件sortable.js
html5支持drag的拖放排序插件sortable.js <script src="//cdnjs.cloudflare.com/ajax/libs/Sortable/1.5.1/S ...
- html5 Sortable.js 拖拽排序源码分析
最近公司项目经常用到一个拖拽 Sortable.js插件,所以有空的时候看了 Sortable.js 源码,总共1300多行这样,写的挺完美的. 本帖属于原创,转载请出名出处. 官网http:// ...
- 拖放排序插件Sortable.js 兼容好及功能全个人觉得比dragula.js 好的多
经测试,Sortable.js 兼容好和使用方便都是比较不错的,特别手机端使用很棒 介绍 Sortable.js是一款轻量级的拖放排序列表的js插件(虽然体积小,但是功能很强大)下载地址:https: ...
- 原生js实现table的排序
原生js实现table的排序 今天遇到了一个问题就是使用原生js对table标签进行排序 一开始的时候陷入了一个误区就是首先获取table,然后每次比较完大小都会交换children的值,准备到最后吧 ...
- js 实现table表格拖拽和点击表头升降序排序
js 实现table表格拖拽和点击表头升降序排序,写的比较乱,用的时候可以把其中的一些模块函数提取出来 样式,由于是可拖拽表格,所以样式 table tr th{cursor:move;} js实现 ...
- javascript table排序之jquery.tablesorter.js
table排序 jquery.tablesorter.js 一.Demo下载地址: 1.tablesorter.js下载地址: http://download.csdn.net/detail/zhan ...
- sortable.js 华丽丽的排序
首先导入这几个资源 <link href="/css/jquery-ui-1.10.3.custom.css" rel="stylesheet" type ...
- JS对表格排序(支持对序号,数字,字母,日期)
JS对表格排序(支持对序号,数字,字母,日期) 前不久看到淘宝组件有"对表格排序的插件" 如想要看 可以看这个地址 http://gallery.kissyui.com/KSort ...
随机推荐
- [网站公告]23:00-05:00阿里云SLB升级会造成4-8次每次10秒的闪断
大家好,阿里云将于今天夜里(7月29日23:00-7月30日05:00)对负载均衡服务(SLB)进行升级操作,升级期间我们使用的SLB实例会有4-8次的闪断,每次闪断时间10秒左右.闪断期间会造成网站 ...
- express的session函数
key:这个表示session返回来的cookie的键值, 我们整理一下哈: 这个是我们没有清缓存然后刷新了一下哈,对比的结果,发现session保存的数据中,只是expires这个改变了 { &qu ...
- ejs
这个博客比较专业些http://sunnyhl.iteye.com/blog/1985539 ejs速度不是最快的,推荐最多大概是因为其简单的语法结构.主要通过<% %><%=%&g ...
- [C#基础]Func和Action学习
目录 委托 Action Func 总结 委托 委托的那些事 关于委托的基本定义,在很久之前的这篇文章中,有个简单的介绍.稍微回顾一下. 委托是c#中类型安全的,可以订阅一个或多个具有相同签名方法的函 ...
- [Bug]当IDENTITY_INSERT设置为OFF时,不能为表“xx”中的标识列插入显示的值
写在前面 在设计数据库表时,将主键设置为了自增的.在使用linq to sql的时候,添加数据,出现此错误. 解决方案 找到linq to sql生成的**.dbml文件,在对应的表上面右键修改其属性 ...
- OpenLayers中地图缩放级别的设置方法
来源于:http://www.cnblogs.com/sailheart/archive/2011/03/15/1984519.html 一.概述 在OpenLayers中,地图必须具有一个缩放级别的 ...
- java ee 中文乱码的问题
java ee 中文乱码的问题 发生中文乱码的三种情况 (一) 表单form Post 方法 直接在服务器中设置 request.setCharacterEncoding("utf-8&qu ...
- iOS开发小技巧--利用运行时得到隐藏的成员变量
一.关于运行时,已经从网络上摘抄了一片文章,这里只有项目中自己的简单使用 -- 查找隐藏的成员变量 导入头文件 可以获得隐藏的成员变量,方法,属性等 代码: 打印效果图:
- 问问题_为什么关闭浏览器后Session会失效
首先需要理解一下几点: 1.Http是无状态的,即对于每一次请求都是一个全新的请求,服务器不保存上一次请求的信息 2.Session是保存在服务端的,为什么后续请求会读取到session?因为请求会包 ...
- web前端开发常用的10个高端CSS UI开源框架
web前端开发常用的10个高端CSS UI开源框架 随着人们对体验的极致追求,web页面设计也面临着新的挑战,不仅需要更人性化的设计理念,还需要设计出更酷炫的页面.作为web前端开发人员,运用开源 ...