js 实现table表格拖拽和点击表头升降序排序,写的比较乱,用的时候可以把其中的一些模块函数提取出来

样式,由于是可拖拽表格,所以样式

table tr th{cursor:move;}

js实现

var arrTh = [];//保存初始每个th位置的数组
$('.Report th').each(function (i, e) {
arrTh.push({ 'index': i, 'left': $(e).offset().left });
$('.Report th').eq(i).append('<i class="fa fa-caret-down"></i>')// 在刚开始的时候默认向下箭头
});
var thisThIndex = 0;
var thisThLeft = 0;//存储当前拖拽层的位置
var isMove = false;
var flag = false;
// 鼠标按下的事件,如果拖拽超过一个单元格的距离,就拖拽成功
$(document).on('mousedown', '.Report th', function (e) {
var initX = e.pageX - $(this).offset().left;
var initY = $(this).offset().top;//点击的th到页面顶部的距离
var thisHtml = $(this).html();//点击的th的html
thisThIndex = $(this).index();//点击的th的索引
thisThLeft = $(this).offset().left;//当前拖拽层的位置
$(this).css({ 'background': '#ccc' });
var createDiv = $('<div class="createDiv">' + thisHtml + '</div>');//创建一个div用于拖拽显示
var createDivBg = $('<div class="createDivBg"></div>');//创建一个背景,防止复制文字
$('body').append(createDiv, createDivBg);//填充到页面中
createDiv.css({ 'top': initY, 'left': $(this).offset().left });// 'width': $(this).width(),//设置拖拽层的初始位置 // 按表头排序,点击一次升序,再点降序
var n = $(this).index()
console.log(n)
$(this).find('i').removeClass('fa-caret-down').addClass('fa-caret-up') // 点击的时候升序排列,向下箭头变为向上箭头
var tbody = $(this).parents("table").children('tbody').eq(0);
var rows = tbody.find('tr').not(".noselected"); // 最后两行是总计,不参加排序
rows = Array.prototype.slice.call(rows, 0); // 把对象转成数组
rows.sort(function (row1, row2) {
          // 如果都是数字,就按数字排序,否则按字符串排序
if (!(Number($(row1).children('td').eq(n).text()) && Number($(row2).children('td').eq(n).text()))) {
var val1 = $(row1).children('td').eq(n).text();
var val2 = $(row2).children('td').eq(n).text();
}
else {
var val1 = Number($(row1).children('td').eq(n).text());
var val2 = Number($(row2).children('td').eq(n).text());
}
if (val1 > val2) {
return 1;
} else if (val1 < val2) {
return -1;
} else {
return 0;
}
}); if (flag) {
rows.reverse(); // 颠倒数组中的元素
$(this).find('i').removeClass('fa-caret-up').addClass('fa-caret-down')
} tbody.prepend(rows); // 由于最后两行不参加排序,所以加到tbody前面
flag = !flag; $(document).on('mousemove', function (ev) { // 鼠标移动
if (Math.abs(ev.pageX - e.pageX) > 30) {//如果鼠标移动的位置超过30
isMove = true;
thisThLeft = ev.pageX - createDiv.width() / 2;//刷新当前拖拽层的位置
if (thisThLeft <= $('.Report th').offset().left) {
thisThLeft = $('.Report th').offset().left;
}
if (thisThLeft >= $(window).width() - 75) {
thisThLeft = $(window).width() - 75;
}
createDiv.css({ 'left': thisThLeft, 'top': initY });//拖拽层跟着鼠标走
var newsindex = 0;//循环的最后一个小于thisThLeft的索引
$.each(arrTh, function (index, element) {//遍历数组
var thIndex = element.index;//页面中所有th的索引
var thLeft = element.left;//页面中所有th到页面右边的距离
if (thisThLeft > thLeft) {
newsindex = thIndex;//循环的最后一个小于thisThLeft的索引
}
});
$('.Report th').eq(newsindex).css({ 'border-right': '2px solid red' }).siblings('th').css({ 'border-right': '1px solid #ddd' });//给当前th加边框
$('.Report tbody tr').each(function (tdindex, tdelement) {//给对应的列td加边框
$(tdelement).find('td').eq(newsindex).css({ 'border-right': '2px solid red' }).siblings('td').css({ 'border-right': '1px solid #ddd' });
});
}
});
});
$(document).on('mouseup', function (n) { // 鼠标抬起
$('.Report th').css({ 'border-right': '1px solid #ddd', 'background': 'none' });
$('.Report td').css({ 'border-right': '1px solid #ddd' });
$('.createDiv').remove();
$('.createDivBg').remove();
$(document).unbind('mousemove');
if (isMove) {
isMove = false;
var newsindex = 0;//循环的最后一个小于thisThLeft的索引
$.each(arrTh, function (index, element) {
var thIndex = element.index;
var thLeft = element.left;
if (thisThLeft > thLeft) {
newsindex = thIndex;
}
});
var newth = $('.Report th').eq(thisThIndex).prop('outerHTML');
if (newsindex >= thisThIndex) {
if (newsindex != 0) {//如果是第一个的情况下
$('.Report th').eq(thisThIndex).remove();
$('.Report th').eq(newsindex - 1).after(newth);
}
} else {
if ((newsindex + 2) != arrTh.length) {//如果是最后一个的情况下
$('.Report th').eq(thisThIndex).remove();
$('.Report th').eq(newsindex + 1).before(newth);
}
}
$('.Report tbody tr').each(function (tdindex, tdelement) {
var newtd = $(tdelement).find('td').eq(thisThIndex).prop('outerHTML');
if (newsindex >= thisThIndex) {
if (newsindex != 0) {
$(tdelement).find('td').eq(thisThIndex).remove();
$(tdelement).find('td').eq(newsindex - 1).after(newtd);
}
} else {
if ((newsindex + 2) != arrTh.length) {
$(tdelement).find('td').eq(thisThIndex).remove();
$(tdelement).find('td').eq(newsindex + 1).before(newtd);
}
}
});
arrTh = [];//重置保存每个th位置的数组
var checkedColunms = '';
$('.Report th').each(function (i, e) {
arrTh.push({ 'index': $(e).index(), 'left': $(e).offset().left }); // 移动时,单元格offset偏移
checkedColunms += $(e).attr('data-Value') + ',';
});
checkedColunms = checkedColunms.substring(0, checkedColunms.length - 1);
$('#CheckedColunms').val(checkedColunms);
$('.allpage a').each(function (ind, ele) { // 分页的表格,遍历并检查后面页数对应的列是不是拖拽后的
var url = $(ele).attr('href');
var reg = /CheckedColunms=([^&^\?]+)/ig;
if (url.match(reg) != null) { // 正则匹配 加参数
$(ele).attr('href', url.replace(/CheckedColunms=([^&^\?]+)/ig, "CheckedColunms=" + checkedColunms));
} else {
$(ele).attr('href', url + (url.indexOf("?") == -1 ? "?" : "&") + "CheckedColunms=" + checkedColunms);
}
});
} else {
arrTh = [];//重置保存每个th位置的数组
$('.Report th').each(function (i, e) {
arrTh.push({ 'index': $(e).index(), 'left': $(e).offset().left });
}); }
$('.last-td').css('border-width', '0 0 0 0', 'border-color', '#fff');
});

