gpt4 book ai didi

javascript - 在 jquery.event.drag 中触发 Dragstart 后更新可用的放置目标

转载 作者:行者123 更新时间:2023-12-03 21:52:12 25 4
gpt4 key购买 nike

概述:

我有一个页面使用 jquery.event.dragjquery.event.drop 。我需要能够拖放到不断添加到 dom 中的元素上,即使在拖动开始之后也是如此。

<小时/>

问题:

dragstart 事件触发时,它会检查可用的放置目标并将它们添加到拖动对象。

我遇到的问题是,在 dragstart 事件触发后,我动态添加放置目标,因此用户无法放置到这些动态添加的放置目标上。

<小时/>

示例:

http://jsfiddle.net/blowsie/36AJq/

<小时/>

问题:

如何更新拖动以允许在拖动开始后放置在已添加到 dom 的元素上?

最佳答案

您可以使用此代码片段。

重要的函数是:$.event.special.drop.locate();

在 chrome/safari/firefox/ie9 上测试,似乎可以工作。

SEE DEMO

<小时/>

更新

对于重叠事件,请查看以下代码是否有效。我将其设置在匿名函数中只是为了避免任何全局变量。想法是使用事件的 currentTarget 属性来检查是否不是同一元素触发同一事件。我在 newdrop 元素上设置了一个 id 只是为了在这里进行测试。

SEE UPDATED DEMO

(function () {
var $body = $("body"),
newdrops = [],
currentTarget = {},
ondragstart = function () {

$(this).css('opacity', .75);
}, ondrag = function (ev, dd) {
$(this).css({
top: dd.offsetY,
left: dd.offsetX
});
}, ondragend = function () {

$(this).css('opacity', '');
for (var i = 0, z = newdrops.length; i < z; i++)
$(newdrops[i]).off('dropstart drop dropend').removeClass('tempdrop');
newdrops = [];
}, ondropstart = function (e) {
if (currentTarget.dropstart === e.currentTarget) return;
currentTarget.dropstart = e.currentTarget;
currentTarget.dropend = null;
console.log('start::' + e.currentTarget.id)
$(this).addClass("active");
}, ondrop = function () {
$(this).toggleClass("dropped");
}, ondropend = function (e) {
if (currentTarget.dropend === e.currentTarget) return;
currentTarget.dropend = e.currentTarget;
currentTarget.dropstart = null;
console.log('end::' + e.currentTarget.id)
$(this).removeClass("active");
};

$body.on("dragstart", ".drag", ondragstart)
.on("drag", ".drag", ondrag)
.on("dragend", ".drag", ondragend)
.on("dropstart", ".drop", ondropstart)
.on("drop", ".drop", ondrop)
.on("dropend", ".drop", ondropend);



var cnt = 0;
setInterval(function () {
var dataDroppables = $body.data('dragdata')['interactions'] ? $body.data('dragdata')['interactions'][0]['droppable'] : [];

var $newDrop = $('<div class="drop tempdrop" id="' + cnt + '">Drop</div>');
cnt++;
$("#dropWrap").append($newDrop);
var offset = $newDrop.offset();
var dropdata = {
active: [],
anyactive: 0,
elem: $newDrop[0],
index: $('.drop').length,
location: {
bottom: offset.top + $newDrop.height(),
elem: $newDrop[0],
height: $newDrop.height(),
left: offset.left,
right: offset.left + $newDrop.width,
top: offset.top,
width: $newDrop.width
},
related: 0,
winner: 0
};
$newDrop.data('dropdata', dropdata);
dataDroppables.push($newDrop[0]);
$newDrop.on("dropstart", ondropstart)
.on("drop", ondrop)
.on("dropend", ondropend);
$.event.special.drop.locate($newDrop[0], dropdata.index);
newdrops.push($newDrop[0]);
}, 1000);
})();

关于javascript - 在 jquery.event.drag 中触发 Dragstart 后更新可用的放置目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15947867/

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