gpt4 book ai didi

javascript - jQuery UI 在悬停时添加可放置事件监听器

转载 作者:行者123 更新时间:2023-11-28 03:09:16 25 4
gpt4 key购买 nike

我想在拖动一个对象并将鼠标悬停在可放置对象上时添加可放置事件监听器。

这是我的代码:

$('.will-be-drag').draggable({
helper: 'clone',
drag: function (event, ui) {
$('.will-be-drop').hover(function () {
$(this).droppable({
drop: function (event, ui) {
let item = ui.draggable;
console.log(item[0])
item.detach().appendTo($(this));
}
});
}, function () {
$(this).droppable('disable');
});

}
});

我的 HTML 是这样的:

<div class="will-be-drag"></div>
<div class="will-be-drag"></div>
<div class="will-be-drag"></div>

<?php
for($i = 0; $i <= 3000; $i++){
?>
<div class="will-be-drop"></div>
<?php
}
?>

我这样做是因为性能问题。我有 3k 可放置对象,但拖动时它会卡住。它必须添加 droppable 事件监听器,仅拖动 $('.will-be-drag') 对象并悬停 $('.will-be-drop') .

使用此代码,它仅在悬停时添加,而不是在拖动时添加。

我该怎么做?

我想要 javascript 呼吸,设置 3k 可放置对象时已经晚了。只有 30-40 个可拖动元素。这是一张 table 。

最佳答案

这是一个悬停示例:

$(function() {
$("#draggable").draggable();
$("#droppable").droppable({
drop: function(event, ui) {
$(this)
.find("p")
.html("Dropped!");
}
}).hover(function(e) {
// IN
$(this)
.addClass("ui-state-highlight");
}, function(e) {
// OUT
$(this)
.removeClass("ui-state-highlight");
});
});
#draggable {
width: 100px;
height: 100px;
padding: 0.5em;
float: left;
margin: 10px 10px 10px 0;
}

#droppable {
width: 150px;
height: 150px;
padding: 0.5em;
float: left;
margin: 10px;
}
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<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 id="draggable" class="ui-widget-content">
<p>Drag me to my target</p>
</div>

<div id="droppable" class="ui-widget-header">
<p>Drop here</p>
</div>

您可以看到,当您将鼠标悬停在可放置对象上时,它会突出显示。当你拖动时,它不会。我怀疑 hover 事件无法在持久的 mousedown 事件上冒泡。

建议这样做:

$(function() {
function makeDrops(n) {
var t = $(".ui-widget").eq(1);
for (var i = 1; i <= n; i++) {
$("<div>", {
id: "drop-" + i,
class: "will-be-drop ui-widget-content"
}).appendTo(t);
}
}

function inViewport(element, detectPartial) {
element = $(element);
detectPartial = (!!detectPartial); // if null or undefined, default to false

var viewport = $(window),
vpWidth = viewport.width(),
vpHeight = viewport.height(),
vpTop = viewport.scrollTop(),
vpBottom = vpTop + vpHeight,
vpLeft = viewport.scrollLeft(),
vpRight = vpLeft + vpWidth,

elementOffset = element.offset(),
elementTopArea = elementOffset.top + ((detectPartial) ? element.height() : 0),
elementBottomArea = elementOffset.top + ((detectPartial) ? 0 : element.height()),
elementLeftArea = elementOffset.left + ((detectPartial) ? element.width() : 0),
elementRightArea = elementOffset.left + ((detectPartial) ? 0 : element.width());

return ((elementBottomArea <= vpBottom) && (elementTopArea >= vpTop)) && ((elementRightArea <= vpRight) && (elementLeftArea >= vpLeft));
}

function markVisible(c) {
c.each(function(i, el) {
if (inViewport(el, true)) {
$(el).addClass("visible");
}
});
}

makeDrops(3000);

$(".will-be-drop").droppable({
drop: function(event, ui) {
let item = ui.draggable;
console.log("Drag Item " + item.text().trim() + " dropped to " + $(this).attr("id"));
item.detach().appendTo($(this));
},
over: function() {
$(this).addClass("ui-state-highlight");
},
out: function() {
$(this).removeClass("ui-state-highlight");
}
}).droppable("disable");

$('.will-be-drag').draggable({
helper: 'clone',
start: function(e, ui) {
markVisible($(".will-be-drop"));
$(".will-be-drop.visible").droppable("enable");
},
drag: function(e, ui) {
$(".will-be-drop.visible").droppable("disable").removeClass("visible");
markVisible($(".will-be-drop"));
$(".will-be-drop.visible").droppable("enable");
},
stop: function(e, ui) {
$(".will-be-drop").droppable("disable");
$(".will-be-drop.ui-state-highlight").removeClass("ui-state-highlight");
}
});
});
.will-be-drag {
width: 50px;
height: 50px;
padding: 0.25em;
float: left;
margin: 10px 10px 10px 0;
}

.will-be-drop {
width: 100px;
height: 100px;
padding: 0.25em;
float: left;
margin: 10px;
}
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<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="ui-widget">
<div class="will-be-drag ui-widget-content">A</div>
<div class="will-be-drag ui-widget-content">B</div>
<div class="will-be-drag ui-widget-content">C</div>
</div>
<div class="ui-widget">
</div>

您还可以使用 :visible 或其他一些条件将某些内容初始化为可删除,以减少内存开销。请记住也要销毁它们,否则当用户拖动时在页面中移动时,您只会堆积内存问题。

关于javascript - jQuery UI 在悬停时添加可放置事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60299623/

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