gpt4 book ai didi

javascript - 如何使用 jQuery UI 拖动元素时触发 droppable 事件?

转载 作者:行者123 更新时间:2023-12-02 20:51:50 25 4
gpt4 key购买 nike

我正在做一个巨大的项目,它应该像每个软件一样在性能方面表现良好。但我在拖放对象方面遇到了困难。

让我从我的代码开始。这是我的 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 事件,因为页面中的可放置对象太多,会消耗浏览器的大量 RAM 并且页面崩溃。

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

最佳答案

您需要进行一定程度的碰撞检测。 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>

关于javascript - 如何使用 jQuery UI 拖动元素时触发 droppable 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61587877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com