【Python WEB】学生请假管理系统 05 — 实现表格拖选功能

GIthub 开源项目地址 leave_approval_management_sys,遵循 Apache 2.0 开源协议。

实现拖选功能

由于 DataTable 和 BootstrapTable 插件都没有自带拖选功能,但拖拽多选操作似乎又是必须的,所以自行实现拖选功能。

一、效果预览

img

二、思路

鼠标按下(mousedown) 则进行初始化(标记拖动状态、记录当前坐标为原点等)操作,然后当 鼠标移动(mousemove) 则显示拖拽框,并处理数据选择逻辑,若 鼠标松开(mouseup) 则结束本次拖选过程。

可以把整个功能分为两大块:

  1. 拖拽框
    拖拽框的样式变化可分为“四种”,需要以拖拽原点建立坐标系,然后对第一至四象限的变化分别进行处理。

  2. 选中逻辑
    利用 tr 标签的 鼠标进入(mouseenter)鼠标离开(mouseleave) 这两个事件的 offsetY 属性判断“选中行”与“取消选中行”。

三、拖拽框

Ⅰ、HTML 及 CSS

  1. HTML
<div id="drag-box"></div>
  1. CSS
#drag-box {
    z-index: -999;
    position: absolute;
    top: 0;
    left: 0;
    width: 0;
    height: 0;
    background-color: rgba(139, 191, 249, 0.5);
    border: 1px solid rgb(19, 98, 180);
    display: none;
    pointer-events: none;
}

Ⅱ、第一象限

newProperty = {
	x: originX,
	y: nowY,
	width: nowX - originX,
	height: originY - nowY,
}

img

Ⅲ、第二象限

newProperty = {
	x: nowX,
	y: originY,
	width: originX - nowX,
	height: originY - nowY,
}

img

Ⅳ、第三象限

newProperty = {
	x: nowX,
	y: originY,
	width: originX - nowX,
	height: nowY - originY,
}

img

Ⅴ、第四象限

newProperty = {
	x: originX,
	y: originY,
	width: nowX - originX,
	height: nowY - originY,
}

img

Ⅵ、总结

// 计算拖选框二维
let originX = $table.selector.x;
let originY = $table.selector.y;
let nowY = e.pageY;
let nowX = e.pageX;
let _x = originX, _y = originY, _width = Math.abs(nowX - originX), _height = Math.abs(nowY - originY);
if(nowY > originY) {
    if(nowX > originX) {
        _width = nowX - originX;
        _height = nowY - originY;
    }
    else {
        _x -= originX - nowX;
    }
}
else {
    if(nowX > originX) {
        _y -= originY - nowY;
    }
    else {
        _x -= originX - nowX;
        _y -= originY - nowY;
    }
}
// 设置拖选框样式
$('#drag-box').css({
    'left': _x + 'px',
    'top': _y + 'px',
    'width': _width + 'px',
    'height': _height + 'px',
});

四、选中逻辑

由于 鼠标移动事件(mousemove) 提供的数据无法计算哪些行被选中了,所以利用 tr 标签的 鼠标进入(mouseenter)鼠标离开(mouseleave) 这两个事件的 offsetY 属性进行判断。

有两种情况,四种状态需要判断:

  1. mouseenter
    • nowY > originY
      • offsetY >= 0
        .
    • nowY < originY
      • offsetY > 0
        .
  2. mouseleave
    • nowY > originY
      • offsetY < 0
        .
    • nowY < originY
      • offsetY > 0

参考代码:

$(element).on('mouseenter', (e) => {
    if(!$table.selector.drag) return;
    let _uniqueid = $(e.currentTarget).attr('data-uniqueid');
    let originY = $table.selector.y;
    let checks = [];
    if(e.pageY > originY) {
        if(e.offsetY + offset >= 0) checks.push(uniqueIdType === 'int'? parseInt(_uniqueid): _uniqueid);
    }
    else {
        if(e.offsetY + offset > 0) checks.push(uniqueIdType === 'int'? parseInt(_uniqueid): _uniqueid);
    }
    $table.bootstrapTable('checkBy', {field: uniqueId, values: checks});
});
$(element).on('mouseleave', (e) => {
    if(!$table.selector.drag) return;
    let _uniqueid = $(e.currentTarget).attr('data-uniqueid');
    let originY = $table.selector.y;
    let unchecks = [];
    if(e.pageY > originY) {
        if(e.offsetY < 0) unchecks.push(uniqueIdType === 'int'? parseInt(_uniqueid): _uniqueid);
    }
    else {
        if(e.offsetY > 0) unchecks.push(uniqueIdType === 'int'? parseInt(_uniqueid): _uniqueid);
    }
    $table.bootstrapTable('uncheckBy', {field: uniqueId, values: unchecks});
});

需要注意的是:BootstrapTable 的 checkByuncheckBy 方法采用的是 “===” 运算符,请自行转换数据类型。

五、继续优化

  1. 将 HTML 和 CSS 集成到函数中,减少复杂性,方便管理;
  2. 优化判断逻辑防止出现隔行选择;

【如果觉得本文不错 “点赞收藏关注”,是对作者最大的鼓励。】

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Web Chart Flot - Flot 为 jQuery 提供的javascript代码库. 容易使用,有特色的图表,提供交互功能(能够放大缩小数据区域等)。 Open Flash Chart - Open Flash Chart 是一个 Flash 图表组件,很容易安装,提供以下语言的API: PHP, Perl, Python, Java, Ruby on Rails, and .Net 来控制图表。 ? AmCharts - AmCharts 是一个动画交互Flash图表。支持: Pie Charts, Line Charts, Scatter/Bubble Charts, Bar/Column Charts, 甚至股票图表。 ? Emprise JavaScript Charts - Emprise 是一个100% 纯 JavaScript 图表解决方案,并不需要任何 JavaScript 框架. ? PlotKit - PlotKit 是一个 图表和图像的Javascript 库. PlotKit 和 MochiKit javascript 库一起工作,支持HTML Canvas 和 Adobe SVG 显示 以及本地浏览器支持。尤其文档非常全。 ? Flotr - Flotr 是Prototype 1.6.0.2框架的javascript插件库。 Flotr帮助你在浏览器中创建图表,支持鼠标事件响应,放大缩小,CSS类型支持等。 PHP/SWF Charts - PHP/SWF 是一个简单支持web图表的强大工具,你能使用 PHP 来收集数据,并发送给flash,支持很多图表类型: Line, Column, Stacked column, Floating column, 3D column, Stacked 3D column, Parallel 3D column, Pie, 3D Pie, Bar, Stacked bar, Floating bar, Area, Stacked area, Candlestick, Scatter, Polar, Mixed. ? Visifire - Visifire 是用 Silverlight 做的,是一个开源可视化数据组件,使用Visifire你能创建动画 Silverlight 图表,支持 ASP, ASP.Net, PHP, JSP, ColdFusion, Ruby on Rails 或者 简单 HTML调用. ? FusionCharts - FusionCharts 是一个跨浏览器和跨平台的flash图表组件,能够被 ASP.NET, ASP, PHP, JSP, ColdFusion, Ruby on Rails, 简单 HTML 页面 甚至PPT调用. 几乎所有你知道的语言它都支持。 ? JFreeChart - JFreeChart 是一个开源java图表库,让开发者能够很容易在程序里面显示高质量的图表。 JFreeChart 项目从7年前便开始了,起始于 2000 年1月, 已经有四五万开发者已经使用了JFreeChart。JFreeChart 支持很多种图形文件格式: JPEG, GIF, PDF, EPS and SVG. 这对于java开发者是一个很好的资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值