将已删除的元素拖回其原始容器

时间:2018-03-20 11:01:26

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

所以这就是我现在所拥有的(我正在使用第三方的例子)......

 var numbers = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ];


  for ( var i=0; i<4; i++ ) {

    $('#card'+numbers[i]).data( 'number', numbers[i] ).draggable( {
      containment: '#content',
      stack: '#cardPile div',
      cursor: 'move',
      snap: '#cardSlots',
    snapMode: 'inner',
    snapTolerance: 10,
       revert:  function(dropped) {
             var $draggable = $(this),
                 hasBeenDroppedBefore = $draggable.data('hasBeenDropped'),
                 wasJustDropped = dropped && dropped[0].id == "droppable";
             if(wasJustDropped) {
                 // don't revert, it's in the droppable
                 return false;
             } else {
                 if (hasBeenDroppedBefore) {
                     // don't rely on the built in revert, do it yourself
                     $draggable.animate({ top: 0, left: 0 }, 'slow');
                     return false;
                 } else {
                     // just let the built in revert work, although really, you could animate to 0,0 here as well
                     return true;
                 }
             }
        }
    } );
  }

  // Create the card slots
  var words = [ 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten' ];
  for ( var i=1; i<=4; i++ ) {
    $('#answer'+words[i-1]).data( 'number', i ).droppable( {
      accept: '#cardPile div',
      activeClass: 'ui-state-hover',
      hoverClass: 'hovered',
      out: function( event, ui ) {
        if (!$(this).attr('id')){
                alert("sdsds") // what i tried here was if there was no droppable container send an alert this doesnt work 
        }


      },
      drop: handleCardDrop
    } );
  }
function handleCardDrop( event, ui ) {
  var dropdata=   ui.draggable.data('hasBeenDropped',true);
  var slotNumber = $(this).data( 'number' );
  alert($(this).attr('id'))
  var cardNumber = ui.draggable.data( 'number' );
  alert("slot--"+slotNumber);
  alert("cal--"+cardNumber);
alert(dropdata);
  // If the card was dropped to the correct slot,
  // change the card colour, position it directly
  // on top of the slot, and prevent it being dragged
  // again


    ui.draggable.addClass( 'correct' );
   ui.draggable.draggable( 'enable' );
   $(this).droppable( 'enable' );
    ui.draggable.position( { of: $(this), my: 'left top', at: 'left top' } );
    ui.draggable.draggable( 'option', 'revert', false );

}

所以这就是问题

  1. 如果我将卡从原始容器中拖出并将其放在卡槽外面,它会恢复 - 没问题

  2. 如果我将卡从原始容器中拖出并将其放入卡槽内,则没问题

  3. 一旦我将卡片放入插槽我希望能够将其拖动到多个批次 - 这可以

  4. 如果我将一张掉落的卡片拖到屏幕上的任何位置之外它会失败,那么它会粘在我放在屏幕上的位置 - 如果我从一个插槽中拖放一张卡片,我想要发生的事情是什么它应该发送一个警报(理想情况下我会做的是销毁卡片并使其重新出现在原始容器上)。可以这样做吗?
  5. 我已经从堆栈中尝试了很多示例,但无法检测卡何时没有被卡片插入...

    任何帮助表示赞赏。创建了一个jsfiddle https://jsfiddle.net/puuaa5r9/5/

    由于

1 个答案:

答案 0 :(得分:0)

  var numbers = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ];
  //numbers.sort( function() { return Math.random() - .5 } );

  for ( var i=0; i<4; i++ ) {
   // alert(i)
    $('#card'+numbers[i]).data( 'number', numbers[i] ).draggable( {
      containment: '#content',
      stack: '#cardPile div',
      cursor: 'move',
      snap: '#cardSlots',
    snapMode: 'inner',
    snapTolerance: 10,
    create: function(){$(this).data('position',$(this).position())},
    start:function(){$(this).stop(true,true)},
       revert:  function(dropped) {
             var $draggable = $(this),
                 hasBeenDroppedBefore = $draggable.data('hasBeenDropped'),
                 wasJustDropped = dropped && dropped[0].id == "droppable";
             if(wasJustDropped) {
                 // don't revert, it's in the droppable
                 return false;
             } else {
                 if (hasBeenDroppedBefore) {
                     // don't rely on the built in revert, do it yourself
                     $draggable.animate({ top: 0, left: 0 }, 'slow');
                     return false;
                 } else {
                     // just let the built in revert work, although really, you could animate to 0,0 here as well
                     return true;
                 }
             }
        }
    } );
  }

  // Create the card slots
  var words = [ 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten' ];
  for ( var i=1; i<=4; i++ ) {
    $('#answer'+words[i-1]).data( 'number', i ).data('droppeditem',"nodrop").droppable( {
      accept: '#cardPile div',
      activeClass: 'ui-state-hover',
      hoverClass: 'hovered',
       over: function(event, ui) {
            $(ui.helper).unbind("mouseup");
        },

      out:function(event, ui){
            $(ui.helper).mouseup(function() {
                snapToStart(ui.draggable,$(this)); 
            });
        },
      drop: handleCardDrop
    } );
  }

}
function snapToMiddle(dragger, target){
    var topMove = target.position().top - dragger.data('position').top + (target.outerHeight(true) - dragger.outerHeight(true)) / 2;
    var leftMove= target.position().left - dragger.data('position').left + (target.outerWidth(true) - dragger.outerWidth(true)) / 2;
    dragger.animate({top:topMove,left:leftMove},{duration:600,easing:'easeOutBack'});
}
function snapToStart(dragger, target){
    dragger.animate({top:0,left:0},{duration:600,easing:'easeOutBack'});
}
function handleCardDrop( event, ui ) {
    alert($(ui.droppable).serialize())
 // var dropdata=  
  var slotNumber = $(this).data( 'number' );
  var droppeditem = $(this).data( 'droppeditem' );
  alert($(this).attr('id'))
  var cardNumber = ui.draggable.data( 'number' );
  alert("slot--"+slotNumber);
  alert("cal--"+cardNumber);
  alert("droppeditem--"+droppeditem);


//snapToMiddle(ui.draggable,$(this));


 // if ( droppeditem == "nodrop" ) {
    ui.draggable.addClass( 'correct' );
   ui.draggable.draggable( 'enable' );
   $(this).droppable( 'enable' );
    ui.draggable.position( { of: $(this), my: 'left top', at: 'left top' } );
    ui.draggable.draggable( 'option', 'revert', false );

  /*  ui.draggable.addClass( 'correct' );
   ui.draggable.draggable( 'enable' );
   $(this).droppable( 'enable' );
  ui.draggable.position( { of: $(this), my: 'left top', at: 'left top' } );

   ui.draggable.draggable( 'option', 'revert', true );
    alert("hello2");
  }*/

  // If all the cards have been placed correctly then display a message
  // and reset the cards for another go



}