jQuery UI Sortable 忽略与项目选择器不匹配的项目

标签 jquery jquery-ui jquery-ui-sortable

我有一个包含两级分组的表的特殊情况。我正在处理一些遗留代码,这些代码使用带有类“group”和“member”的交错行的表构造来显示组及其所有关联成员的层次结构。

这是一个简化的表格:

<table id="my_table">  
  <thead>  
    <tr>
      <th>column 1</th>
    </tr>
  </thead>
  <tbody>
    <tr class="group">
      <td>group A</td>
    </tr>
    <tr class="member">
      <td>member A1</td>
    </tr>
    <tr class="member">
      <td>member A2</td>
    </tr>
    <tr class="group">
      <td>group B</td>
    </tr>
    <tr class="group">
      <td>group C</td>
    </tr>
    <tr class="member">
      <td>member C1</td>
    </tr>
    <tr class="member">
      <td>member C2</td>
    </tr>
    <tr class="member">
      <td>member C3</td>
    </tr>
    <tr class="group">
      <td>group D</td>
    </tr>
  </tbody>
</table>

我尝试使用 jQuery 可排序来允许用户将成员表行拖放到表中的所需位置:

$("#my_table tbody").sortable({items: '> .member', forceHelperSize: true });

我可以将“成员”行拖动到其他“成员”行中以对它们重新排序...该部分工作正常,只是我无法将“成员”行拖动到下方” D 组”(因为其下方没有“成员”行)。

如果我删除“items”选项,那么“group”行也可以被拖动——这是我不想要的。

我尝试删除“items”选项并添加“start”事件处理程序,以在尝试移动“group”行时取消可排序。

start: function(event, ui) {
  if (ui.item.hasClass("group")) {
    $(this).sortable('cancel');  
  }
}

不幸的是,“取消”操作会导致:TypeError“null is not an object”(this.helper.outerWidth)以及表格显示损坏(移动的“group”行被叠加)及其下面的行)。

有人有另一种方法来抑制“组”行的可拖动性(同时仍然允许将“成员”行拖动到表中的任何行位置)吗?

最佳答案

您可以通过将 .group 指定为 cancel 的值来解决此问题选项。

Prevents sorting if you start on elements matching the selector.

如果你使用items选项,不匹配的元素将被sortable完全忽略,但如果你使用cancel,这些元素将被考虑但不会被排序可拖动。

$("#my_table tbody").sortable({
  cancel: ".group",
  forceHelperSize: true
});
<link rel="stylesheet" href="//code.jquery.com/ui/1.11.2/themes/smoothness/jquery-ui.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="//code.jquery.com/ui/1.11.2/jquery-ui.js"></script>
<table id="my_table">
  <thead>
    <tr>
      <th>column 1</th>
    </tr>
  </thead>
  <tbody>
    <tr class="group">
      <td>group A</td>
    </tr>
    <tr class="member">
      <td>member A1</td>
    </tr>
    <tr class="member">
      <td>member A2</td>
    </tr>
    <tr class="group">
      <td>group B</td>
    </tr>
    <tr class="group">
      <td>group C</td>
    </tr>
    <tr class="member">
      <td>member C1</td>
    </tr>
    <tr class="member">
      <td>member C2</td>
    </tr>
    <tr class="member">
      <td>member C3</td>
    </tr>
    <tr class="group">
      <td>group D</td>
    </tr>
  </tbody>
</table>

关于jQuery UI Sortable 忽略与项目选择器不匹配的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27100600/

相关文章:

jquery - 在 jQuery 中通过 Ajax 加载另一个类时隐藏类

jquery - div 中的文本在 jquery 下拉菜单中一起下拉

asp.net-mvc-3 - 使用 mvc3 下拉列表的 jquery 自动完成

带有 Ajax 和静态 div 的 jQuery 选项卡

javascript - 如果 JQuery UI 布局没有显示任何内容,则隐藏北面板

javascript - jQuery UI 的 Sortable 可以处理项目选项的复杂选择器吗?

javascript - jQuery:如何将可排序的 ('serialize' ) 数组从最后一个反转到第一个?

javascript - 如何在 ng-bind angularjs 中使用 toFixed(2)

javascript - 使用 oncontextmenu 和 js/jquery 左键单击上下文菜单

javascript - JQuery 可排序表插件不适用于选项卡