六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 33|回复: 0

grid拖动列头改变列宽

[复制链接]

升级  81.33%

46

主题

46

主题

46

主题

秀才

Rank: 2

积分
172
 楼主| 发表于 2013-1-29 07:30:25 | 显示全部楼层 |阅读模式
grid中,当某一单元格的内容很多时,要能够拖动grid标题行的各列列头改变列的宽度。
假设有这么一个简单的table:
<table> <tr>   <td>序列</td>   <td>姓名</td>   <td>性别</td>   <td>工作简历</td> </tr> <tr>   <td>1</td>   <td>lgx</td>   <td>男</td>   <td>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</td> </tr></table> 上面的table中,工作简历列有很多内容,需要拖动改变宽度。
具体的js代码如下(基于prototype):
/** * 拖动列头以改变列的宽度  * author:liugx */function ResizeGridColumn(){}ResizeGridColumn.prototype ={cancelClick:function(event){event.returnValue=false;     event.cancelBubble=true; },getEventElement:function(clickObject){var evt = Event.getEvent();return (evt)?(event.target || event.srcElement):clickObject;},getTableObj:function(event){var oTable = "";try {oTable = Event.findElement(event,"TABLE");}catch(e){_alert(e.message);return "";}return oTable;},dragToResize:function(elementToDrag,event){var oTable = this.getTableObj(event);    var mouseDownX = event.clientX;    var pareneTdWidth = elementToDrag.parentElement.offsetWidth;    var pareneTableWidth = oTable.offsetWidth;        this.cancelClick(event);    if (document.addEventListener) {  // DOM Level 2 event model        document.addEventListener("mousemove", moveHandler, true);        document.addEventListener("mouseup", upHandler, true);    }    else if (document.attachEvent) {  // IE 5+ Event Model        elementToDrag.setCapture( );        elementToDrag.attachEvent("onmousemove", moveHandler);        elementToDrag.attachEvent("onmouseup", upHandler);        // Treat loss of mouse capture as a mouseup event.        elementToDrag.attachEvent("onlosecapture", upHandler);    }    else {  // IE 4 Event Model        var oldmovehandler = document.onmousemove; // used by upHandler( )        var olduphandler = document.onmouseup;        document.onmousemove = moveHandler;        document.onmouseup = upHandler;    }    if (event.stopPropagation) event.stopPropagation( );  // DOM Level 2    else event.cancelBubble = true;                      // IE    if (event.preventDefault) event.preventDefault( );   // DOM Level 2    else event.returnValue = false;                     // IE    function moveHandler(e) {        if (!e) e = window.event;  // IE Event Model                var newWidth= pareneTdWidth*1 + event.clientX*1 - mouseDownX;if(newWidth>0){elementToDrag.parentElement.style.width = newWidth;oTable.style.width = pareneTableWidth*1 + event.clientX*1 - mouseDownX;}        if (e.stopPropagation) e.stopPropagation( );  // DOM Level 2        else e.cancelBubble = true;                  // IE    }    function upHandler(e) {        if (!e) e = window.event;  // IE Event Model        if (document.removeEventListener) {  // DOM event model            document.removeEventListener("mouseup", upHandler, true);            document.removeEventListener("mousemove", moveHandler, true);        }        else if (document.detachEvent) {  // IE 5+ Event Model            elementToDrag.detachEvent("onlosecapture", upHandler);            elementToDrag.detachEvent("onmouseup", upHandler);            elementToDrag.detachEvent("onmousemove", moveHandler);            elementToDrag.releaseCapture( );        }        else {  // IE 4 Event Model            document.onmouseup = olduphandler;            document.onmousemove = oldmovehandler;        }        // And don't let the event propagate any further.        if (e.stopPropagation) e.stopPropagation( );  // DOM Level 2        else e.cancelBubble = true;                  // IE    }}}var resizeGridColumn = new ResizeGridColumn(); css代码:
.resizeDivClass{position:absolute;background-color:#FFD700;width:3;height:expression(this.parentElement.clientHeight);z-index:1;left:expression(this.parentElement.clientWidth);top:0px;cursor:e-resize; }  使用:
<table> <tr>   <td style='position:relative'><div class=\"resizeDivClass\" onmousedown=\"resizeGridColumn.dragToResize(this,event);\"></div>序列</td>   <td style='position:relative'><div class=\"resizeDivClass\" onmousedown=\"resizeGridColumn.dragToResize(this,event);\"></div>姓名</td>   <td style='position:relative'><div class=\"resizeDivClass\" onmousedown=\"resizeGridColumn.dragToResize(this,event);\"></div>性别</td>   <td style='position:relative'><div class=\"resizeDivClass\" onmousedown=\"resizeGridColumn.dragToResize(this,event);\"></div>工作简历</td> </tr> <tr>   <td>1</td>   <td>lgx</td>   <td>男</td>   <td>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</td> </tr></table>注意:
1、拖动div的位置,拖动div必须与标题行的每个td的右边框的位置重叠。这时候用相应定位来解决,把标题栏的td的position设置为relative,再把拖动div的 position设置为absolute,然后设置把它的left,top,height,width。拖动div相对于标题td的left是它的clientWidth值,top是0,height是clientHeight值。
2、js代码难度不大,注意以下几点即可:
  1)要考虑浏览器的兼容性。
  2)
Event.findElement(event,"TABLE");    这句代码是找触发事件元素往上的为table标识的元素,即找到了table,看看prototype源码就很清楚了。
3、css中用expression来计算值的用法。
4、table的td不能是:<td nowrap>,如果这样写就不能换行了,也不能够实现缩成多行效果来改变宽度。
5、对于width的大小位置的计算明白一下,这样,不管是用于table还是什么其它的元素,其原理是一样的。
 
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表