1

我正在构建一个小型 jquery 可拖放/可拖放应用程序。你可以在这里看到它:

http://jsfiddle.net/franco13/AwnJA/1/

我需要执行以下操作,并且我是在 jquery 中拖放的新手,因此感谢您的协助。

我希望:

  1. 防止蓝色框被拖到框 2,直到它被放到框 1 中
  2. 将蓝色框放入框 1 后,我想让它再次可拖动,以便可以将其放入框 2 中,同时留下一个克隆

像这样:

$( init );

function init() {

  $('.teamEmblem').draggable({
//    containment: $('.teamEmblem').parent(), // this does not work
    cursor: 'move',
    helper: 'clone',
    obstacle: ".teamEmblem", // this does not work
    preventCollision: true, // this does not work
    revert: true
  });

  $('.winner').droppable({
    hoverClass: 'hovered',
    tolerance: 'touch',
    drop: handleCardDrop2
  });

}


function handleCardDrop2( event, ui ) {
    if (true) {

        ui.draggable.addClass('correct');
        ui.draggable.draggable('disable');
        $(this).droppable('disable');

        var dragged = ui.draggable.clone(true);
        dragged.position({
            of: $(this),
            my: 'left top',
            at: 'left top'
        }).css({
            position: 'absolute',
            display: 'block',
            margin: '0 auto'
        });
        ui.draggable.draggable('option', 'revert', false);
        $('body').append(dragged);
    }

}
4

2 回答 2

2

您的起始代码只需进行少量更改,类似的东西应该可以工作,但我不确定它是否符合您的所有需求:

{我不确定您是否希望原始元素再次可拖动或克隆元素拖动到 box1}

看演示

function handleCardDrop2(event, ui) {
    if (true) {
        var $dragged = ui.draggable,
            $draggedClone = $dragged.clone(),
            $target = $(event.target);

        if ($target.is('.box1')) $dragged.addClass('doppedBox1 correct');
        else if ($target.is('.box2') && $dragged.is(':not(.doppedBox1)')) return false;
        else if ($target.is('.box2')) $dragged.addClass('doppedBox2').draggable('disable');

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

        $draggedClone.position({
            of: $(this),
            my: 'left top',
            at: 'left top'
        }).css({
            position: 'absolute',
            display: 'block',
            margin: '0 auto'
        });
        ui.draggable.draggable('option', 'revert', false);
        $('body').append($draggedClone);
    }
}
于 2013-04-28T13:53:58.017 回答
1

为了回答第 1 部分,我想出了类似这个小提琴的东西

基本概念是:

  • 为您的回合添加索引,因为它们是推断出来的并且不够明确
  • 将数据对象附加到每个可以在回合中移动并跟踪它们在其中完成的对象的对象
  • 测试他们的数据对象

像这样。 请注意,我重新定义了liprereq作为属性,但您也可以使用数据 <li prereq="in1" class="winner first">box 1</li>

var order = ['in1', 'in2', 'in3'];  // round index
// see your code
$('.temEmblem').draggable({blah}).data('complete', {
    'in1': true,
    'in2': false,
    'in3': false
});  // attach data element to draggable element

// see your code

function handleCardDrop2(e, ui){

    // see your handleCardDrop2 code

    var currentRd = $(this).attr('prereq');
    var nextRd = order[order.indexOf($(this).attr('prereq')) + 1];
    if (ui.draggable.data('complete')[currentRd]) {

        ui.draggable.data('complete', {
            nextRd: true
        });
        // do the drop
    } else { 
        // bail 
    }

    // handleCardDrop2 code

}); 
于 2013-04-28T13:50:11.303 回答