/*
*
* TreeTable 0.1 - Client-side TreeTable Viewer!
* @requires jQuery v1.3
*
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*
*
*/ (function($){
$.extend({
treetable: new function() { this.defaults = {
id_col: 0,
parent_col: 1,
handle_col: 2,
order_col: -1,
open_img: "lib/plugin/treetable/images/minus.gif",
close_img: "lib/plugin/treetable/images/plus.gif",
expanded: true//@author GaoBing
}; //jquery的trim处理不了 产生的"空格"
function trim(str){
return str.replace(/(^[\s\xA0]*)|([\s\xA0]*$)/g, "");
} this.construct = function(settings){ if(this.size()!=1)return;//只处理一个表格 if(this[0].tagName.toUpperCase()!="TBODY")return;//只应用于tbody var config = $.extend({}, $.treetable.defaults, settings); if(config.id_col==null || config.parent_col==null || config.handle_col==null ) return; var $this = $(this);
var tr_arr = new Array();
var tr_sort = new Array(); //构建行对象数组
$this.find("tr").each(function(){
var id = $.trim($(this).find("td:eq("+config.id_col+")").text());
var parent = $.trim($(this).find("td:eq("+config.parent_col+")").text());
tr_arr.push({'id':id,'parent':parent,'level':0,'node':'leaf','expanded':config.expanded,'obj':$(this)});
});
var len = tr_arr.length;
var level = 0; /*
检查tr_arr中的每一行的父行是否再tr_sort中,
如果有则插入到tr_sort的父行后,从tr_arr中删除
直到tr_arr都为null,生成排好序的tr_sort
*/
while(len>0){
for(var i=0;i<tr_arr.length;i++){
var o = tr_arr[i]; if(o==null)continue; if(o.parent==""){//根行直接压入tr_sort
tr_sort.push(o);
tr_arr[i]=null;
len=len-1;
}else{
if (tr_sort.length > 0){
for(var j=0;j<tr_sort.length;j++){
if(tr_sort[j].id==o.parent){
o.level = tr_sort[j].level+1;//从父行累计生成层次level
tr_sort[j].node='node';
tr_sort.splice(j+1,0,o);//数组插入
tr_arr[i]=null;
len=len-1;
break;
}
}
}else{
for(var k=0;k<tr_arr.length;k++){
var ok = tr_arr[k];
if(ok == null) continue;
if (o.id != ok.parent && ok.parent != ""){
ok.level = tr_arr[k].level+1;
tr_sort.push(ok);
tr_arr[i]=null;
len=len-1;
}else{
if (tr_sort[k]){
o.level = tr_sort[k].level+1;//从父行累计生成层次level
tr_sort[k].node='node';
tr_sort.splice(k+1,0,o);//数组插入
tr_arr[i]=null;
len=len-1;
break;
}
}
}
}
}
}
level=level+1;
}//while //展开事件动作函数
var fn_click = function(){ var id = trim($(this).parent().parent().find("td:eq("+config.id_col+")").text());//获取当前行ID
var v = -1;
for(var j=0;j<tr_sort.length;j++){
var o = tr_sort[j];
if(o.id==id){//在tr_sort找到行对象 if(o.node=='leaf')return; v = o.level;
var img = o.obj.find("td:eq("+config.handle_col+") img")[0]; if(!o.expanded){//通过图标判断是展开还是收起
img.src=config.open_img;
o.expanded=true;
}else{
img.src=config.close_img;
o.expanded=false;
} var show = o.expanded;
var f = false;//父行收起标志
var tmp = 0;//父行的层次 for(var i=j+1;i<tr_sort.length;i++){//根据level更新后续的子行
o = tr_sort[i]; var img = o.obj.find("td:eq("+config.handle_col+") img")[0]; var t = !o.expanded;//判断是否是收起状态 if(o.level>v && show){//展开操作
if(!f&&!t){//父行未收起,且当前行是展开状态
o.obj.show();
}else if(!f&&t){//父行未收起,且当前行是收起状态
tmp = o.level;
f = true;
o.obj.show();
}else if(f&&o.level<=tmp){//同级的前一行是收起状态
if(!t){
f=false;
}else{
tmp = o.level;
}
o.obj.show();
}else{
;
} }else if(o.level>v && !show){//收起操作则隐藏所以子行
o.obj.hide();
}else if(o.level<=v){//到达非子行,处理完毕
break;
}
} break;
}
}
}; //重新绘制表格,添加展开动作图标
for(var j=tr_sort.length-1;j>-1;j--){//prepend插入tbody内需使用反序
var o = tr_sort[j]; var img = $("<img src='"+config.open_img+"'>");
img.click(fn_click); var tr=o.obj.find("td:eq("+config.handle_col+")"); //避免重复添加图标
var imgEle = tr.find("img");
if(imgEle.length == 0){
tr.prepend(" ");
tr.prepend(img);
var s = new Array((o.level+1)*5).join(" ");//生成缩进空格
tr.prepend(s); $this.prepend(o.obj);
} }//for /*
* @author GaoBing
* 是否展开 当expanded为false时,父节点收缩
* */
if(tr_sort.length > 0){
for(var i=0;i<tr_sort.length;i++){
var o = tr_sort[i];//行对象
var img = o.obj.find("td:eq("+config.handle_col+") img");//父节点图标元素
if(o.expanded == false){//收缩
//检查是否有父节点,如有父节点则隐藏本行节点
if (o.parent != ""){
o.obj.hide();//隐藏子节点
}
//检查是否有子节点,有子节点则替换图标
for(var j=0;j<tr_sort.length;j++){
if (tr_sort[j].parent != "" && tr_sort[j].parent == o.id){//有子节点
$(img).attr("src",config.close_img);//替换父节点图标
}
}
}
}
} }//construct
}//treetable }); $.fn.extend({
treetable: $.treetable.construct
}); })(jQuery); /**
* @author GaoBing
* 功能:对树状表格进行排序 父节点在前 子节点在后
**/
function treetable_sort(tableId,parentColumn){ var trs = new Array(); //拿到所有行
$("#" + tableId + " tbody tr[role='row']").each(function(index){
trs[index] = $(this).clone(true);
}); //清空之前的行数据
$("#" + tableId + " tbody").empty(); //递归
sort_tr_root(trs,tableId,parentColumn); } /*根节点排序*/
function sort_tr_root(trs,tableId,parentColumn){
var rootArr = new Array();
for(var i=0;i<trs.length;i++){
if (null != trs[i]){
var trsData = trs[i].attr("data");
var trsDataObj = eval('(' + trsData + ')');
var trsId = trsDataObj['id'];
var trsParentId = trsDataObj[ parentColumn ];
if (null == trsParentId || trsParentId == "" || undefined == trsParentId){//最外层的根
trs[i].attr("id",trsId);
$("#" + tableId + " tbody").append(trs[i]);
rootArr.push(trs[i]);
trs[i] = null;
}
}
} //子节点排序
var treeData = changeDataToMap(trs);
var result = createSearchMap(trs,parentColumn);
for(var i=0;i<rootArr.length;i++){
var rootData = rootArr[i].attr("data");
var rootDataObj = eval('(' + rootData + ')');
var rootId = rootDataObj['id'];
var rootParentId = rootDataObj[ parentColumn ];
buildChild(tableId,treeData,result,rootId,rootParentId);
} } function createSearchMap(data,parentColumn){
//创建搜索键值对
var result = {};
for(var i=0;i<data.length;i++) {
if (null != data[i]){
var trsData = data[i].attr("data");
var trsDataObj = eval('(' + trsData + ')');
var trId = trsDataObj['id'];
var trParentId = trsDataObj[parentColumn];
if(trParentId){
if(!result[trParentId] && trParentId != null && trParentId != ""){
result[trParentId] = [];
}
result[trParentId].push(trId);
}
}
}
return result;
} function changeDataToMap(trs){
var deepMap = new Array();
for(var i=0;i<trs.length;i++){
if (null != trs[i]){
var trsData = trs[i].attr("data");
var trsDataObj = eval('(' + trsData + ')');
var trId = trsDataObj['id'];
if(trId){
deepMap[trId] = trs[i];
}
}
}
return deepMap;
} function buildChild(tableId,treeData,result,id,parentId){
if (parentId){
var trObj = treeData[id];
trObj.attr("id",id);
$("#" + tableId + " tbody tr[role=row][id=" + parentId + "]").after(trObj);
}
var childrenIds = result[id];
if(childrenIds){
for(var i=0;i<childrenIds.length;i++){
buildChild(tableId,treeData,result,childrenIds[i],id);
}
}
} /*判断是否包含某个元素*/
Array.prototype.contains = function (element) { // 利用Array的原型prototype点出一个我想要封装的方法名contains
for (var i = 0; i < this.length; i++) {
if (this[i] == element) { // 如果数组中某个元素和你想要测试的元素对象element相等,则证明数组中包含这个元素,返回true
return true;
}
}
}; /**
* @author GaoBing
* 功能:表格树 供datatable调用接口
**/
function initTreeTable(obj){ //参数
var tableId = obj.tableId;//表格ID
var tbodyId = obj.tbodyId;//表格中tbodyID
var isExpanded = obj.isExpanded;//是否展开所有节点
var viewConfig = obj.viewConfig;//展示配置
var parentColumn = obj.parentColumn;//父列 //排序 父节点排在子节点前面
treetable_sort(tableId,parentColumn); //默认属性
$.treetable.defaults={
id_col: viewConfig[0],//ID td列 {从0开始}
parent_col: viewConfig[1],//父ID td列
handle_col: viewConfig[2],//操作展开操作的 td列
open_img: "lib/plugin/treetable/images/minus.gif",//展开时图标
close_img: "lib/plugin/treetable/images/plus.gif",//收缩时图标
expanded: isExpanded//true为展开,false为收缩
}; //生成树
$("#" + tbodyId).treetable(); //隐藏数据列
$("#" + tbodyId + " tr").find("td:eq(" + viewConfig[0] + ")").hide();
$("#" + tbodyId + " tr").find("td:eq(" + viewConfig[1] + ")").hide();
$("#" + tableId + " tr:eq(0)").find("th:eq(" + viewConfig[0] + ")").hide();
$("#" + tableId + " tr:eq(0)").find("th:eq(" + viewConfig[1] + ")").hide();
}

  

