固定表头、鼠标调整列宽--解决(完全代码)

shang515 2003-11-27 06:37:31
不过就是不能把这个功能给封装起来,否则就会出错,哪位高人给解决一下,别忘了告诉俺一声
下面是JS文件
//function CreateDataGrid(element)
{
var selectBgColor = '#A3A3A3';//被选择行的背景色
var headTdColor = 'menu';//表头背景色
var trOverColor = '#D3D3D3';
function setTdWidth(tdIndex)//设置表格的列宽
{
//alert(tdIndex);
var td = element.rows[0].cells[tdIndex];
var tab = td;
while(tab.tagName!='TABLE')tab=tab.parentElement;//显示表格内容的Table
tab=tab.parentElement;
while(tab.tagName!='TABLE')tab=tab.parentElement;//最外层的Table
var hTab = tab.rows[0].firstChild;//头Table
while(hTab.tagName!='TABLE')hTab=hTab.firstChild;
var headTd = hTab.rows[0].cells[td.cellIndex];
//alert(headTd.width);
td.width = headTd.offsetWidth;
td.style.width = headTd.offsetWidth;
td.innerHTML = "<nobr>" + td.innerHTML + "</nobr>";
//return headTd.offsetWidth;
}
function setHeadDivLeft(div)//
{
var tab = div;
while(tab.tagName!='TABLE')tab=tab.parentElement;
var headDiv = tab.rows[0].firstChild;
while(headDiv.tagName!='DIV')headDiv=headDiv.firstChild;
headDiv.scrollLeft = div.scrollLeft;
}
function initHeadTdWidth()
{
var tab = element;
tab=tab.parentElement;
while(tab.tagName!='TABLE')tab=tab.parentElement;//最外层的Table
var hTab = tab.rows[0].firstChild;//头Table
while(hTab.tagName!='TABLE')hTab=hTab.firstChild;//找到真正的列头Table
for(var i=0;i<hTab.rows[0].cells.length;i++)
{
var td = hTab.rows[0].cells[i];
td.bgColor = headTdColor;
td.style.borderLeftColor = '#eeeeee';
td.style.borderTopColor = '#eeeeee';
td.style.borderRightColor = '#666666';
td.style.borderBottomColor = '#666666';
td.onmousedown = beginResizeTd;
td.onmousemove = setTdCursor;
//td.style.display = element.rows[0].cells[i].style.display;
td.innerHTML = "<nobr>" + td.innerHTML + "</nobr>";
if(element.rows[0].cells[i].width)
{
td.width = element.rows[0].cells[i].width;
td.style.width = element.rows[0].cells[i].width;
}
else if(element.rows[0].cells[i].style.width)
{
td.width = element.rows[0].cells[i].style.width;
td.style.width = element.rows[0].cells[i].style.width;
}
else
{
//默认宽为100
td.width = 100;
td.style.width = 100;
}
}
}
function initMainTdWidth()
{
if(element.rows.length<=0) return;
for(var i=0;i<element.rows[0].cells.length;i++)
//element.rows[0].cells[i].width = setTdWidth(element.rows[0].cells[i]);
setTdWidth(i);
}
function setMainTable()
{
var tab = element;
tab=tab.parentElement;
while(tab.tagName!='TABLE')tab=tab.parentElement;//最外层的Table
var hTab = tab.rows[0].firstChild;//头Table
while(hTab.tagName!='TABLE')hTab=hTab.firstChild;
element.style.position = 'relative';
element.style.top = -hTab.offsetHeight;
element.width = hTab.offsetWidth;
element.style.width = hTab.offsetWidth;
}
function initElement()
{
var html = "<table style='table-layout:fixed;height:100%;width:100%;' cellspacing=0 cellpadding=0>";
html += "<tr><td style='height:expression(firstChild.offsetHeight+1);layout:fixed;'>";
html += "<div style='overflow:hidden;width:expression(parentElement.offsetWidth-18);position:relative;'>";
html += "<table border=1 style='border-collapse:collapse;table-layout:fixed'>";
html += element.rows[0].outerHTML; // + head
html += "</table>";
html += "</div>";
html += "</tr></td><tr><td style='height:*;layout:fixed;'>";
html += "<div id='main' style='overflow:scroll;width:expression(parentElement.offsetWidth);height:100%;' onscroll='setHeadDivLeft(this)'>";
html += element.outerHTML;// + element
html += "</div>";
html += "</td></tr></table>";

element.outerHTML = html;
//element.document.close();

initHeadTdWidth(); //设置表格头的宽
//element.deleteRow(0); //删除显示内容的第一行
initMainTdWidth(); //设置内容表格的宽
setMainTable(); //设置内容表格的位置
}
//element.width = '';
element.style.wordBreak = "break-all";
element.style.tableLayout = 'fixed';
initElement();
////////////////////////// 下面内容设置可以使用鼠标调整列宽 //////////////////////////////////////////////
element.document.attachEvent('onmousemove',resizeTd);
element.document.attachEvent('onmouseup',endResizeTd);
function element.document.onselectstart(){if(document.old)return false;}
function setTdCursor()
{
var td = event.srcElement;
if(event.offsetX>td.offsetWidth-10 || document.old)
td.style.cursor = "col-resize";
else
td.style.cursor = "auto";
}
//function resizeTimeOut(){endResizeTd()}
function beginResizeTd()
{
var td = event.srcElement;
if(event.offsetX<td.offsetWidth-10) return;
document.tdDown = true;
var tab = td;while(tab.tagName!="TABLE")tab=tab.parentElement;
document.old=
{
"td":td,
"tdWidth":td.offsetWidth,
"downX":event.x,
"table":tab,
"tableWidth":tab.offsetWidth
}
//setTimeout("resizeTimeOut()",10000);
}
function resizeTd()
{
if(!document.old || document.old["td"].tagName!="TD") return;
if(document.tdDown)
{
document.body.style.cursor = "col-resize";
var offsetWidth = (event.x-document.old["downX"]);
var newWidth = document.old["tdWidth"] + offsetWidth;
if(newWidth<=5) return;
document.old["td"].width = newWidth;
document.old["td"].style.width = newWidth;
document.old["table"].width = document.old["tableWidth"]+offsetWidth;
document.old["table"].style.width = document.old["tableWidth"]+offsetWidth;

setTdWidth(document.old["td"].cellIndex);
setMainTable();
//保存列宽
//var index = document.old["td"].cellIndex;
//divTdWidth.getElementsByTagName("INPUT")[index].value = newWidth;
}
else
{
document.body.style.cursor = "auto";
document.old = null;
}
}
function endResizeTd()
{
document.old = null;
document.tdDown = false;
document.body.style.cursor = "auto";
}
////////////////////// 下面设置点击表格时改变行背景色的事件 ////////////////////////////
element.attachEvent('onclick',doDataGridClick);
element.attachEvent('onmouseover',doDataGridMouseOver);
element.attachEvent('onmouseout',doDataGridMouseOut);
function doDataGridClick()
{
var td = event.srcElement;
if(td.tagName!="TD" && td.parentElement.tagName!="TD") return ;
var tr = td;
while(tr.tagName!="TR") tr = tr.parentElement;
if(element.oldTr!=null)
element.oldTr.bgColor = element.oldColor;
element.oldTr = tr;
element.oldColor = tr.oldColor;//tr.bgColor;
tr.bgColor = selectBgColor;
window.status = '选中行:第'+ (element.oldTr?element.oldTr.rowIndex:'-1') +'行--当前行:第'+ tr.rowIndex +'行';
}
function doDataGridMouseOver()
{
var td = event.srcElement;
if(td.tagName!="TD" && td.parentElement.tagName!="TD") return ;
var tr = td;
while(tr.tagName!="TR") tr = tr.parentElement;
if(tr == element.oldTr) return;
tr.oldColor = tr.bgColor;
tr.bgColor = trOverColor;
window.status = '选中行:第'+ (element.oldTr?element.oldTr.rowIndex:'-1') +'行--当前行:第'+ tr.rowIndex +'行';
}
function doDataGridMouseOut()
{
var td = event.srcElement;
if(td.tagName!="TD" && td.parentElement.tagName!="TD") return ;
var tr = td;
while(tr.tagName!="TR") tr = tr.parentElement;
if(tr == element.oldTr) return;
tr.bgColor = tr.oldColor;
}
}
...全文
215 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
tfrtfr 2004-03-10
  • 打赏
  • 举报
