javascript - JQuery 可排序嵌套可排序 div

标签 javascript jquery jquery-ui nested jquery-ui-sortable

这个问题跟这个有关系Nest jQuery UI sortables ,但我无法用它解决我的问题。

这就是问题所在:我有一个包含项目的主容器,这些项目是 div,可以是未分组的项目或组,其中包含其他项目。我可以通过拖动 .multiply-group div 来定义新组,然后我可以一次拖动所有组。这是代码:

    <body>
    <div class="multiply-container">
        <div class="row multiply">Item 1</div>
        <div class="row multiply">Item 2</div>
        <div class="row multiply">Item 3</div>
        <div class="row multiply-group"> Group 1</div>
        <div class="row multiply">Item 4</div>
        <div class="row multiply-group"> Group 2 </div>
        <div class="row multiply">Item 5</div>
    </div>

    <script>

        var groupWrap = function(){

            $('.multiply-container').children().each(function(index, item){
                if($(item).hasClass('multiply-group')){
                    $(item).nextUntil('.multiply-group').addBack().wrapAll('<div class="locked"></div>');
                }
            });

        };

        var updateMultiply = function(){

            var $container = $('.multiply-container');

            $container.children().each(function(index, item){
                if($(item).hasClass('locked')){
                    $(item).children().each(function(i, elem){

                        $container.append($(elem));

                    });
                    $(item).remove();
                }


            });

            groupWrap();

            $('.multiply-container').sortable({
                connectWith: '.locked',
                helper: 'clone',
                placeholder: '.multiply-placeholder',
                axis: 'y',
                update: function(){
                    updateMultiply();
                }
            });

            $('.locked').sortable({
                connectWith: '.multiply-container, .locked',
                helper: 'clone',
                axis: 'y',
                update: function(){
                    updateMultiply();
                },
                receive: function(event, ui){

                    if($(ui.item).hasClass('locked')){
                        $(ui.sender).sortable('cancel');

                        return false;
                    }

                }
            });

        };




        updateMultiply();

    </script>

</body>

这是一个 fiddle :https://jsfiddle.net/antoq/n1w6e6ar/2/

问题是,当我将 last 组容器拖出主容器底部时,它停在那里而不是返回到主容器,我收到以下错误:

Uncaught HierarchyRequestError: Failed to execute 'insertBefore' on 'Node': The new child element contains the parent.

有人可以帮我了解发生了什么以及如何解决吗?

最佳答案

也许您在编写代码时想得太多了:两个可排序对象、不必要的事件取消、连接已经连接的列表等。

最后一组卡在底部或消失的问题似乎是在每次列表更新时重新附加 .sortable() 的问题,这种情况会导致意外行为。但是,简单地删除该重复项会使您的列表表现得不像您预期​​的那样,因此需要进行一些额外的重构:

1) 仅使用一次 .sortable() 调用,然后定义哪些项目将是可排序的(即 .row.locked 用于分别为个体排序和分组排序)。这已经足够满足您的需求了。这里唯一的问题是将一个组拖到另一个组的中间会增加另一个嵌套级别;

2) 为了防止额外的嵌套层级,在再次包装它们之前打开 .locked 组。

var groupWrap = function() {
  $('.locked').children().unwrap();
  $('.multiply-container')
    .children().each(function(index, item) {
      if ($(item).hasClass('multiply-group')) {
        $(item).nextUntil('.multiply-group').addBack().wrapAll('<div class="locked"></div>');
      }
    });
};

var updateMultiply = function() {

  var $container = $('.multiply-container');

  $container.children().each(function(index, item) {
    if ($(item).hasClass('locked')) {
      $(item).children().each(function(i, elem) {

        $container.append($(elem));

      });
      $(item).remove();
    }
  });
};

$('.multiply-container').sortable({
  items: '.row, .locked',
  helper: 'clone',
  axis: 'y',
  update: function() {
    update();
  }
});

var update = function() {
  updateMultiply();
  groupWrap();
};

update();
body {
   background-color: #eee;
   padding: 50px;
 }
 .multiply {
   height: 45px;
   width: 100%;
   background-color: violet;
   border: 1px solid purple;
   margin: 0 auto;
   text-align: center;
 }
 .multiply-group {
   height: 25px;
   width: 100%;
   background-color: teal;
   border: 2px solid orange;
   margin: 0 auto;
   text-align: center;
 }
 .multiply-container {
   background-color: lime;
   padding: 20px;
 }
 .multiply-placeholder {
   height: 65px;
   width: 100%;
 }
 .locked {
   padding: 20px;
   background-color: cyan;
   border: 1px solid blue;
 }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script>
<body>
  <div class="multiply-container">
    <div class="row multiply">Item 1</div>
    <div class="row multiply">Item 2</div>
    <div class="row multiply">Item 3</div>
    <div class="row multiply-group">Group 1</div>
    <div class="row multiply">Item 4</div>
    <div class="row multiply-group">Group 2</div>
    <div class="row multiply">Item 5</div>
  </div>
</body>

关于javascript - JQuery 可排序嵌套可排序 div,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35231678/

相关文章:

html - 如何将 jQuery UI 按钮水平对齐到 div?

javascript - Titanium 应用程序可以访问 ios 共享功能吗?

javascript - 通过 JQuery ajax 提交带有键的数组

javascript - SetState 导致多次重新渲染

javascript - 如何将选项卡的焦点从一个元素转移到另一个元素?

javascript - jquery datatable - 设置列宽和换行文本

javascript - 如何使用原型(prototype) js 库中止/取消请求?

jquery - Flexslider 2 无法使用 $(window).load() 与最新的 jquery 3.2.1 配合使用

javascript - Kendo Grid 从按钮导航行(第一个、后一个、下一个、最后一个)

asp.net-mvc - IE8 中 jquery UI 弹出窗口内的 ajax 表单问题