嗯 嗯 我以前主要是搞java server端的编程 javascript用得少,至少用得不深 
   现在手上有个js任务,完成大部分,也碰到一些问题,目前要做的是,拖动选择table单元格功能,像excel里面选择表格一样,选择后单元格边框颜色变黑,能够任意拖动。 
   不晓得有js牛人搞过冒有,可以指点下不。 

解决方案 »

  1.   

    table的td貌似移动不了(td不能动态单独的创建,比如配置table和tr)~~~~
    你只能用div或span模拟table。
    找个拖拽的例子吧。http://blog.csdn.net/zsulwq0915/archive/2007/05/18/1615061.aspx
      

  2.   

    拖动选择应该比较简单
    获得鼠标按下开始拖拽的坐标和弹起结束拖拽的坐标
    然后对table的cell进行遍历,判断在其范围内的左上、右下角的cell,获得其rowIndex和cellIndex属性
    然后通过这两个属性就可以确定所选范围了。
      

  3.   

    看这里会给你一些帮助:http://blog.csdn.net/xxd851116/archive/2009/06/14/4267642.aspx
      

  4.   

    muxrwc 写过一个效果,不知道是不是LZ要的
    http://muxrwc.01www.cn/wc/cdrag.htm 好似能支持所有浏览器。
      

  5.   

    你去看看jQuery UI ..  jQuery 这类功能的插件很多.
      

  6.   


    你下过我的<js web excel 0.57 + js vm> 吧?
    建个矩阵,在这个路径下可以找到对应的实现方法cop\excel\matrix.js比如,生成了这样一个矩阵:
    1,0,1,0,0,1,1 
    0,0,1,1,1,0,1 
    0,0,1,0,1,0,1 
    1,1,1,1,1,1,1 对应的数组
    var mx=[
    [1,0,1,0,0,1,1],
    [0,0,1,1,1,0,1],
    [0,0,1,0,1,0,1], 
    [1,1,1,1,1,1,1] 
    ];实体   :1 
    被合并 :0 
    -------------------------
    点下鼠标的时候记录表格位置,矩阵中对应的位置如下
    1,0,1,0,0,1,1 
    0,0,x,1,1,0,1 
    0,0,1,0,1,0,1 
    1,1,1,1,1,1,1 
    -------------------------
    拖动并松开鼠标的时候记录位置,矩阵中对应的位置如下
    1,0,1,0,0,1,1 
    0,0,x,1,1,0,1 
    0,0,1,0,x,0,1 
    1,1,1,1,1,1,1 
    -------------------------
    那么:
    top    = 1
    left   = 2
    right  = 4
    bottom = 2
    var oTable= document.getElementById("Table1");//这里只是用来演示,具体由你自己决定
    var arr = new Array();
    for(var i=top;i<=bottom ;i++)
    {
       for(var j=left;j<=right;j++)
       {
           if( mx[i][j]== 1 )
               arr.push( oTable.rows.item( i ).cells.item( j ) );
       }
    }//arr里装的是你所选择的实体单元格 
      

  7.   

    错了个地方,修改不了,我另发段.function getUnit(r,c)
    {   var coln = 0;
       for( var i=0;i<=c;i++)
           coln += mx[r][i];
       return coln;
    }var oTable= document.getElementById("Table1");//这里只是用来演示,具体由你自己决定 
    var arr = new Array(); 
    for(var i=top;i <=bottom ;i++) 

      for(var j=left;j <=right;j++) 
      { 
          if( mx[i][j]== 1 ) 
              arr.push( oTable.rows.item( i ).cells.item( getUnit(j) ) ); 
      } 
      

  8.   

    妈哟,为了解决你这个问题花了我不少工夫
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <title>无标题文档</title>
    </head>
    <script src="matrix.js" type="text/javascript"></script>
    <body>
    <table width="200" border="1" id="table1">
      <tr>
        <td colspan="2" rowspan="3"  ondblclick="alert(this.cellIndex);">a</td>
        <td colspan="3" ondblclick="alert(this.cellIndex);">b</td>
        <td rowspan="3" ondblclick="alert(this.cellIndex);">c</td>
        <td ondblclick="alert(this.cellIndex);">d</td>
      </tr>
      <tr>
        <td ondblclick="alert(this.cellIndex);">1</td>
        <td ondblclick="alert(this.cellIndex);">2</td>
        <td ondblclick="alert(this.cellIndex);">3</td>
        <td ondblclick="alert(this.cellIndex);">e</td>
      </tr>
      <tr>
        <td colspan="2" ondblclick="alert(this.cellIndex);">4</td>
        <td ondblclick="alert(this.cellIndex);">5</td>
        <td ondblclick="alert(this.cellIndex);">f</td>
      </tr>
      <tr>
        <td ondblclick="alert(this.cellIndex);">g</td>
        <td ondblclick="alert(this.cellIndex);">h</td>
        <td ondblclick="alert(this.cellIndex);">i</td>
        <td ondblclick="alert(this.cellIndex);">j</td>
        <td ondblclick="alert(this.cellIndex);">k</td>
        <td ondblclick="alert(this.cellIndex);">l</td>
        <td ondblclick="alert(this.cellIndex);">m</td>
      </tr>
    </table>
    <div id="view_box0">0</div>
    <div id="view_box1">0</div>
    <div id="view_box2">0</div>
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    </body>
    </html>
    <script>
        matrix.prototype.getRect = function(oCurCell,robj)
        {
            var r= oCurCell.parentNode.rowIndex;
            var c= oCurCell.cellIndex;
            
            var rown = r;
            var coln = this.getColNumb( r, (c+1) );
            
            if( oCurCell.rowSpan!=null )
                rown += oCurCell.rowSpan-1;
            if( oCurCell.colSpan!=null )
                coln += oCurCell.colSpan-1;        if( robj.bottom < rown )
                robj.bottom = rown;
            if( robj.right  < coln )
                robj.right  = coln;
            return robj;
        };
        
        var irect = {top:0,left:0,bottom:0,right:0};
        var omatrix = new matrix(document.getElementById("table1") ); 
        
        
        
        //-------------演示矩阵-------------
        document.getElementById( "view_box0" ).innerHTML = "";
        for(i=0;i<document.getElementById("table1").rows.length;i++)
        {
            document.getElementById( "view_box0" ).innerHTML += omatrix.tp[i] + "<br/>";
        }
    //-------------演示矩阵结束-------------



    //--------------------------------------
    document.onmousedown = function(event)
        {   var event = event||window.event;
            var oCurCell= document.elementFromPoint(event.clientX,event.clientY);
            irect = {top:0,left:0,bottom:0,right:0};
            if( oCurCell!=null && oCurCell.tagName=="TD")
            {
                irect.top  = oCurCell.parentNode.rowIndex;
                irect.left = omatrix.getColNumb( irect.top, oCurCell.cellIndex+1);
                irect = omatrix.getRect( oCurCell,irect) ;
            }
        }
        //--------------------------------------
        document.onmouseup   = function(event)
        {   var event     = event||window.event;
            var oCurCell  = document.elementFromPoint(event.clientX,event.clientY);
            if(oCurCell!=null && oCurCell.tagName=="TD")
            {
                var irect2 = omatrix.getRect( oCurCell,irect) ;
                
                //-------------演示范围-------------
                var view_box1 = document.getElementById( "view_box1" );
                view_box1.innerHTML = "top:"+irect.top+"|" + "left:"+irect.left+"|" +"bottom:"+irect.bottom+"|" +"right:"+irect.right;
                //-------------演示范围结束-------------
                
                
                
                var   arr   =   new   Array();   
                for(var i=irect.top;i <=irect.bottom   ;i++)   
                {   var c = 0;
                    
                    for(var j=0;j<irect.left;j++) //左
                    {   if( omatrix.tp[i][j] == 1 )
                            c++;
                    }
                    for(var j=irect.left;j<=irect.right;j++)   
                    {   
                        if( omatrix.tp[i][j] == 1 )
                        {   
                            arr.push( omatrix.otable.rows.item( i ).cells.item( c )   );
                            c++;
                        }
                    }
                }
                
                
                //-------------演示范围包含的值-------------
                var view_box2 = document.getElementById( "view_box2" );
                var str = "";
                for(var i=0;i<arr.length;i++)
                    str+= "|"+arr[i].innerText;
                view_box2.innerHTML = str;
                //-------------演示范围包含的值结束-------------
            }
        }
        //--------------------------------------    
    </script>
      

  9.   

      呵呵 多谢楼上的同志 
      我有了基本思路 恩 没有建矩阵 按照鼠标选择的单元格offsetleft,offsettop来决定是否高亮显示。
      这个功能已经基本完成了 
      比如 有三行, 鼠标从 第一行二个单元格  拖动到 第二行第四个单元格。 
      这种情况下,第二行第一个单元格也会被选中,有被选中的阴影区域,
      
      我不想让第二行第一个单元格在在选择表格时出现阴影,该怎么办?
      
      楼上同学辛苦了 结贴时我会给分的
       
      

  10.   

    只见过Google的表格做到了,其他的没有
      

  11.   

    恩 已经做得差不多了 达到我预期的要求 
    思路还是以前思路
    主要是加了个onselectstart=return false事件
    这样就可以阻止鼠标拖动选择table里面得文字了 
      

  12.   

    就这样结了? 我估计你后面还会遇到问题的,关于行合并、列合并随机出现在不同位置的问题,我前面实现的方法和excel不完全一样,excel的实现是:拖动范围中碰到超出范围的自动根据该单元格区域进行范围扩大,这个我做得不太好,思路是有的,只是手上还有工作没有完成。我后面会去解决它的。
      

  13.   

      恩 合并也有简单思路 因为前期已经完成了单元格向左向下合并,仅限于两个单元格合并.
      我看过fckeditor源码,里面的合并 也采用类似矩阵的做法,把一个单元格映射成一个矩阵,我看了代码一大堆,想
      干脆按自己思路来实现得了。  因为在高亮显示单元格的时候,我们就可以获取高亮显示的cells集合对象.
      基本思路是把这些单元格按行分组 先横向合并 再垂直合并 方法就调用以前的相邻单元格合并算法。  现在解决跨浏览器问题,ie表现很好,还要看看 firefox,chrome,safari等浏览器表现。  目前ie达到了我的预期效果,其实我这个table功能是类似word中画table功能,行列增加或删除,拆分合并等等都要考虑到。
      
      以前选择单元格没做处理,就按默认的鼠标拖动选择单元格,不过客户部满意,嫌弃太难看,只好把这个功能完善。  
      

  14.   

    hi我目前也有这个需要,不知道你能否给我参考一下,或者说说思路。qq:[email protected]
      

  15.   

    想问一下,这个onselectstart 是加到哪里的?