1

I have two pairs of drag/drop/sortable lists using JqueryUI.http://jqueryui.com/demos/sortable/

My problem is that I can move items from sortable1, sortable2 into sortable3 and 4. I want them to be debated. So items can only move between ( 1 and 2 ) and (3 and 4).

Do I have to assign a different class to sortable3 and sortable4 for this to happen? Is there anyway I can somehow combine the function?

$(function() {
        $( "ul.droptrue" ).sortable({
            connectWith: "ul"
        });

        $( "ul.dropfalse" ).sortable({
            connectWith: "ul",
            dropOnEmpty: false
        });

        $( "#sortable1, #sortable2" ).disableSelection();
        $( "#sortable3, #sortable4").disableSelection();

});


<ul id="sortable1" class='droptrue'>
    <li class="ui-state-default">Can be dropped..</li>
    <li class="ui-state-default">..on an empty list</li>
    <li class="ui-state-default">Item 3</li>
    <li class="ui-state-default">Item 4</li>
    <li class="ui-state-default">Item 5</li>
</ul>

<ul id="sortable2" class='dropfalse'>
    <li class="ui-state-highlight">Cannot be dropped..</li>
    <li class="ui-state-highlight">..on an empty list</li>
    <li class="ui-state-highlight">Item 3</li>
    <li class="ui-state-highlight">Item 4</li>
    <li class="ui-state-highlight">Item 5</li>
</ul>
<ul id="sortable3" class='droptrue'>
    <li class="ui-state-default">Can be dropped..</li>
    <li class="ui-state-default">..on an empty list</li>
    <li class="ui-state-default">Item 3</li>
    <li class="ui-state-default">Item 4</li>
    <li class="ui-state-default">Item 5</li>
</ul>

<ul id="sortable4" class='dropfalse'>
    <li class="ui-state-highlight">Cannot be dropped..</li>
    <li class="ui-state-highlight">..on an empty list</li>
    <li class="ui-state-highlight">Item 3</li>
    <li class="ui-state-highlight">Item 4</li>
    <li class="ui-state-highlight">Item 5</li>
</ul>
4

2 回答 2

4

由于您的droptruedropfalse参数,以及您在每个列表上都有唯一 id 的事实,您不需要更改标记,您只需要.sortable稍微不同地调用函数:

    $( "#sortable1" ).sortable({
        connectWith: "#sortable2"
    });

    $( "#sortable2" ).sortable({
        connectWith: "#sortable1",
        dropOnEmpty: false
    });

    $( "#sortable3" ).sortable({
        connectWith: "#sortable4",
    });

    $( "#sortable4" ).sortable({
        connectWith: "#sortable3",
        dropOnEmpty: false
    });

或者,您可以使用对象来设置每个可排序项目的参数,并遍历对象,使用参数应用于.sortable每个:

var lists = [{"listid":"#sortable1", "connectid":"#sortable2", "drop":true},
 {"listid":"#sortable2", "connectid":"#sortable1", "drop":false},
 {"listid":"#sortable3", "connectid":"#sortable4", "drop":true},
 {"listid":"#sortable4", "connectid":"#sortable3", "drop":false}];

$.each(lists, function(i, list) {
    $(list.listid).sortable({
        connectWith: list.connectid,
        dropOnEmpty: list.drop
    });
});

编辑:
根据您的评论,这就是您可以绑定另一个列表(#sortable5,连接到#sortable3#sortable4)的方式。 请注意使用多个 id,以逗号分隔

var lists = [{"listid":"#sortable1", "connectid":"#sortable2", "drop":true},
 {"listid":"#sortable2", "connectid":"#sortable1", "drop":false},
 {"listid":"#sortable3", "connectid":"#sortable4, #sortable5", "drop":true},
 {"listid":"#sortable4", "connectid":"#sortable3, #sortable5", "drop":false},
 {"listid":"#sortable5", "connectid":"#sortable3, #sortable4", "drop":false}];
于 2012-06-25T22:21:27.053 回答
0

感谢大家发帖然后回答这个问题。我也遇到过类似的挑战,你的回答给了我解决它所需的灵感。我也有多个可排序列表,不想在排序组之间混合。在我的情况下,组的数量取决于数据,所以我不知道我会有多少。这是我想出的解决方案。

$(function() {    
  if ($.cookie("sortGroupsCnt")) {
      var grpcnt = Number($.cookie("sortGroupsCnt"));        
      for (i = 0; i < grpcnt; i++) { 
          var connectClass = ".s" + i;  
          $(connectClass).sortable({
              connectWith: connectClass,
              dropOnEmpty: true
          }).disableSelection(); 
      }
  };  

});

在我的 PHP 逻辑中,在每个排序组中,我使用相同的类代码创建多个 UL。所以在第 1 组中,所有 UL 都有 class="s0"。在第 2 组中,所有 UL 都有 class="s1" 等。然后我创建一个名为“sortGroupCnt”的 cookie,它是创建的排序组的数量。

再次感谢大家。

于 2014-09-04T17:17:00.213 回答