JQuery拖动表头边框线调整表格列宽效果代码


Posted in Javascript onSeptember 10, 2014

类似于桌面程序中的表格拖动表头的效果,当鼠标停留在表头边框线上时,鼠标会变成表示左右拖动的形状,接着拖动鼠标,会在表格中出现一条随鼠标移动的竖线,最后放开鼠标,表格列宽会被调整。最近比较空闲,便自己动手尝试实现,在此分享下小小的成果。

首先需要如图所示的鼠标图标文件,在自己的硬盘中搜索*.cur,肯定能找到。

为了能在所有需要该效果的页面使用,并且不需要更改页面任何HTML,我把所有的代码整合在 $(document).ready(function() {}); 中,并写入一个独立的JS文件。

用一个1像素宽的DIV来模拟一条竖线,在页面载入后添加到body元素中

$(document).ready(function() {
$("body").append("<div id=\"line\" style=\"width:1px;height:200px;border-left:1px solid #00000000; position:absolute;display:none\" ></div> ");
});

接下来是鼠标移动到表格纵向边框上鼠标变型的问题,起初我考虑在表头中添加一个很小的块级元素触发mousemove 和mouseout事件,但为了简单起见,我还是选择为整个表头添加该事件。

在TH的mousemove事件中处理鼠标变型:

$("th").bind("mousemove", function(event) {
var th = $(this);
//不给第一列和最后一列添加效果
if (th.prevAll().length <= 1 || th.nextAll().length < 1) {
return;
}
var left = th.offset().left;
//距离表头边框线左右4像素才触发效果
if (event.clientX - left < 4 || (th.width() - (event.clientX - left)) < 4) {
th.css({ 'cursor': '/web/Page/frameset/images/splith.cur' });
//修改为你的鼠标图标路径
}
else {
th.css({ 'cursor': 'default' });
}
});

当鼠标按下时,显示竖线,并设置它的高度,位置CSS属性,同时记录当前要改变列宽的TH对象,因为一条边框线由两个TH共享,这里总是取前一个TH对象。

$("th").bind("mousedown", function(event) {
var th = $(this);
//与mousemove函数中同样的判断
if (th.prevAll().length < 1 | th.nextAll().length < 1) {
return;
}
var pos = th.offset();
if (event.clientX - pos.left < 4 || (th.width() - (event.clientX - pos.left)) < 4) {
var height = th.parent().parent().height();
var top = pos.top;
$("#line").css({ "height": height, "top": top,"left":event .clientX,"display":"" });
//全局变量,代表当前是否处于调整列宽状态
lineMove = true;
//总是取前一个TH对象
if (event.clientX - pos.left < th.width() / 2) {
currTh = th.prev();
}
else {
currTh = th;
}
}
});

接下来是鼠标移动时,竖线随之移动的效果,因为需要当鼠标离开TH元素也要能有该效果,该效果写在BODY元素的mousemove函数中

$("body").bind("mousemove", function(event) {
if (lineMove == true) {
$("#line").css({ "left": event.clientX }).show();
}
});

最后是鼠标弹起时,最后的调整列宽效果。这里我给BODY 和TH两个元素添加了同样的mouseup代码。我原先以为我只需要给BODY添加mouseup函数,但不明白为什么鼠标在TH中时,事件没有触发,我只好给TH元素也添加了代码。水平有限,下面完全重复的代码不知道怎么抽出来。

$("body").bind("mouseup", function(event) {
if (lineMove == true) {
$("#line").hide();
lineMove = false;
var pos = currTh.offset();
var index = currTh.prevAll().length;
currTh.width(event.clientX - pos.left);
currTh.parent().parent().find("tr").each(function() {
$(this).children().eq(index).width(event.clientX - pos.left);
});
}
});
$("th").bind("mouseup", function(event) {
if (lineMove == true) {
$("#line").hide();
lineMove = false;
var pos = currTh.offset();
var index = currTh.prevAll().length;
currTh.width(event.clientX - pos.left);
currTh.parent().parent().find("tr").each(function() {
$(this).children().eq(index).width(event.clientX - pos.left);
});
}
});

好了,只要在需要这个效果的页面中引入包含以上代码的JS文件,就可以为页面中表格添加该效果。

另外以上代码在火狐中自定义鼠标图标的代码没出效果,所用的jquery为1.2.6