treeTable实现排序的更多相关文章

  1. jQuery.treetable使用及异步加载

    Usage 1 GitHub 地址 https://github.com/ludo/jquery-treetable/ 2 API 地址 http://ludo.cubicphuse.nl/jquer ...

  2. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  3. iOS可视化动态绘制八种排序过程

    前面几篇博客都是关于排序的,在之前陆陆续续发布的博客中,我们先后介绍了冒泡排序.选择排序.插入排序.希尔排序.堆排序.归并排序以及快速排序.俗话说的好,做事儿要善始善终,本篇博客就算是对之前那几篇博客 ...

  4. JavaScript实现常用的排序算法

    ▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...

  5. [C#][算法] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序

    用菜鸟的思维学习算法 -- 马桶排序.冒泡排序和快速排序 [博主]反骨仔 [来源]http://www.cnblogs.com/liqingwen/p/4994261.html  目录 马桶排序(令人 ...

  6. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

  7. 算法与数据结构(七) AOV网的拓扑排序

    今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...

  8. 使用po模式读取豆瓣读书最受关注的书籍,取出标题、评分、评论、题材 按评分从小到大排序并输出到txt文件中

    #coding=utf-8from time import sleepimport unittestfrom selenium import webdriverfrom selenium.webdri ...

  9. javascript排序

    利用array中的sort()排序 w3cfunction sortNumber(a,b) { return a - b } var arr = new Array(6) arr[0] = " ...

随机推荐

  1. 了解php数据库常用语法增删改查

    数据库基本语法 MySQL增:insert into 表名 (字段1,...,字段n) values (值1,...,值n) MySQL删:delete from 表名 where 条件 MySQL改 ...

  2. sqlalchemy delete object

    In SQL Alchemy you are deleting Objects that you get with a query from the database. This you can do ...

  3. Failed to start connector [Connector[HTTP/1.1-8080]]

    错误提示:Failed to start connector [Connector[HTTP/1.1-8080]]错误原因:Tomcat端口被占用解决方案(window下):1.cmd打开命令控制台2 ...

  4. Oracle system 用户无法登录问题

    新手刚用Oracle数据库时,可能会遇到system用户无法登录情况. 问题原因:1.可能输入默认密码时输入错误(比较低级,一般不会范). 2.可能你在安装的时候设置了密码,但是在登录的时候密码不正确 ...

  5. IIS设置URL重写,实现页面的跳转的重定向方法

    默认IIS是不提供URL重写模块的. 请注意,不要将IIS默认的HTTP重定向理解为url重写. 安装url重写模块 url重写,是要从iis的应用市场下载url重写组件才可以的. URL重写工具的下 ...

  6. Python 数据类型常用的内置方法(二)

    目录 Python 数据类型常用的内置方法(二) 1.字符串类型常用内置方法 1.upper.lower.isupper.islower 2.startswith.endswith 3.format ...

  7. 分布式条件下Integer大小比值的问题

    目录 起因 但是,搞大数据的同学请注意了! 动机 验证 处理 起因 临下班,偶然看到阿里巴巴<JAVA开发手册>中,关于整型包装类对象之间值的比较的规约,里面提到强制使用equals,而不 ...

  8. [atAGC055B]ABC Supremacy

    将第$i$个字符在$A->C->B->A$这个环上操作$i$次,而此时的操作也即将$AAA,BBB$或$CCC$变为其中的另一个字符串 通过操作$XXXY->YYYY-> ...

  9. 没有人比我更会使用集合!对, 是dart中的集合

    目录 简介 List的使用 Set的使用 Map的使用 常见的集合方法 总结 简介 dart中的集合有三个,分别是list,set和map.dart在dart:core包中提供了对于这三种集合非常有用 ...

  10. 洛谷 P7154 - [USACO20DEC] Sleeping Cows P(dp)

    Portal 题意: 给出两个序列 \(a_1,a_2,\dots,a_n\),\(b_1,b_2,\dots,b_n\),\(i\) 与 \(j\) 能匹配当且仅当 \(a_i\leq b_j\). ...