treeTable实现排序

treeTable实现排序/***TreeTable0.1-Client-sideTreeTableViewer!*@requiresjQueryv1.3**DuallicensedundertheMITandGPLlicenses:*http://www.opensource.org/licenses/mit-license.php…

大家好,又见面了,我是你们的朋友全栈君。

/*
* 
* 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();
}

  

转载于:https://www.cnblogs.com/deepbreath/p/4384247.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/144095.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • dpkg用法详解_dpkg -l

    dpkg用法详解_dpkg -ldpkg是一个Debian的一个命令行工具,它可以用来安装、删除、构建和管理Debian的软件包。下面是它的一些命令解释:1)安装软件命令行:dpkg-i示例:dpkg-iavg71flm_r28-1_i386.deb2)安装一个目录下面所有的软件包命令行:dpkg-R示例:dpkg-R/usr/local/src3)释放软件包,但是不进行配置命令

  • 均方误差与方差的区别_平均数 方差 标准差

    均方误差与方差的区别_平均数 方差 标准差一、百度百科上方差是这样定义的:看这么一段文字可能有些绕,那就先从公式入手,对于一组随机变量或者统计数据,其期望值我们由E(X)表示,即随机变量或统计数据的均值,然后对各个数据与均值的差的平方求和,最后对它们再求期望值就得到了方差公式。这个公式描述了随机变量或统计数据与均值的偏离程度。二、方差与标准差之间的关系就比较简单了根号里的内容就是我们刚提到的那么问题来了,

  • MyBatisPlus IService详解

    IService的使用方法需要配置MyBatisPlus才能使用publicinterfaceUserService2extendsIService<User>{}@ServicepublicclassUserServiceImplextendsServiceImpl<UserMapper,User>implementsUserService2{}@RestControllerpublicclassUserController.

  • Time Wait的作用、原因、影响和如何避免

    Time Wait的作用、原因、影响和如何避免TIME_WAIT示例图:1、time_wait的作用:TIME_WAIT状态存在的理由:1)可靠地实现TCP全双工连接的终止  在进行关闭连接四次挥手协议时,最后的ACK是由主动关闭端发出的,如果这个最终的ACK丢失,服务器将重发最终的FIN,因此客户端必须维护状态信息允许它重发最终的ACK。如果不维持这个状态信息,那么客户端将响应RST分节,服务器将此分节解释成一个错误(…

  • matlab直方图均衡化代码各种方法_数据直方图matlab代码

    matlab直方图均衡化代码各种方法_数据直方图matlab代码学习目标:1.直方图均衡化在matlab的实现学习产出p=imread(‘liena.jpg’);g=rgb2gray(p);%读取图片灰度化的图像x=size(g,1);y=size(g,2);%得到图片的格式g_r=imhist(g)./(x*y);%图像的离散化直方图s=zeros(256,1);%均衡化直方图的容器picure=im2uint8(zeros(x,y));%均衡化后的图像的容器fori=1:256foru=1:is(i)=s(i)+g_…

  • android之ArrayAdapter的重写

    昨天介绍了ArrayAdapter的使用,今天介绍一下更加实用的一点,对它进行重写,满足自己的个性化设计需要.ArrayAdapter(数组适配器)一般用于显示一行文本信息,所以比较容易。public ArrayAdapter(Context context,int textViewResourceId, List objects)上面的这行代码来装配数据,要装配这些数据就需要一个连接

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号