表格列拖动在.html和.jsp中的问题

最近一周在做表格的列拖动,思路比较简单,就是先按下鼠标,触发onmousedown,计算左右td的宽度;然后移动,触发onmousemove,计算鼠标移动的位置,然后做下只能在相邻td间移动的判断,得到最后左右td的宽度;最后松开鼠标,触发onmouseup,结束移动。然而在做的过程中遇到了很多细节性的问题,幸亏有个高手指点,不然就做不出来了,在此感谢那个不知道名字的大哥的指导,先整理一下几点要注意的地方。

1.首先是引入一张图片,当做事件的触发点,这样可以根据图片的移动距离,计算td的改变宽度;

2.怎样使图片优先文字显示,因为假如不这样的话,拖到td最小时,右边的就只能把鼠标放到文字的下面才能够拖动,在IE中设置#insidetable td{ position: relative;} .move{ position: absolute; right: 0;top: 0;}就可以实现图片显示在文字上面。

3.隐藏td中的文字#insidetable td{  text-overflow:ellipsis;overflow: hidden; white-space: nowrap;}

这样在后缀名为.html时显示拖动没问题。

4.兼容<!DOCTYPE html>类型,标准模式时,才能在所有IE版本正常运行,这个问题好奇怪,在.style.width=w后面+"px"就解决了这个问题。

5.在onmosemove判断时,这样parseInt(dragObj.parentNode.parentNode.cells[dragObj.parentNode.cellIndex+1].style.width)-t<10判断时会出现移动时停顿的现象,换成 t+10>rightCellWidth 判断就没有这个问题,可是这两个判断时一摸一样的意思,就是用rightCellWidth代替了parseInt(dragObj.parentNode.parentNode.cells[dragObj.parentNode.cellIndex+1],现在还不知道为什么会这样子。

 

从html移动到jsp出现的问题

1.当把代码搬到JSP时又出现了一个问题,e一直是undefined,所以最后添加了一个var e=e || event解决移动的问题;

2.可又有一个移动td(td中的内容是汉字,空格、\等字符时)会出现换行,然后添加   #insidetable td{ word-break:keep-all;},以为这样子就可以了,但是空格、\等符号照样换行;后来查资料说IE中的td最难解决换行的问题,就在td后面加上一个div,在css中加入:div { white-space:nowrap;},最后解决了换行的问题(这个问题花了我很长时间才解决)。

 

完整代码如下:


<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>无标题文档</title>
<style type="text/css">
body{
 margin-left: 0px;
 margin-top: 0px;
 margin-right: 0px;
 margin-bottom: 0px;
}

table {
 width:100%;
 table-layout: fixed;
 margin-left: 0px;
 margin-top: 20px;
 margin-right: 0px;
 margin-bottom: 0px;
}

#insidetable td{
   background-color:#FFFFFF;
   font-size: 12px;
   color:#000000;
   text-align:center;
   text-overflow:ellipsis;
   overflow: hidden;
   white-space: nowrap;
}
.move{
 text-align:right;
 width:1px;
 margin:0px;
 background:#ffffff;
 border:0px;
 float:right;
 cursor:e-resize;
}
</style>
<script language="javascript">
var lastX,watch_dog,leftCellWidth,rightCellWidth;;
var dragAble=false;
var dragObj;
var ie = (document.all) ? true : false;//是否为IE

var p_p_c_gw=function(index,o)/*取得o.parentNode.parentNode.cells的宽度*/{
 if(window.ActiveXObject){
  return o.parentNode.parentNode.cells[o.parentNode.cellIndex+index].offsetWidth;
 }else{
  return parseInt(o.parentNode.parentNode.cells[o.parentNode.cellIndex+index].offsetWidth)-
  parseInt(o.parentNode.parentNode.parentNode.parentNode.cellPadding)*2-2;
 }
}

