【问题标题】:Jquery ui drag, drop and sortJquery ui拖放和排序
【发布时间】:2017-05-27 12:18:45
【问题描述】:

我有 6 个选项可以拖放到 6 个可放置区域。可放置区域不应有多个拖动元素。如果一个可放置区域已经有一个元素并放置了另一个元素,它应该只是将现有元素转移到下一个兄弟元素。

我想要和 jquery sortable 完全一样,但拖放后应该会像这样工作。

找到fiddle demo here.

$(".qselected").sortable();
$(".qselected").disableSelection();

$(".qitem").draggable({
    containment : "#container",
    helper : 'clone',
    revert : 'invalid'
});

$(".qselected, #qlist").droppable({
    hoverClass : 'ui-state-highlight',
    drop : function(ev, ui) {

    if($('.qselected div').length){
        //$('.qselected div').eq(0).remove().appendTo();
    } 
    $(ui.draggable).clone().appendTo(this);
    $(ui.draggable).remove();

        $(".qitem").draggable({
            containment : "#container",
            helper : 'clone',
            revert : 'invalid'
        });
    }
});

【问题讨论】:

  • 我认为你想要的是拖入可排序的。在可拖动中,使用connectToSortable 选项。

标签: jquery jquery-ui drag-and-drop jquery-ui-sortable jquery-ui-draggable


【解决方案1】:

根据您的描述不确定可排序部分,但这是处理可放置的一种方法:

示例:http://jsfiddle.net/Twisty/s08pf0g9/

JavaScript

$(document).ready(function() {
  $(".qselected").sortable();
  $(".qselected").disableSelection();

  $(".qitem").draggable({
    containment: "#container",
    revert: 'invalid'
  });

  $(".qselected, #qlist").droppable({
    hoverClass: 'ui-state-highlight',
    drop: function(ev, ui) {
      var $item = ui.draggable.detach();
      var $target = $(ev.target);

      if ($target.find(".qitem").length === 0) {
        console.log("Target is empty, dropping here.");
        $item.attr("style", "");
        $item.appendTo($target);
      } else {
        console.log("Target is full.");
        $(".qselected").each(function(i, el) {
          if ($(el).find(".qitem").length === 0) {
            console.log("target " + i + " is empty, dropping here.");
            $item.attr("style", "");
            $item.appendTo($(el));
            return false;
          }
        });
      }
    }
  });
});

首先,分离拖动的项目。第二次检查目标是否已经包含.qitem。如果是,则查找下一个空槽。

这不会像可排序的那样工作。正如我在 cmets 中提到的,我建议创建一个空的可排序对象(作为目标),然后用户可以拖入项目。这可能看起来像:

http://jsfiddle.net/Twisty/s08pf0g9/1/

$(document).ready(function() {
  $("#sorting").sortable({
    items: "> div.qselected",
    receive: function(e, ui) {
      var $item = $(this).find(".ui-draggable");
      $item.removeClass("ui-draggable");
      $item.next().append($item);
    }
  });
  $("#sorting").disableSelection();

  $(".qitem").draggable({
    containment: "#container",
    connectToSortable: "#sorting",
    helper: 'clone',
    revert: 'invalid'
  });
});

【讨论】:

  • 谢谢,Twisty。您的两种解决方案都对我有所帮助。我根据需要创建了另一个。将您的代码与我的代码混合在一起。 jsfiddle.net/locateganesh/r24oka6n。我在放置元素后禁用了拖动。默认情况下我一直禁用排序,并且在删除后我确实启用了它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-14
  • 1970-01-01
  • 1970-01-01
  • 2012-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多