如何在使用jQuery UI拖动元素时触发可放置事件?

问题描述 投票:0回答:1

我正在做一个庞大的项目,与每个软件一样,它的性能应该很好。但是我正在为拖放对象而苦苦挣扎。

让我从我的代码开始。这是我的HTML:

<div class="drag-me"></div>
<div class="drop-on-me"></div>

这是我的JavaScript:

$('.drag-me').draggable();

$('.drop-on-me').hover(function(){
   let el = $(this);
   el.droppable({
      drop: function(){
         console.log("dropped!");
      }
   });
}, function(){
   let el = $(this);
   el.droppable('destroy');
});

Codepen Example

我需要在拖动对象时悬停时触发droppable事件,因为页面中有很多droppable对象,并且浏览器会占用大量RAM,并且页面崩溃。

当我将鼠标悬停在可拖动对象上时如何触发?

javascript jquery jquery-ui
1个回答
0
投票

您将需要进行碰撞检测。 drag事件可以阻止其他事件,例如hover冒泡。考虑下面的代码片段。

$(function() {

  function getBounds(el) {
    var p = {
      tl: $(el).position()
    };
    p['tr'] = {
      top: p.tl.top,
      left: p.tl.left + $(el).width()
    };
    p['bl'] = {
      top: p.tl.top + $(el).height(),
      left: p.tl.left
    };
    p['br'] = {
      top: p.bl.top,
      left: p.tr.left
    };
    return p;
  }

  function isOver(el, map) {
    var myPos = getBounds(el);
    var tObj = false;
    $.each(map, function(k, v) {
      if (myPos.tl.left > v.tl.left && myPos.tl.left < v.tr.left && myPos.tl.top > v.tl.top && myPos.tl.top < v.bl.top) {
        console.log("Over", k);
        tObj = $(".drop-on-me").eq(k);
      }
    });
    return tObj;
  }

  function makeDrop(el) {
    if (!$(el).hasClass("ui-droppable")) {
      $(el).droppable({
        addClasses: false,
        drop: function() {
          console.log("Item Dropped.");
        },
        out: function() {
          $(this).droppable("destroy");
        }
      });
    }
  }

  var dropPositions = [];

  $(".drop-on-me:visible").each(function(i, el) {
    dropPositions.push(getBounds(el));
  });

  console.log("Mapping complete.", dropPositions);

  $('.drag-me').draggable({
    start: function() {
      console.log("Drag Start.");
    },
    stop: function() {
      console.log("Drag Stop.");
    },
    drag: function(e, ui) {
      var target = isOver(ui.helper, dropPositions);
      if (target) {
        console.log("Make Drop, Index: " + target.index());
        makeDrop(target);
      }
    }
  });
});
.drag-me {
  width: 30px;
  height: 30px;
  background-color: rgba(255, 0, 0, 0.75);
  border: 1px solid #000;
  border-radius: 3px;
  z-index: 300;
}

.drop-on-me {
  width: 100px;
  height: 100px;
  background-color: rgba(0, 0, 255, 0.75);
  border: 1px solid #000;
  border-radius: 3px;
  position: absolute;
}

.drop-on-me.top {
  left: 80px;
  top: 10px;
}

.drop-on-me.mid {
  left: 40px;
  top: 120px;
}

.drop-on-me.bot {
  left: 240px;
  top: 640px;
}
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<div class="drag-me"></div>
<div class="drop-on-me top"></div>
<div class="drop-on-me mid"></div>
<div class="drop-on-me bot"></div>
© www.soinside.com 2019 - 2024. All rights reserved.