`
lgx2351
  • 浏览: 171367 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

grid拖动列头改变列宽

阅读更多

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还是什么其它的元素,其原理是一样的。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics