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. 没有msdtc服务的解决方法(sql server分布式事务挂掉的解决方法)

    没有msdtc服务的解决方法如下:1.删除注册表中的键:  开始 运行 regedit  打开注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Servic ...

  2. Python中的strip()的理解

    在看到Python中strip的时候产生了疑问 strip() 用于移除字符串头尾指定的字符(默认为空格) 开始测试: >>> s = 'ncy_123.python' >&g ...

  3. swift 运算符和控制流程

    闭区间运算符 闭区间运算符(a...b)定义一个包含从a到b(包括a和b)的所有值的区间,只能是数字 for index in 1...5 { println("\(index) * 5 = ...

  4. 【转】Elasticsearch5.0 安装问题集锦

    Elasticsearch5.0 安装问题集锦 elasticsearch 5.0 安装过程中遇到了一些问题,通过查找资料几乎都解决掉了,这里简单记录一下 ,供以后查阅参考,也希望可以帮助遇到同样问题 ...

  5. SNP密度分布模式

    1. window=100k,step=2k 统计每个window的snp密度,然后用mixtools的normalmixEM(两个组分的混合模型)统计snp的分布模式. R command: lib ...

  6. linux udhcpc 后无法自动设置网卡ip

    arm 主板用 udhcpc 获取租赁的空闲的ip后,并没有直接设置在网卡上. 查了一下相关原因,是因为虽然已经获取了ip, 但是并没有通过脚本去设置这个IP. 在 busybox 里面有相关的脚本要 ...

  7. [Shell Script]关于source和sh对于脚本执行不同

    当我修改了/etc/profile文件,我想让它立刻生效,而不用重新登录:这时就想到用source命令,如:source /etc/profile对source进行了学习,并且用它与sh 执行脚本进行 ...

  8. strerror和perror函数详解

    /*#include <string.h> char *strerror(int errnum); 它返回errnum的值所对应的错误提示信息,例如errnum等于12的话,它就会返回&q ...

  9. js中的target与currentTarget的区别<转>

    关于js中target与currentTarget的区别的关键在于他们所处在的事件流的阶段是不一样的,target处于事件流的目标阶段,currentTarget处理事件流的捕获.处于目标阶段和冒泡阶 ...

  10. php -- strpos,stripos,strrpos,strripos,strstr,strchr,stristr,strrchr

    strpos() 函数 语法: mixed strpos ( string $haystack , mixed $needle [, int $offset = 0 ] ) 查找 needle 在 h ...