【问题标题】:jQuery UI Sortable: Multi-item selectjQuery UI 可排序:多项目选择
【发布时间】:2026-01-24 15:05:02
【问题描述】:

我想(通过键盘操作符)选择无序列表中的多个项目,然后使用 jQuery Sortable 将它们拖到同一列表中的另一个点。

【问题讨论】:

标签: jquery jquery-ui jquery-ui-sortable


【解决方案1】:
  1. 选择要排序的项目
  2. 创建自定义助手
  3. 在排序完成之前隐藏所选项目
  4. 根据选择调整占位符的大小
  5. 从当前位置手动分离所选项目,并在排序后将它们附加到新位置
  6. 在第 5 步之后显示隐藏的项目(撤消第 3 步

我是这样做的(修改我的answer 为这个question):

$(function() {
  $('ul').on('click', 'li', function() {
    $(this).toggleClass('selected');
  });

  $("ul").sortable({
    revert: true,
    helper: function(e, item) {
      if (!item.hasClass('selected')) item.addClass('selected');
      var elements = $('.selected').not('.ui-sortable-placeholder').clone();
      var helper = $('<ul/>');
      item.siblings('.selected').addClass('hidden');
      return helper.append(elements);
    },
    start: function(e, ui) {
      var elements = ui.item.siblings('.selected.hidden').not('.ui-sortable-placeholder');
      ui.item.data('items', elements);
      var len = ui.helper.children().length;
      var height = ui.item.height() + 5;
      ui.helper.height((len * height))
      ui.placeholder.height((len * height))
    },
    receive: function(e, ui) {
      ui.item.before(ui.item.data('items'));
    },
    stop: function(e, ui) {
      ui.item.siblings('.selected').removeClass('hidden');
      $('.selected').removeClass('selected');
    }
  });

});
* {
  margin: 0;
  padding: 0;
}
#sortable {
  width: 300px;
  padding: 5px;
  margin-right: 100px;
  background: #eee;
  border: 1px solid black;
}
ul li {
  width: 250px;
  margin: 5px;
  padding: 5px;
  font-size: 1.2em;
  cursor: move;
  background-color: white;
  list-style-type: none;
}
.selected {
  background: red !important;
}
.hidden {
  display: none !important;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="//code.jquery.com/ui/1.9.2/jquery-ui.js"></script>
<ul id="sortable">
  <li>Item #1</li>
  <li>Item #2</li>
  <li>Item #3</li>
  <li>Item #4</li>
  <li>Item #5</li>
</ul>

在演示中单击每个项目来选择多个项目

【讨论】:

  • 这种方法没问题,但是当我在多个可排序区域之间测试拖动项目时,我在使用hidden 类时遇到了问题,所以我改用hide() 方法进行了修复。实际上 sortable 使用 hide 而不是 hidden 类,所以最好使用相同的。