近日小弟看到flexgrid的拖拉效果,突然奇想,有没有办法把他的列宽度动态调整和固顶表头功能分离出来呢?现在我做到的效果是这样
以下代码请自行引入Jquery文件,否则看不到效果。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<style type="text/css">
*{font-size:13px;}
#flexTable{margin:0 auto;width:800px;margin-top:20px;}
#flexTable #headDiv{position: relative;border: 1px solid #ccc;border-bottom: 0px;overflow: hidden;}
#flexTable #bodyDiv{height:300px;overflow:hidden;overflow:auto;border: 1px solid #ccc;border-top: 0px;background: #fff;}
#flexTable table{ border-collapse:collapse;table-layout:fixed;}
#headDiv th,#bodyDiv td{border:#CCC solid 1px;height:25px;overflow:hidden;text-overflow:ellipsis;
white-space:nowrap;word-break:keep-all;text-align:center;font-size:12px;}
.dropDiv{position:absolute;}
.dropDiv div{cursor:e-resize;border:1px solid #CCC;position:absolute;width:8px;background: none;float: left;}
</style>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
(function ($) {
//用正则表达式判断jQuery的版本
if (/1\.(0|1|2)\.(0|1|2|3|4|5)/.test($.fn.jquery) || /^1.1/.test($.fn.jquery)) {
alert('movedTh 需要 jQuery v1.2.6 以后版本支持! 你正使用的是 v' + $.fn.jquery);
return;
} var me = null;
var thNum = 0;
var dropDiv = "<div class='dropDiv'></div>";
var dropDivs = "";
var isDrag = false; $.fn.movedTh = function () {
me = $(this);
var dropDivOffset = $(me).offset();
var mainDivW = $(this).width();
var mainDivH = $(this).height(); //生成拖动DIV层
var dropDiv = document.createElement("div");
//设置拖动层的位置
$(dropDiv).addClass("dropDiv").
height(mainDivH).
width(mainDivW - 19).
css("top", dropDivOffset.top).
css("left", dropDivOffset.left); //设置表头宽度
$("#headDiv table", me).width(mainDivW - 19); //获取表头每个TH宽度并按照每个TH生成一个拖动DIV
$("#headDiv th").each(function () {
//设置每列拖动DIV的位置
var pos = ($(this).width() + $(this).offset().left - 2) - dropDivOffset.left; $("<div id='dropDiv" + thNum + "' onmousedown='$().dragStart(event,this);'></div>").
css("top", me.offsetTop).
css("left", pos).
height(mainDivH).
appendTo($(dropDiv));
thNum++;
}); $(me).append(dropDiv);
} //endmovedTh $.fn.dragStart = function (e, dragObj) {
var doc = document;
var dragData = dragObj;
var dragEvent = window.event || e;
var dragPiotX = dragEvent.clientX || dragEvent.pageX;
var n = $('div', $(dragObj).parent()).index(dragObj); dragData.mouseDownX = dragPiotX;
dragData.thOldWidth = $('th:eq(' + n + ')', me).width();
dragData.oldLeft = parseInt(dragObj.style.left);
dragData.newWidth = 0;
dragData.dragDivIndex = n;
dragData.newLeft = 0; //保持事件触发状态
if (dragObj.setCapture) {
dragObj.setCapture();
} else if (window.captureEvents) {
window.captureEvents(Event.MOUSEMOVE | Event.MOUSEUP);
} doc.onmousemove = function (e) {
//var dragData = dragObj;
var event = window.event || e; if (!dragData.mouseDownX) return false; var diff = (event.clientX || event.pageX) - dragData.mouseDownX;
dragData.newLeft = dragData.oldLeft + diff;
var nw = dragData.thOldWidth + diff; if (nw > 0) {
$('.dropDiv div:eq(' + n + ')', me).css('left', dragData.newLeft);
dragData.newWidth = nw;
dragData.dragDivIndex = n;
}
} //endmove doc.onmouseup = function (e) {
var hDiv = $("#headDiv", me);
var bDiv = $("#bodyDiv", me);
var event = window.event || e; if (dragData.mouseDownX) {
var n = dragObj.dragDivIndex;
var nw = dragData.newWidth; //设置表头宽度
$('th:eq(' + n + ')', hDiv).css('width', nw); //设置表体数据的每列宽度
$('tr', bDiv).each(function () {
$('td:eq(' + n + ')', this).css('width', nw);
});
$(hDiv).width(($(hDiv).width() * 1 + (event.clientX || event.pageX) * 1 - dragData.mouseDownX) - 17);
$(bDiv).width($(bDiv).width() * 1 + (event.clientX || event.pageX) * 1 - dragData.mouseDownX); //hDiv.scrollLeft = bDiv.scrollLeft;
dragData.mouseDownX = false; if (dragData.setCapture) {
dragData.releaseCapture();
} else if (window.captureEvents) {
window.releaseEvents(e.MOUSEMOVE | e.MOUSEUP);
}
}
} //endonmouseup
} //enddargStart
})(jQuery)
</script><script type="text/javascript"> $(document).ready(function () {
$("#flexTable").movedTh();
});
</script><meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>Table</title>
</head>
<body>
<div id="flexTable">
<div id="headDiv">
<table width="100%" cellpadding="0" cellspacing="0">
<tr>
<th >改变table的列宽度改</th>
<th >改变table的列宽度改</th>
<th >改变table的列宽度改</th>
<th >改变table的列宽度改</th>
<th >改变table的列宽度改</th>
<th >改变table的列宽度改</th>
</tr>
</table>
</div> <div id="bodyDiv">
<table width="100%" cellpadding="0" cellspacing="0">
<script type="text/javascript">
for (var i = 0; i < 20; i++)
document.write("<tr><td >改变table的列宽度" +i+"</td><td >改变table的列宽度</td><td >改变table的列宽度</td><td >改变table的列宽度</td>" +
"<td >改变table的列宽度</td><td >改变table的列宽度</td></tr>\r\n");
</script>
</table>
</div>
</div>
</body>
</html>现在有几个bug小弟js水平有限,请各位js大牛帮帮小弟我。
一个是拖拉后用于拖拉的div复位的问题(老是越拖越后,不知道那里出了问题)
一个是拖拉宽度超越主DIV(maindiv)后头部div和数据体div不是让主div出现滚动条,而已直接跳出了主div暂时问题是这样,希望有大牛做点修改,然后把这个插件一起分享出来。
以下代码请自行引入Jquery文件,否则看不到效果。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<style type="text/css">
*{font-size:13px;}
#flexTable{margin:0 auto;width:800px;margin-top:20px;}
#flexTable #headDiv{position: relative;border: 1px solid #ccc;border-bottom: 0px;overflow: hidden;}
#flexTable #bodyDiv{height:300px;overflow:hidden;overflow:auto;border: 1px solid #ccc;border-top: 0px;background: #fff;}
#flexTable table{ border-collapse:collapse;table-layout:fixed;}
#headDiv th,#bodyDiv td{border:#CCC solid 1px;height:25px;overflow:hidden;text-overflow:ellipsis;
white-space:nowrap;word-break:keep-all;text-align:center;font-size:12px;}
.dropDiv{position:absolute;}
.dropDiv div{cursor:e-resize;border:1px solid #CCC;position:absolute;width:8px;background: none;float: left;}
</style>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
(function ($) {
//用正则表达式判断jQuery的版本
if (/1\.(0|1|2)\.(0|1|2|3|4|5)/.test($.fn.jquery) || /^1.1/.test($.fn.jquery)) {
alert('movedTh 需要 jQuery v1.2.6 以后版本支持! 你正使用的是 v' + $.fn.jquery);
return;
} var me = null;
var thNum = 0;
var dropDiv = "<div class='dropDiv'></div>";
var dropDivs = "";
var isDrag = false; $.fn.movedTh = function () {
me = $(this);
var dropDivOffset = $(me).offset();
var mainDivW = $(this).width();
var mainDivH = $(this).height(); //生成拖动DIV层
var dropDiv = document.createElement("div");
//设置拖动层的位置
$(dropDiv).addClass("dropDiv").
height(mainDivH).
width(mainDivW - 19).
css("top", dropDivOffset.top).
css("left", dropDivOffset.left); //设置表头宽度
$("#headDiv table", me).width(mainDivW - 19); //获取表头每个TH宽度并按照每个TH生成一个拖动DIV
$("#headDiv th").each(function () {
//设置每列拖动DIV的位置
var pos = ($(this).width() + $(this).offset().left - 2) - dropDivOffset.left; $("<div id='dropDiv" + thNum + "' onmousedown='$().dragStart(event,this);'></div>").
css("top", me.offsetTop).
css("left", pos).
height(mainDivH).
appendTo($(dropDiv));
thNum++;
}); $(me).append(dropDiv);
} //endmovedTh $.fn.dragStart = function (e, dragObj) {
var doc = document;
var dragData = dragObj;
var dragEvent = window.event || e;
var dragPiotX = dragEvent.clientX || dragEvent.pageX;
var n = $('div', $(dragObj).parent()).index(dragObj); dragData.mouseDownX = dragPiotX;
dragData.thOldWidth = $('th:eq(' + n + ')', me).width();
dragData.oldLeft = parseInt(dragObj.style.left);
dragData.newWidth = 0;
dragData.dragDivIndex = n;
dragData.newLeft = 0; //保持事件触发状态
if (dragObj.setCapture) {
dragObj.setCapture();
} else if (window.captureEvents) {
window.captureEvents(Event.MOUSEMOVE | Event.MOUSEUP);
} doc.onmousemove = function (e) {
//var dragData = dragObj;
var event = window.event || e; if (!dragData.mouseDownX) return false; var diff = (event.clientX || event.pageX) - dragData.mouseDownX;
dragData.newLeft = dragData.oldLeft + diff;
var nw = dragData.thOldWidth + diff; if (nw > 0) {
$('.dropDiv div:eq(' + n + ')', me).css('left', dragData.newLeft);
dragData.newWidth = nw;
dragData.dragDivIndex = n;
}
} //endmove doc.onmouseup = function (e) {
var hDiv = $("#headDiv", me);
var bDiv = $("#bodyDiv", me);
var event = window.event || e; if (dragData.mouseDownX) {
var n = dragObj.dragDivIndex;
var nw = dragData.newWidth; //设置表头宽度
$('th:eq(' + n + ')', hDiv).css('width', nw); //设置表体数据的每列宽度
$('tr', bDiv).each(function () {
$('td:eq(' + n + ')', this).css('width', nw);
});
$(hDiv).width(($(hDiv).width() * 1 + (event.clientX || event.pageX) * 1 - dragData.mouseDownX) - 17);
$(bDiv).width($(bDiv).width() * 1 + (event.clientX || event.pageX) * 1 - dragData.mouseDownX); //hDiv.scrollLeft = bDiv.scrollLeft;
dragData.mouseDownX = false; if (dragData.setCapture) {
dragData.releaseCapture();
} else if (window.captureEvents) {
window.releaseEvents(e.MOUSEMOVE | e.MOUSEUP);
}
}
} //endonmouseup
} //enddargStart
})(jQuery)
</script><script type="text/javascript"> $(document).ready(function () {
$("#flexTable").movedTh();
});
</script><meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>Table</title>
</head>
<body>
<div id="flexTable">
<div id="headDiv">
<table width="100%" cellpadding="0" cellspacing="0">
<tr>
<th >改变table的列宽度改</th>
<th >改变table的列宽度改</th>
<th >改变table的列宽度改</th>
<th >改变table的列宽度改</th>
<th >改变table的列宽度改</th>
<th >改变table的列宽度改</th>
</tr>
</table>
</div> <div id="bodyDiv">
<table width="100%" cellpadding="0" cellspacing="0">
<script type="text/javascript">
for (var i = 0; i < 20; i++)
document.write("<tr><td >改变table的列宽度" +i+"</td><td >改变table的列宽度</td><td >改变table的列宽度</td><td >改变table的列宽度</td>" +
"<td >改变table的列宽度</td><td >改变table的列宽度</td></tr>\r\n");
</script>
</table>
</div>
</div>
</body>
</html>现在有几个bug小弟js水平有限,请各位js大牛帮帮小弟我。
一个是拖拉后用于拖拉的div复位的问题(老是越拖越后,不知道那里出了问题)
一个是拖拉宽度超越主DIV(maindiv)后头部div和数据体div不是让主div出现滚动条,而已直接跳出了主div暂时问题是这样,希望有大牛做点修改,然后把这个插件一起分享出来。
解决方案 »
- 【问一个JS跑马灯的问题】super.marque 紧急!!!高分奉上
- 我想在前台页面调用后台带参函数内容中有dao2.findByPbrandname("hiddentext1"),怎么把前台文本框的内容作为参数传入,求助!
- Easy Validate简易表单验证
- 用js实现新闻图片轮流显示出现的问题
- 问个正则表达式,提取网址和图片或者文字的
- 在frameset中怎样屏蔽退格(BackSpace)键?
- 如何关闭提示对话框
- 问一个正则表达式的问题
- 估计是一个有难度的问题,100cent
- 在发邮件时怎样填写内容
- JS如何判断本地客户端是否安装outlook
- 哪里有像jquery手册一样的javascript手册chm下载?
一个是拖拉后用于拖拉的div复位的问题(老是越拖越后,不知道那里出了问题)
一个是拖拉宽度超越主DIV(maindiv)后头部div和数据体div不是让主div出现滚动条,而已直接跳出了主div