var p_p_p_sw=function(index,w,o)/*设置所有行的第index个单元格为w,在IE下可只设第一行*/{
  for(var i=0;i<o.parentNode.parentNode.parentNode.parentNode.rows.length;i++) {
  o.parentNode.parentNode.parentNode.parentNode.rows[i].cells[index].style.width=w+"px";
 }
}
document.οnmοusedοwn=function(e){//现在参数e在IE里也是是直接可以供函数使用的,比如第16行。
    var e=e || event;
 var oDragHandle;
    if(ie){
        oDragHandle = e.srcElement;
    }else{
        oDragHandle = e.target;
    }  
    if(oDragHandle.className=='move')
    {
        dragObj=oDragHandle;
  lastX=e.clientX;
  leftCellWidth=p_p_c_gw(0,dragObj);
  rightCellWidth=p_p_c_gw(1,dragObj);
  watch_dog=p_p_c_gw(0,dragObj)+p_p_c_gw(1,dragObj);
  if(dragObj.setCapture)
   dragObj.setCapture();
  else if(window.captureEvents)
   window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP);
        dragAble=true;
    }
}
//拖拽
document.οnmοusemοve=function(e){
    var e=e || event;
 if(dragAble)
    { 
 
  if(p_p_c_gw(0,dragObj)+p_p_c_gw(1,dragObj)>watch_dog){
   p_p_p_sw(dragObj.parentNode.cellIndex+1,watch_dog-p_p_c_gw(0,dragObj),dragObj);
   return;
  }
  var t=e.clientX-lastX;
  console.log(t)

  if(t>0) {//right
   if(t+10>rightCellWidth)
    return;
  } else {//left
   if(10-t>leftCellWidth)
    return; 
  }
  p_p_p_sw(dragObj.parentNode.cellIndex,leftCellWidth+t,dragObj);
  p_p_p_sw(dragObj.parentNode.cellIndex+1,rightCellWidth-t,dragObj);
    }
}
//停止拖拽
document.οnmοuseup=function(e){
 if(dragAble){
  if(dragObj.releaseCapture)
  dragObj.releaseCapture();
  else if(window.captureEvents)
  window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP);
     dragAble=false;
 }
}

</script>
</head>

<body>

  <table width="100%" align="center" id="insidetable" border="0" cellpadding="0" cellspacing="1" bgcolor="b5d6e6">
          <tr>
          
            <td width="3%" height="22">序号</td>
            <td width="6%" height="22"><img src="images/box1.gif" class="move" width="1" height="18">IP协议类型</td>
            <td width="9%" height="22"><img src="images/box1.gif" class="move" width="1" height="18">数据传输方向</td>
            <td width="10%" height="22"><img src="images/box1.gif" class="move" width="1" height="18">传输层协议类型</td>
            <td width="20%" height="22"><img src="images/box1.gif" class="move" width="1" height="18">本地IP</td>
            <td width="20%" height="22"><img src="images/box1.gif" class="move" width="1" height="18">远程IP</td>
   <td width="22%" height="22"><img src="images/box1.gif" class="move" width="1" height="18">进程名称</td>
   <td width="10%" height="22">操作时间</td>
        </tr>
  <tr>
   <td height='20'>01</td>
   <td height='20'>IPV4</td>
   <td height='20'> 数据流INPUT数据流INPUT数据流INPUT数据流INPUT数据流INPUT数据流INPUT数据流INPUT数据流INPUT数据流INPUT数据流INPUT</td>
   <td height='20'>TCP</td>
   <td height='20'>192:168:110:148 192:168:110:148 192:168:110:148</td>
   <td height='20'>180:149:156:73</td>
   <td height='20'>\6.7.0.0747\sgtool.exe \6.7.0.0747\sgtool.exe \6.7.0.0747\sgtool.exe</td>
   <td height='20'>2014-04-14 13:55:05</td>
      </tr>
   <tr>
   <td height='20'>01</td>
   <td height='20'>IPV4</td>
   <td height='20'>数据流INPUT</td>
   <td height='20'>TCP</td>
   <td height='20'>192:168:110:148</td>
   <td height='20'>180:149:156:73</td>
   <td height='20'>\6.7.0.0747\sgtool.exe</td>
   <td height='20'>2014-04-14 13:55:05</td>
      </tr>
   <tr>
   <td height='20'>01</td>
   <td height='20'>IPV4</td>
   <td height='20'>数据流INPUT</td>
   <td height='20'>TCP</td>
   <td height='20'>192:168:110:148</td>
   <td height='20'>180:149:156:73</td>
   <td height='20'>\6.7.0.0747\sgtool.exe</td>
   <td height='20'>2014-04-14 13:55:05</td>
      </tr>

        </table>

</body>
</html>

 

 

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值