JQuery UI Sortable - 如何在一个容器中对两种类型的项目进行排序

Posted

技术标签:

【中文标题】JQuery UI Sortable - 如何在一个容器中对两种类型的项目进行排序【英文标题】:JQuery UI Sortable - How to sort two types of items in one container 【发布时间】:2020-06-29 01:23:39 【问题描述】:

我想在同一个容器中对两种类型的项目(不同的类名)进行排序。 每种类型的项目都应在其自身之间进行排序,而不会干扰其他项目类型。

我尝试了这段代码:但它不起作用:

$('#myItemsContainer').sortable(
    items: '.sortType1',
    start: function(event, ui) 
    ,
    change: function(event, ui) 
    ,
    update: function(event, ui) 
    
);

$('#myItemsContainer').sortable(
    items: '.sortType2',
    start: function(event, ui) 
    ,
    change: function(event, ui) 
    ,
    update: function(event, ui) 
    
);

html

<div id="myItemsContainer">

<div class="sortType1">Item Type 1</div>
<div class="sortType1">Item Type 1</div>
<div class="sortType1">Item Type 1</div>

<div class="sortType2">Item Type 2</div>
<div class="sortType2">Item Type 2</div>
<div class="sortType2">Item Type 2</div>

</div>

【问题讨论】:

欢迎来到 Stack Overflow。这根本不符合逻辑。由于所有项目都在同一个容器中,因此它们基本上是一起列出的。如果您不希望将它们排序在一起,则应考虑将它们移至各自的容器中。 @Twisty 谢谢你的回复。现在,我尝试使用 mouseOver 事件一个项目类型。因此,如果元素是项目类型 1,我调用项目类型 1 的可排序函数并销毁项目类型 2 的可排序(反之亦然)。这样容器仍然是相同的,我可以使用多种类型,而不仅仅是 2 种类型。但我希望有另一种官方方式。 您实际上是在使用一组新选项重新初始化 Sortable,因此无法在同一个容器上执行此操作。 【参考方案1】:

如前所述,您必须将它们包含在它们自己的容器中。这是一个例子。

$(function() 
  $("#myItemsContainer .list:eq(0)").sortable(
    items: "> .sortType1"
  );
  $("#myItemsContainer .list:eq(1)").sortable(
    items: "> .sortType2"
  );
);
#myItemsContainer 
  list-style-type: none;
  margin: 0;
  padding: 3px;
  width: 60%;
  border: 1px solid #000;


#myItemsContainer div[class^='sortType'] 
  margin: 0 3px 3px 3px;
  padding: 0.4em;
  padding-left: 1.5em;
  font-size: 1.4em;
  height: 18px;
  border: 1px solid #CCC;
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<div id="myItemsContainer">
  <div class="list">
    <div class="sortType1">Item Type 1</div>
    <div class="sortType1">Item Type 1</div>
    <div class="sortType1">Item Type 1</div>
  </div>
  <div class="list">
    <div class="sortType2">Item Type 2</div>
    <div class="sortType2">Item Type 2</div>
    <div class="sortType2">Item Type 2</div>
  </div>
</div>

【讨论】:

【参考方案2】:

您可以通过更新sortable 小部件的items 选项来实现此类行为。而且,您可以在鼠标悬停时更新它:

<div id="myItemsContainer">

    <div class="sortType1">Item Type 1</div>
    <div class="sortType1">Item Type 1</div>
    <div class="sortType1">Item Type 1</div>

    <div class="sortType2">Item Type 2</div>
    <div class="sortType2">Item Type 2</div>
    <div class="sortType2">Item Type 2</div>

</div>
$(function() 

    var elm = $('#myItemsContainer'); // cache for performance

    elm.sortable(
        items: '> .sortType1' // start with default selector
    ).on('mouseover', 'div', function(e) 

        if ($(e.currentTarget).hasClass('sortType1')) 
            // limit items to sortType1
            elm.sortable('option', 'items', '> .sortType1');
         else 
            // limit items to sortType2
            elm.sortable('option', 'items', '> .sortType2');
        
    );
);

【讨论】:

以上是关于JQuery UI Sortable - 如何在一个容器中对两种类型的项目进行排序的主要内容,如果未能解决你的问题,请参考以下文章

jquery UI sortable:如何更改“占位符”对象的外观?

jquery UI sortable:如何让原始可见直到下降?

jQuery UI 的 Sortable - 如何设置我的 'li.ui-state-highlight' 的样式?,总是出现白色 bg 颜色

如何让 jQuery UI 的 Draggable 和 Sortable 函数在 iPhone 上工作?

jQuery UI Sortable -- 如何取消拖动/排序项目的点击事件?

将 jquery ui-sortable 位置保存到 DB