通过拖动选择表格上的单元格

IT技术 javascript
2021-01-25 15:24:43

我正在查看这个问题,并看到了对 iPhone 游戏的引用,在该游戏中,您可以边走边拖过屏幕选择字母。

我很想看到使用表格在 Javascript 中实现这一点。因此,您可以将鼠标拖到每个单元格上,然后它们就会突出显示。

我不确定最好的方法是什么,但我希望有人试一试。有人在这里尝试,但它并没有真正起作用。

替代文字 替代文字

感谢Cacoo的性感图表。这就像一个在线 visio,真的很好。看看这个 ;)

3个回答

这是一个工作原型:http : //jsfiddle.net/few5E/使用 jQuery 进行 DOM 挂钩,但可以使用另一个框架轻松实现。

更新http : //jsfiddle.net/Brv6J/一个略有不同的版本 - 突出显示的状态只会在您释放并再次单击时发生变化。

更新 2http : //jsfiddle.net/Brv6J/3/ - 绑定 onselectstart 以便在 IE 中不选择文本。

一些相关的事实:

  • 表格单元格的 mousedown 事件被挂钩以跟踪实际点击。此事件已停止,因此会阻碍文本选择。也在 IE 中绑定 ontextselect 以获得相同的效果。
  • 鼠标悬停事件将切换单元格的突出显示类
  • mouseout 事件挂在 上document这是为了确保它始终运行。如果 mouseup 事件挂在表格单元格上,则如果您在表格外释放鼠标键,则不会触发该事件。此状态在 中跟踪isMouseDown

完整源代码供参考:

<!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" xml:lang="en" lang="en">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <title></title>
  <style type="text/css" media="screen">
    table td {
      width:100px;
      height:100px;
      text-align:center;
      vertical-align:middle;
      background-color:#ccc;
    }

    table td.highlighted {
      background-color:#999;
    }
  </style>
</head>
<body>
  <table cellpadding="0" cellspacing="1" id="our_table">
    <tr>
      <td>a</td>
      <td>b</td>
      <td>c</td>
    </tr>
    <tr>
      <td>d</td>
      <td>e</td>
      <td>f</td>
    </tr>
    <tr>
      <td>g</td>
      <td>h</td>
      <td>i</td>
    </tr>
  </table>

  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js" type="text/javascript"></script>
  <script type="text/javascript" charset="utf-8">
    $(function () {
      var isMouseDown = false;
      $("#our_table td")
        .mousedown(function () {
          isMouseDown = true;
          $(this).toggleClass("highlighted");
          return false; // prevent text selection
        })
        .mouseover(function () {
          if (isMouseDown) {
            $(this).toggleClass("highlighted");
          }
        })
        .bind("selectstart", function () {
          return false; // prevent text selection in IE
        });

      $(document)
        .mouseup(function () {
          isMouseDown = false;
        });
    });
  </script>
</body>
</html>
有趣的是,您使用 toggleClass... 在这种情况下,当您将鼠标悬停回已选择的单元格时,这将删除选择。根据应用程序逻辑,这可能正确,也可能不正确。直观地(就像我在我的解决方案中所做的那样),我保持所有选中状态,直到 mouseup。
2021-03-26 15:24:43
可以这么说,toggleClass 的使用只是一种技巧。在适当的单元可测试实现中,您将使用带有布尔值或类似值的实例。
2021-03-29 15:24:43
对于那些希望在新创建的表(通过 ajax)上工作的人,请参阅此小提琴jsfiddle.net/Brv6J/803
2021-03-30 15:24:43
请参阅备用链接 :) 刚刚添加它。
2021-04-04 15:24:43
此外,更改状态逻辑以便取消选择鼠标上的所有内容(这就是您所描述的,对吗?)是微不足道的。$("#our_table td").removeClass("highlighted")在这种情况下,mouseup 事件上的A将是适当的黑客攻击。
2021-04-07 15:24:43

如果您在选择类似电子表格的单元格(在列/行块中),则需要在鼠标悬停事件中突出显示开始和结束索引(行和单元格)之间的每一行中的每个单元格:

for (var i = rowStart; i <= rowEnd; i++) {
    var rowCells = table.find("tr").eq(i).find("td");
    for (var j = cellStart; j <= cellEnd; j++) {
        rowCells.eq(j).addClass("selected");
    }        
}

由于用户可能会从各个方向(自上而下、自下而上、右左、左右)开始选择单元格,因此您需要为开始和结束分配正确的索引。

这是一个jsFiddle

添加table.find(".selected").removeClass("selected");mouseover功能以使其更像电子表格,即在移动到选定区域时取消选择单元格。更新的小提琴
2021-03-21 15:24:43
更好的是,你会使用 Dojo 或 jQuery(或更高级别的东西)
2021-04-05 15:24:43
这很棒,适用于班次选择。如果它也支持 ctrl-selection 那就太棒了。
2021-04-08 15:24:43

http://www.jaanuskase.com/stuff/dragSelect.html

不确定您是否想要纯 Javascript 实现,为了方便起见,我使用了 jQuery。

无论如何,您可以轻松地重构它以支持触摸事件吗?
2021-04-04 15:24:43
@hlyates 关于如何重构这样的东西以支持触摸事件的任何建议?
2021-04-09 15:24:43