如何根据条件恢复可拖动的jquery UI的位置

Ash*_*Ash 30 jquery jquery-ui-draggable jquery-ui-droppable

我有一个可拖动的元素和一个可以放置的元素.在dropzone上删除拖动项后,我试图执行以下jquery伪代码:

if(draggedelement == value){

$(draggedelement).hide();

}
else{

$(draggedelement).revert();

}
Run Code Online (Sandbox Code Playgroud)

其中revert()功能移动拖动的项目回原来现在的位置.

如何实现这一目标?

PS我知道可拖动的'revert'选项,但是只有当被拖动的项目没有进入dropzone时才会激活.

Nic*_*ver 75

有一些内置的选项,在你的.draggable()设置revert选项'invalid',如果没有成功地放到一个droppable上它会返回,如下所示:

$("#draggable").draggable({ revert: 'invalid' });
Run Code Online (Sandbox Code Playgroud)

然后在你的.droppable()设置中使用该accept选项对drop有效,例如:

$("#droppable").droppable({ accept: '#draggable' });?
Run Code Online (Sandbox Code Playgroud)

当您放手时,任何与此选择器不匹配的内容都会重置,您可以在此处查看完整的演示.如果您需要过滤选择器无法提供,则accept选项也会采用一个函数,如下所示:

$("#droppable").droppable({ 
  accept: function(dropElem) {
    //dropElem was the dropped element, return true or false to accept/refuse it
  }
});?
Run Code Online (Sandbox Code Playgroud)


Pau*_*ept 9

我有一个用例,我必须在droppable的drop方法中运行一些逻辑来确定draggable是否应该还原.我使用以下方法来实现这一目标:

$('.draggable-elements').draggable({
  revert: function() {
    if ($(this).hasClass('drag-revert')) {
      $(this).removeClass('drag-revert');
      return true;
    }
  }
});

$('.droppable-elements').droppable({
  drop: function(event, ui) {
    if ( % conditional logic check here % ) {
      return $(ui.draggable).addClass('drag-revert');
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

我的用例是一个表格,其中每个单元格是一个表示5分钟时间段的可放置的表格.我的拖车是在一个单元格中开始的预订,但是连续运行多个单元格以表示预订时间.

我不希望任何可拖动的重叠,因为这将代表双重预订.因此,在丢弃之后,我发现行中的所有可拖动,不包括我刚刚移动的那个,并检查是否有任何重叠.如果存在重叠,则我的条件逻辑返回true并且我还原可拖动的.

下一步是触发ajax调用来更新数据库,如果服务器端逻辑说移动无效,我希望返回错误状态并恢复拖动.

PS这是我的第一个答案,对不起,如果我做错了什么.关于如何提供好答案的提示很乐意接受.

编辑:在尝试我的AJAX调用之后,我意识到droppable.drop函数有一个机会窗口,可以在draggable.revert函数运行之前完成它.当我的AJAX调用返回false时,窗口已经过去,并且为了draggable.revert做出反应,类的添加时间太晚了.

因此,我不再依赖draggable.revert函数,而是仅仅依赖于AJAX响应,如果为false,则使用animate()将draggable返回到其原始位置,如下所示:

$( '.draggable-elements' ).draggable();

$( '.droppable-elements' ).droppable({
  drop: function( event, ui ) {
    var postData = {
      id: 1,
      ...
    };
    $.post( '/ajax/url', postData, function( response ) {
      var response = $.parseJSON( response );
      if ( response.status != 1 ) {
        return ui.draggable.animate( {left: 0, top: 0}, 500 );
      }
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

您可能需要使用draggable.start/drag将draggable的原始left和top值添加为数据属性,但对我来说,上面的工作正常.