单元格拖拽

<html>
 <head>
  <meta charset="utf-8" />
  <title> new document </title>
  <meta name="generator" content="editplus" />
  <meta name="author" content="" />
  <meta name="keywords" content="" />
  <meta name="description" content="" />
  <style type="text/css">
  table{width: 600px; height: 600px;}
  td.selected{background: #cfe6fd;}
  #info{text-align:center;width:600px;font-size:40px;}
  </style>
 </head>

 <body>
<table border="1" id="test">
  <tr>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
  </tr>
</table>
<div id="info"></div>
<script type="text/javascript">
  var table = document.getElementById('test');
  var info = document.getElementById('info');

  var isMouseDown = false;

  var start;

  function select(obj){
    (obj.className !== 'selected') && (obj.className = 'selected')
  }

  function unselect(obj){
    obj.className = ''
  }

  function getXY(obj){
    return {
      y : obj.parentNode.rowIndex, //当前单元格所在的行
      x : obj.cellIndex //当前单元格所在的列
    };
  }

  function cleantable(){
    var i = table.rows.length;
    while(i--){
      var row = table.rows[i];

      var j = row.cells.length;

      while(j--){
        unselect(row.cells[j]);
      }
    }
  }

  table.onmousedown = function(e){
    var target = e.target;

    if(target.tagName !== 'TD'){
      return;
    }
    e.preventDefault();
    e.stopPropagation();

    cleantable(); //鼠标点下的时候, 清除整个table中已经处于状态的单元格

    isMouseDown = true
    start = getXY(target);
    select(target)
  }

  //事件绑定这里,自己考虑兼容性...我懒得改了.
  table.addEventListener('mouseover', function(e){
    if(isMouseDown){
      e.preventDefault();
      e.stopPropagation();

      var target = e.target;

      if(target.tagName !== 'TD'){
        return;
      }

      cleantable(); //清除整个table中已经选中的, 因为在下面会重新绘制

      var xy = getXY(target);

      var lr = xy.x - start.x;
      var td = xy.y - start.y;


      //得到要绘制的区域的大小
      var x = Math.abs(lr);
      var y = Math.abs(td);

      info.innerHTML = '选中区域大小:' + (y + 1) + '*' + (x + 1);

      lr = lr > 0 ? 1 : -1;
      td = td > 0 ? 1 : -1;

      // 循环整个区域, 选中该区域内的单元格
      for(var i=0; i<=x; i++){
        for(var j=0; j<=y; j++){
          select(table.rows[start.y + (td * j)].cells[start.x + (lr * i)]);
        }
      }
    }
  }, true);

  table.onmouseup = function(){
    isMouseDown = false;
  }
</script>
 </body>
</html>




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值