js 实现table表格拖拽和点击表头升降序排序的更多相关文章

  1. 实现Bootstrap表格拖拽

    实现Bootstrap表格拖拽: 需要引入jquery.min.js.bootstrap相关文件,以及jquery.dragsort-0.5.2.js 代码如下: <html> <h ...

  2. react拖拽(表格拖拽排序、普通拖拽排序以及树形拖拽排序)

    表格拖拽排序:组件地址:https://reactabular.js.org/#/drag-and-drop 拖动的排序是用React-DnD:React-DnD:http://react-dnd.g ...

  3. js div浮动层拖拽效果代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. js创建table表格

    //js创建table表格var tr;var cell;for(var i=0;i<10;i++){ //创建一个tr tr=document.createElement('tr'); doc ...

  5. 纯JS Web在线可拖拽的流程设计器

    F2工作流引擎之-纯JS Web在线可拖拽的流程设计器 Web纯JS流程设计器无需编程,完全是通过鼠标拖.拉.拽的方式来完成,支持串行.并行.分支.异或分支.M取N路分支.会签.聚合.多重聚合.退回. ...

  6. 第十三篇 JS 操作table表格

    JS 操作table表格 这节课难度可能高一点,因为没有提前解释if判断.for循环.这节课是直接把这两样用上了,老师先简单介绍一下: if,判断语句,判断就很简单了嘛,假如说1=1(1等于1),当然 ...

  7. wordpress模块无法拖拽/显示选项点击无反应

    问题:wordpress模块无法拖拽/显示选项点击无反应,还有编辑器的全屏什么的都用不了,按F12查看了console,提示很多jQuery is not defined... 解决方法:把wp-in ...

  8. HTML中实现Table表头点击升序/降序排序

    题目:如下图,请实现表格信息的排序功能,当点击表头的属性区域,将表格信息进行排序切换功能,即第一次点击为降序排序,再一次点击进行升序排序. 姓名 力量 敏捷 智力 德鲁伊王 17 24 13 月之骑士 ...

  9. 根据HTML5的新方法 drag & drop 方法实现表格拖拽实例

    上一次学习了html5的drag和drop方法,传送门  就自己写了个例子加深自己对drag和drop的理解.不过一开始不是很简单,遇到了不少问题.还好网络万能的,什么都能查到,总算完成了. 说明和详 ...

