【问题标题】:jQuery UI - drag an item from drop area and drop it back to same drop area - drop event doesn't firedjQuery UI - 从放置区域拖动一个项目并将其放回相同的放置区域 - 放置事件不会触发
【发布时间】:2015-08-18 11:28:11
【问题描述】:

我有一些放置区域 $('.drophere') 和一个可拖动的存储 $('.dragme')。 每个放置区域只能包含一个放置的物品。

您可以将新项目放置在已放置的项目上(替换)。您可以将一个项目从一个放置区域拖到另一个放置区域。

如果您开始从放置区域拖动一个项目并决定将其放回同一区域 - 不会触发放置事件,因此拖动的项目会丢失。

这里是简化的代码:

var draggedData;
$('.drophere').droppable({
  drop: function (event, ui) {
    $(this).attr('data-text', draggedData);
    $(this).draggable('enable');
  }
}).draggable({
  disabled: true,
  helper: "clone",
  start: function (event, ui) {
    draggedData = $(this).attr('data-text');
    $(this).attr('data-text', "").draggable('disable');
  }
});

$('.dragme').draggable({
  helper: "clone",
  start: function (event, ui) {
    draggedData = $(this).attr('data-text');
  }
});

在 jQuery UI droppable 中是否存在某种限制?有什么方法可以“忘记”这种拖动项目的起源吗?谢谢。

刚刚添加:http://jsfiddle.net/gpnpwwbw/

【问题讨论】:

  • 与其“忘记原点”不能用stop吗?
  • 如果您在 jsfiddle 中使用一些 HTML 发布此内容会很有用
  • 添加了 jsfiddle。你是什​​么意思 - 停止?
  • 当物品被丢弃时触发停止,无论它被丢弃在哪里。如果该项目已被丢弃在其他地方,您可以签入该功能。 jsfiddle.net/gpnpwwbw/3
  • stop 意味着我已经自己测试了所有 dom 的可能放置区域。我更喜欢使用 drop 事件。

标签: javascript jquery-ui drag-and-drop jquery-ui-draggable jquery-ui-droppable


【解决方案1】:

利用 jQuery Draggables Stop 事件我想出了以下解决方案:

    var draggedData,
    dropLastDragged
    startPosData = {};

function checkIntersect(posData){
    var left = startPosData.left,
        top = startPosData.top,
        right = startPosData.left+startPosData.width,
        bottom = startPosData.top+startPosData.height,
        cornerLeftPos = posData.left,
        cornerTopPos = posData.top;

        cornerLeftPos += startPosData.width/2;
        cornerTopPos += startPosData.height/2;

    if((cornerLeftPos > left && cornerLeftPos < right) && (cornerTopPos > top && cornerTopPos < bottom)){
        return true;    
    }
    return false;
}

$('.drophere').droppable({
  drop: function (event, ui) {
    dropLastDragged = false;
    $(this).html(draggedData);
    $(this).draggable('enable');
  }
}).draggable({
  disabled: true,
  helper: "clone",
  start: function (event, ui) {
    startPosData.left = ui.offset.left;
    startPosData.width = $(this).width();
    startPosData.top = ui.offset.top;
    startPosData.height = $(this).height();
    draggedData = $(this).html();
    $(this).html('Drop here').draggable('disable');
    dropLastDragged = this;
  },
  stop: function(event, ui) {
    if(dropLastDragged){
        if(checkIntersect(ui.offset)){
            $(dropLastDragged).html(ui.helper.html());
            $(dropLastDragged).draggable('enable');
        }
    }
  }
});

$('.dragme').draggable({
  helper: "clone",
  start: function (event, ui) {
    draggedData = $(this).html();
  }
});

Fiddle

【讨论】:

  • 抱歉,这对我没有帮助 - 你不能将拖到的拖放区放在外面 - 它总是会返回。
  • @AlexanderZilber 有一种方法可以使用定位来检测您是否停止在原始元素上方拖动。如果您有兴趣,我也可以更新我的答案以说明这一点。
  • @AlexanderZilber 好的,我用代码更新了我的答案并更新了小提琴。
  • 谢谢!不完全是我想要的,但它有效:)
猜你喜欢
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
  • 2015-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多