【问题标题】:Select Cells On A Table By Dragging通过拖动选择表格上的单元格
【发布时间】:2016-02-04 13:54:47
【问题描述】:

我在查看this question 并看到了对 iPhone 游戏的引用,在该游戏中,您可以在屏幕上拖动选择字母。

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

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

感谢Cacoo 提供的性感图表。这就像一个在线visio,非常好。看看;)

【问题讨论】:

  • 有趣的挑战(和图表)。诀窍是防止浏览器中的默认文本选择...

标签: javascript


【解决方案1】:

这是一个工作原型: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。
  • 查看备用链接 :) 刚刚添加。
  • toggleClass 的使用可以这么说只是一种 hack。在适当的单元可测试实现中,您将使用带有布尔值的实例,或类似的东西。
  • 此外,更改状态逻辑以便取消选择 mouseup 上的所有内容(这就是您所描述的,对吗?)是微不足道的。在这种情况下,mouseup 事件上的$("#our_table td").removeClass("highlighted") 将是适当的黑客攻击。
  • 对于那些希望它在新创建的表(通过 ajax)上工作的人,请参阅此 Fiddlejsfiddle.net/Brv6J/803
【解决方案2】:

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

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

【讨论】:

  • 更好,你会使用 Dojo 或 jQuery(或者更高级别的东西)
  • mouseover 函数中添加table.find(".selected").removeClass("selected"); 使其更像电子表格,即在选定区域上移动时取消选择单元格。更新fiddle
  • 这很棒,适用于班次选择。如果它也支持 ctrl-selection 那就太棒了。
【解决方案3】:

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

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

【讨论】:

  • 无论如何你可以轻松地重构它以支持触摸事件?
  • @hlyates 关于如何重构这样的东西以支持触摸事件有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-17
  • 2018-07-05
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多