【问题标题】:Disable drop if div has already been dropped?如果 div 已被删除,则禁用删除?
【发布时间】:2012-09-28 11:54:51
【问题描述】:

为了开始自学 jquery,我创建了一个拖放游戏。一切似乎都正常,但您可以将多个项目放到同一个方块上。如果占位符中有图像,我想禁用 droppable。

我已经调查过了:

`greedy: true`

这会禁用 drop 但我不确定如何再次启用它:

$(this).droppable( 'disable' );

我可以让这两个都禁用放置,但不确定如果块/图像恢复到其原始位置或移动到另一个方块,我如何让它们再次启用它。

完整版: http://creativelabel.co.uk/drag-and-drop/

更新: 这是可放置插槽的代码。

  for ( var i=0; i<=19; i++ ) {
  var images = 'images/slot' + slotNumbers[i] + '.jpg';
$('<div class="placeholder"><div class="img-slot"></div></div>').attr('id', 'slot'+slotNumbers[i]).data( 'slotNumbers', slotNumbers[i] ).appendTo( '#imgSlots' ).droppable( {
      accept: '#images img',
      hoverClass: 'hovered',
      drop: handleDropEvent,
      activate: handleDragEvent
});

这是drop:事件代码:

  function handleDropEvent( event, ui ) {
  var slotNumber = $(this).data( 'slotNumbers' );
  var imgNumber = ui.draggable.data( 'number' );
  ui.draggable.addClass( 'dropped' );
  $(this).droppable( 'disable' );
  ui.draggable.position( { of: $(this), my: 'right top', at: 'right top' } );

  if ( slotNumber == imgNumber ) {
    ui.draggable.addClass( 'img-match' );
    ui.draggable.data("valid", true);

    imgMatch++;
  }  else {
      if(ui.draggable.data("valid")) {
         imgMatch--;
         ui.draggable.data("valid", false); 
      }
  }

activate: 代码:

  function handleDragEvent( event, ui ) {
   $(this).droppable( 'enable' );
   if(ui.draggable.data("valid")) {
         imgMatch--;
         $('input[name=Score]').val(imgMatch);
         $('#score h1').text(imgMatch);
         ui.draggable.data("valid", false); 
   }
 }

【问题讨论】:

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


    【解决方案1】:

    docs(在“方法”选项卡下查看)表示禁用您使用:

    $(this).droppable( 'disable' );
    

    为了让你使用

    $(this).droppable( 'enable' );
    

    更新:查看这个实时示例:http://jsfiddle.net/QqJRs/ 将其中一个红色方块拖到大框并放下它(它变成绿色表示它已放下)。当一个在里面时,你不能把其他任何一个放到这个盒子里。 现在将其拖出(它变回红色表示已删除)。现在您可以将其他任何一个放在它的位置。

    问题的关键正如我在下面的评论中所描述的那样;当您将项目放入容器中时,将容器与项目关联:

    drop: function(event,ui){
        ui.draggable.addClass( 'dropped' ); // taken from your code & I used to change color
    
       ui.draggable.data('droppedin',$(this)); // associate the container
        $(this).droppable('disable'); // disable the droppable
    }
    

    然后当你再次拖动它时,取消关联并重新启用:

    drag: function(event,ui){
           if($(this).data('droppedin')){
               $(this).data('droppedin').droppable('enable'); v// re-enable
               $(this).data('droppedin',null);  // de-associate
               $(this).removeClass( 'dropped' ) // remove class
           }
       }
    

    【讨论】:

    • 好吧,既然您没有发布任何代码(不,我没有在您的链接中筛选您的整个代码库),因此很难评论将其放在代码中的哪个位置。尝试缩小您认为应该启用droppable的范围并使用相关代码部分更新您的问题
    • 好的,我已经更新了关于我认为启用应该去哪里的问题。如果用户将一个方块拖到另一个方块上,则激活代码会降低分数,所以对我来说,这似乎是放置启用代码的合乎逻辑的地方?
    • 我试过了。如果图像已经放在正方形上,它会禁用放置,所以我不能在它上面放另一个图像,按我的意愿工作。图像恢复原状,或者我将它拖到另一个方块,然后它之前所在的插槽不再接受下降,这意味着启用不会再次启用。
    • 查找禁用禁用的信息很容易,启用则不然。我无法理解的是我如何定位图像插槽以在图像拖动时再次启用拖放?
    • 当一个物品被放到一个插槽中时,将该插槽与该物品关联起来。当该项目被拖到其插槽外时,重新启用该插槽并取消关联。
    猜你喜欢
    • 1970-01-01
    • 2019-02-02
    • 2020-10-24
    • 1970-01-01
    • 2022-07-22
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多