【问题标题】:jQuery-UI sortable / droppablejQuery-UI 可排序/可放置
【发布时间】:2018-01-21 00:14:52
【问题描述】:

我正在创建一个界面,以便用户可以拖放元素,然后也可以对它们进行排序。拖放/排序功能工作顺利,但是,当我试图对“dropzone”中的拖放元素进行排序时,而不是我试图拖动的元素,它是正在移动的元素源。花了一些时间,但我发现这是因为.clone(true).clone(false) 可能会发生这种事情。所以我决定删除它,但现在排序 div 中的元素似乎.. 坏了。

这是 HTML(引导程序 4 上下文):

<div class="row">
    <div class="card col-3">
        <div class="card-body">
            <div class="card draggable-element" data-target="textarea">
                <div class="card-body">
                    This is some text within a card body. 1
                </div>
            </div>
            <div class="card draggable-element" data-target="textfield">
                <div class="card-body">
                    This is some text within a card body. 2
                </div>
            </div>
            <div class="card draggable-element" data-target="fileinput">
                <div class="card-body">
                    This is some text within a card body. 3
                </div>
            </div>
        </div>
    </div>

    <div class="card col-6 offset-1">
        <div class="card-body dropzone">

        </div>
    </div>
</div>

这就是 JS:

$(document).ready(function() {
    $('.draggable-element').draggable({
        revert: 'invalid'
        , appendTo: '.dropzone'
        , helper: 'clone'
    });

    $('.dropzone').droppable({
        drop: function(event, ui) {
            var item = $(ui.draggable);
            if (!item.hasClass('copy')) {
                var newy = item.clone(true, true);
                newy.addClass('copy');
                //console.log(newy);
                newy.draggable({
                    revert: 'invalid'
                    , stack: ".draggable"
                });
            } else {
                $(this).append(item);
            }
            $('.dropzone').append(newy);
        }
    }).sortable({
        axis: 'y'
        , revert: true
        , refreshPositions: true
        , placeholder: 'placeholder'
        , items: '.copy'
        , forcePlaceholderSize: true
    });
});

所以.clone() 中的参数,不管它们是什么,大多数时候,当我拖动一个克隆的元素时,原来的元素会移动,但有时它会起作用,我不知道为什么。没有参数,好的元素被拖动,但没有堆叠和排序的概念,元素停留在我放下它的地方,其他元素会根据它的位置调整它们的位置。

有没有办法解决这种问题?

提前谢谢你

【问题讨论】:

    标签: javascript jquery jquery-ui jquery-ui-sortable jquery-ui-draggable


    【解决方案1】:

    您不需要droppablesortable 方法就足够了,因为它是draggablesortable。所以你可以这样做:

    $('.dropzone').sortable();
    
    $('.draggable-element').draggable({
      connectToSortable: '.dropzone',
      revert: 'invalid',
      helper: 'clone'
    });
    

    Online demo (jsFiddle)

    【讨论】:

    • 从 60 行 js 到 9 行...谢谢,它现在就像一个魅力 :')
    【解决方案2】:

    如果要移动元素“可拖动元素”,则必须设置为可拖动“区域”卡体(更高标签)。但是这个标签在你的 html 代码中有两次。 检查我的现场示例。

    Live demo

    <div class="row">
        <div class="card col-3">
            <div class="card-body">
                <div class="card draggable-element" data-target="textarea">
                    <div class="card-body">
                        This is some text within a card body. 1
                    </div>
                </div>
                <div class="card draggable-element" data-target="textfield">
                    <div class="card-body">
                        This is some text within a card body. 2
                    </div>
                </div>
                <div class="card draggable-element" data-target="fileinput">
                    <div class="card-body">
                        This is some text within a card body. 3
                    </div>
                </div>
            </div>
        </div>
      </div>
    
      <div class="card col-6 offset-1">
        <div class="card-bodyX dropzone">
          ...
        </div>
      </div>
    
    $(document).ready(function() {
      $('.card-body').draggable({
        revert: 'invalid',
        connectToSortable: '.dropzone',
        scroll: false,
        helper: 'clone'
      });
    
      $('.dropzone').sortable({
        distance: 0,      
      });
    });
    

    【讨论】:

    • 感谢您的回答,但是我有 2 个问题,尽管我认为 connectToSortable 可能是我一直在寻找的:我不能再在 dropzone 上放置任何元素,即使我删除了.card-body,并指定可拖动区域应该更高,从而使内部 3 个 div 的整个 div 移动,或者文本移动
    猜你喜欢
    • 2012-06-23
    • 2013-03-20
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 2011-11-30
    • 2014-01-24
    相关资源
    最近更新 更多