————————————————————————更新——————————————

关于拖动时会选中内容的BUG,将以下一行代码添加到$(document).ready函数里就行了

$("body").bind("selectstart", function() { return !lineMove; });
Javascript 相关文章推荐
jquery设置元素的readonly和disabled的写法
Sep 22 Javascript
jquery简单实现滚动条下拉DIV固定在头部不动
Nov 25 Javascript
JavaScript判断变量是否为undefined的两种写法区别
Dec 04 Javascript
javascript避免数字计算精度误差的方法详解
Mar 05 Javascript
基于jquery实现的可编辑下拉框实现代码
Aug 02 Javascript
JavaScript中使用自然对数ln的方法
Jun 14 Javascript
JS填写银行卡号每隔4位数字加一个空格
Dec 19 Javascript
利用js的闭包原理做对象封装及调用方法
Apr 07 Javascript
详解如何提高 webpack 构建 Vue 项目的速度
Jul 03 Javascript
Vuejs+vue-router打包+Nginx配置的实例
Sep 20 Javascript
JS执行控制之节流模式实例分析
Dec 21 Javascript
Node.js学习教程之Module模块
Sep 03 Javascript
jQuery通过点击行来删除HTML表格行的实现示例
Sep 10 #Javascript
javascipt:filter过滤介绍及使用
Sep 10 #Javascript
用javascript将数据导入Excel示例代码
Sep 10 #Javascript
js使用for循环及if语句判断多个一样的name
Sep 09 #Javascript
JQuery实现当鼠标停留在某区域3秒后自动执行
Sep 09 #Javascript
鼠标悬浮停留三秒后自动显示大图js代码
Sep 09 #Javascript
使用typeof方法判断undefined类型
Sep 09 #Javascript
You might like
使用openssl实现rsa非对称加密算法示例
2014/01/24 PHP
新浪微博OAuth认证和储存的主要过程详解
2015/03/27 PHP
ThinkPHP连接Oracle数据库
2016/04/22 PHP
PHP实现无限分类的实现方法
2016/11/14 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
2018/05/23 PHP
Yii框架日志记录Logging操作示例
2018/07/12 PHP
在你的网页中嵌入外部网页的方法
2007/04/02 Javascript
Jquery Ajax.ashx 高效分页实现代码
2009/10/20 Javascript
JQuery datepicker 使用方法
2011/05/20 Javascript
jquery struts 验证唯一标识(公用方法)
2013/03/27 Javascript
js登录弹出层特效
2014/03/07 Javascript
jQuery函数map()和each()介绍及异同点分析
2014/11/08 Javascript
JavaScript通过字典进行字符串翻译转换的方法
2015/03/19 Javascript
Vue.js每天必学之构造器与生命周期
2016/09/05 Javascript
js原生之焦点图转换加定时器实例
2016/12/12 Javascript
js控制按钮,防止频繁点击响应的实例
2017/02/15 Javascript
分享一道关于闭包、bind和this的面试题
2017/02/20 Javascript
详解Vue2.0里过滤器容易踩到的坑
2017/06/01 Javascript
Nodejs之http的表单提交
2017/07/07 NodeJs
angularJs select绑定的model取不到值的解决方法
2018/10/08 Javascript
深入解析Python中的变量和赋值运算符
2015/10/12 Python
浅谈Python处理PDF的方法
2017/11/10 Python
python 获取sqlite3数据库的表名和表字段名的实例
2019/07/17 Python
详解python 支持向量机(SVM)算法
2020/09/18 Python
德国BA保镖药房韩文网:kr.ba.de
2017/09/04 全球购物
布里斯班女装时尚品牌:Adrift
2017/12/28 全球购物
在加拿大在线租赁和购买电子游戏:Game Access
2019/09/02 全球购物
中东奢侈品购物网站:Ounass
2020/09/02 全球购物
化学专业毕业生自荐信
2013/11/15 职场文书
打架检讨书800字
2014/01/10 职场文书
司机辞职报告范文
2014/01/20 职场文书
2014年关工委工作总结
2014/11/17 职场文书
工作失职检讨书
2015/01/26 职场文书
2015初中团支部工作总结
2015/07/21 职场文书
Golang 获取文件md5校验的方法以及效率对比
2021/05/08 Golang
关于Oracle12C默认用户名system密码不正确的解决方案
2021/10/16 Oracle