随机推荐

  1. Docker搭建本地私有仓库

    安装部署一个私有的Docker Registry是引入.学习和使用Docker这门技术的必经之路之一.尤其是当Docker被所在组织接受,更多人.项目和产品开始接触和使用Docker时,存储和分发自制 ...

  2. IOS基于XMPP协议开发--XMPPFramewok框架(一):基础知识

    最近蘑菇街团队的TT的开源,使我对im产生了兴趣,然后在网上找到了XMPPFramework进行学习研究, 并写了以下系列教程供大家参考,有写的不对的地方,请大家多多包涵指正. 目录索引 IOS基于X ...

  3. (void)0和0的区别及用法

    (void)0相当于宏NULL,NULL本身的含义为“空”,在c语言代表“不存在.不确定”的含义. 0不能简单的理解为“没有”的意思,在c语言及二进制中,0和1代表的是“一件事物的正反两个方面“,0是 ...

  4. DIY一个基于树莓派和Python的无人机视觉跟踪系统

    DIY一个基于树莓派和Python的无人机视觉跟踪系统 无人机通过图传将航拍到的图像存储并实时传送回地面站差点儿已经是标配.假设想来点高级的--在无人机上直接处理拍摄的图像并实现自己主动控制要怎么实现 ...

  5. linux 终端 查看上一页

    问题描述: 我在终端中使用”dpkg -l”命令显示主机中安装的软件时,发现内容很多,而当命令执行完毕后,只显示终端最后一屏的内容.前面的都无法查看,这个是很让人憋屈的.下面就这一个问题说一下我的解决 ...

  6. maven使用deploy发布到本地仓库

    使用maven可以方便的开发好的jar包发布到本地仓库中,方便其他项目依赖使用,在pom.xml文件中添加如下的配置: <distributionManagement> <repos ...

  7. chrome 控制台js调试与断点调试

        这篇文章是根据目前 chrome 稳定版(19.0.1084.52 m)写的,因为 google 也在不断完善chrome developer tool,所以 chrome 版本不同可能稍有差 ...

  8. PCB标识说明

    VDC (Voltage Direct Current),直流电压 VBAT,电池供电 PWKEY,电源键 RXD,数据接收 TXD,数据发送 Receive Data ,Transmit Data ...

  9. mysql实现经纬度计算两个坐标之间的距离

    DELIMITER $$CREATE DEFINER = CURRENT_USER FUNCTION `getDistance`(`lon1` float,`lat1` float,`lon2` fl ...

  10. 【BZOJ】1620: [Usaco2008 Nov]Time Management 时间管理(贪心)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1620 一开始想不通啊.. 其实很简单... 每个时间都有个完成时间,那么我们就从最大的 完成时间的开 ...