回复
mk
gucs 2003-12-24
  • 打赏
  • 举报
回复
改天再看看
xiaoyao800 2003-12-15
  • 打赏
  • 举报
回复
rm
siugwan 2003-12-02
  • 打赏
  • 举报
回复
learning
jevain 2003-12-02
  • 打赏
  • 举报
回复
up
Wuzhou98 2003-12-02
  • 打赏
  • 举报
回复
mark
4125 2003-12-01
  • 打赏
  • 举报
回复
前段时间在想这个问题呢,今天偶尔发现还不错。学习学习。
snowflake310 2003-12-01
  • 打赏
  • 举报
回复
学习。
shang515 2003-12-01
  • 打赏
  • 举报
回复
我知道这个东西还有很多bug,所以希望大家对它不断完善
也感谢修正了bug的人……
感谢 xupc(寻巢鸟) ……
xupc 2003-12-01
  • 打赏
  • 举报
回复
还在解决的一个问题就是如果table id='element'的外层还很多表格的话,就会出错了。
xupc 2003-12-01
  • 打赏
  • 举报
回复
我修正了一个小bug
在拖动的那部分
var td=event.srcElement;
我加了下面的这个判断,因为如果鼠标指到文字上面,则srcElement就不是td了。
if (td.tagName=="NOBR")
td=td.parentElement;
xupc 2003-12-01
  • 打赏
  • 举报
回复
正在用,不过还是有一点小小的问题
veaven 2003-12-01
  • 打赏
  • 举报
回复
学习
bpy 2003-11-30
  • 打赏
  • 举报
回复
关注
学习
cnlamar 2003-11-30
  • 打赏
  • 举报
回复
mark
loulanlouzhu 2003-11-30
  • 打赏
  • 举报
回复
有空再看!


===弯弯的月亮小小的船,小小的船,两头尖,我在小小的船里坐,只看见闪闪
的星星蓝蓝的天.

===本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利
yzh0523 2003-11-30
  • 打赏
  • 举报
回复
up
junbor 2003-11-30
  • 打赏
  • 举报
回复
up!关注
shang515 2003-11-30
  • 打赏
  • 举报
回复
to chentaoyql(chentaoyql)
你把它加到DataGrid里也是一样呀,很容易就可以了,
只要你把DataGrid的ID设置为“element“,再把这个JS文件包含到文档的最后就可以了(注意:一定要在DataGrid的后边)
比尔咔咔 2003-11-30
  • 打赏
  • 举报
回复
昏倒
我还以为是DataGrid的呢

加载更多回复(9)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