当没有元素存在时,拖放不起作用

时间:2016-10-12 06:47:32

标签: javascript jquery html css

我正在两个容器之间进行拖放,当容器中至少存在一个元素时,它正常工作。但是当我丢弃其中任何一个元素并试图将它们放回去时,它就无法正常工作。

HTML: -

<div class="portlet-body ui-sortable" id="sortable_portlets">
   <div class="sortable row-fluid pull-left packlistWrap excersissestoaddtopac">First DIV
      <div class="portlet portlet-sortable light bordered packlistupdate packlist" tag-id="2" video-id="4">
         <div class="portlet-title">
            <div class="row">
               <div class="col-md-6"><span>TAG A</span></div>
               <div class="col-md-6"><span></span></div>
            </div>
         </div>
      </div>
   </div>


<hr>
<hr>
<hr>
<hr>

   <div class="mid-title"><span class="caption-subject font-green sbold uppercase ">SECOND DIV</span></div>
   <div id="excersisesinpac">
      <div class="portlet portlet-sortable light bordered packlist" video-id="2">
         <div class="portlet-title">
            <div class="row">
               <div class="col-md-6"><span>TAG B</span></div>
               <div class="col-md-6"><span></span></div>
            </div>
         </div>
      </div>


        <div class="portlet portlet-sortable light bordered packlistupdate packlist" tag-id="2" video-id="4">
         <div class="portlet-title">
            <div class="row">
               <div class="col-md-6"><span>TAG A</span></div>
               <div class="col-md-6"><span></span></div>
            </div>
         </div>
      </div>

   </div>
</div>

JavaScript的: -

var PortletDraggable = function () {

    return {
        //main function to initiate the module
        init: function () {

            if (!jQuery().sortable) {
                return;
            }

            $("#sortable_portlets").sortable({
                connectWith: ".portlet",
                items: ".portlet", 
                opacity: 0.8,
                handle : '.portlet-title',
                coneHelperSize: true,
                placeholder: 'portlet-sortable-placeholder',
                forcePlaceholderSize: true,
                tolerance: "pointer",
                helper: "clone",
                tolerance: "pointer",
                forcePlaceholderSize: !0,
                helper: "clone",
                cancel: ".portlet-sortable-empty, .portlet-fullscreen", // cancel dragging if portlet is in fullscreen mode
                revert: 250, // animation in milliseconds
                update: function(b, c) {
                    if (c.item.prev().hasClass("portlet-sortable-empty")) {
                        c.item.prev().before(c.item);
                    }   
                },


                stop: function(event, ui) {
                                }
            });
        }
    };
}();

jQuery(document).ready(function() {
    PortletDraggable.init();
});

https://jsfiddle.net/33keyjxx/26/

3 个答案:

答案 0 :(得分:2)

在sortable()方法中使用

dropOnEmpty:true,

答案 1 :(得分:2)

您可以如下更改代码。您将得到想要的结果。 我刚刚添加了两个类类型选择器.packlistWrap.mid-title。我还更改了connectWith

$("#sortable_portlets") => $(".packlistWrap, .mid-title, #sortable_portlets")

connectWith: ".packlistWrap, .mid-title",

其他代码相同。

$(".packlistWrap, .mid-title, #sortable_portlets").sortable({
  connectWith: ".packlistWrap, .mid-title, .portlet",
  dropOnEmpty: true,
  items: ".portlet",
  opacity: 0.8,
  handle: '.portlet-title',
  coneHelperSize: true,
  placeholder: 'portlet-sortable-placeholder',
  forcePlaceholderSize: true,
  tolerance: "pointer",
  helper: "clone",
  tolerance: "pointer",
  forcePlaceholderSize: !0,
  helper: "clone",
  cancel: ".portlet-sortable-empty, .portlet-fullscreen", // cancel dragging if portlet is in fullscreen mode
  revert: 250, // animation in milliseconds
  update: function(b, c) {
    if (c.item.prev().hasClass("portlet-sortable-empty")) {
      c.item.prev().before(c.item);
    }
  },
  stop: function(event, ui) {}
});

答案 2 :(得分:1)

在您的代码中,$("#sortable_portlets").sortable(...)定位到单个元素。您需要定位两个单独的可排序容器,在您的情况下分别为#excersisesinpac.excersissestoaddtopac。在下面的示例中,请注意,我已经将类sortable添加到了#exercisesinpac(因为您已经在.excersissestoaddtopac元素上有了这个类)。然后,我修改了对$.sortable的调用,以使其以.sortable$("#sortable_portlets .sortable").sortable(...)为目标的两个元素。

var PortletDraggable = function() {

  return {
    //main function to initiate the module
    init: function() {

      if (!jQuery().sortable) {
        return;
      }

      $("#sortable_portlets .sortable").sortable({
        connectWith: ".sortable",
        items: ".portlet",
        opacity: 0.8,
        handle: '.portlet-title',
        coneHelperSize: true,
        placeholder: 'portlet-sortable-placeholder',
        forcePlaceholderSize: true,
        tolerance: "pointer",
        helper: "clone",
        tolerance: "pointer",
        forcePlaceholderSize: !0,
        helper: "clone",
        cancel: ".portlet-sortable-empty, .portlet-fullscreen", // cancel dragging if portlet is in fullscreen mode
        revert: 250, // animation in milliseconds
        update: function(b, c) {
          if (c.item.prev().hasClass("portlet-sortable-empty")) {
            c.item.prev().before(c.item);
          }
        },


        stop: function(event, ui) {



        }


      });
    }
  };
}();

jQuery(document).ready(function() {
  PortletDraggable.init();
});
body {
  padding: 1.25em;
}

div {
  position: relative;
}

.wire {
  position: relative;
  margin: 1.25em;
  padding: 1.25em;
  border: 1px solid;
}

.wire::before {
  padding: 0 1em;
}

.wire::before {
  position: absolute;
  top: -1.25em;
  left: 0;
  padding: 0 1em;
  color: white;
}

#sortable_portlets::before {
  content: "#sortable_portlets";
  background-color: #B683C3;
}

.sortable::before {
  content: ".sortable";
  background-color: #6373B6;
}

.portlet {
  min-width: 100px;
}

.portlet::before {
  content: ".portlet";
  background-color: #E06D10;
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.js"></script>

<div class="portlet-body ui-sortable wire" id="sortable_portlets">
  <div class="sortable row-fluid packlistWrap excersissestoaddtopac wire">
    <div class="portlet portlet-sortable light bordered packlistupdate packlist wire" tag-id="2" video-id="4">
      <div class="portlet-title">
        <div class="row">
          <div class="col-md-6"><span>TAG A</span></div>
          <div class="col-md-6"><span></span></div>
        </div>
      </div>
    </div>
  </div>

  <div id="excersisesinpac" class="sortable wire">
    <div class="portlet portlet-sortable light bordered packlist wire" video-id="2">
      <div class="portlet-title">
        <div class="row">
          <div class="col-md-6"><span>TAG B</span></div>
          <div class="col-md-6"><span></span></div>
        </div>
      </div>
    </div>


    <div class="portlet portlet-sortable light bordered packlistupdate packlist wire" tag-id="2" video-id="4">
      <div class="portlet-title">
        <div class="row">
          <div class="col-md-6"><span>TAG A</span></div>
          <div class="col-md-6"><span></span></div>
        </div>
      </div>
    </div>

  </div>
</div>