其他答案正是我想要的。但是,我想在这里更详细地介绍如何处理逻辑的更好示例。
例如,有一些简单的 HTML,如下所示。这个 HTML 基本上有 4 个可拖动对象和 4 个可能的放置目标:
<div style="margin-bottom:20px;">
<div data-id="1" class="DragItem">I am 1</div>
<div data-id="2" class="DragItem">I am 2</div>
<div data-id="3" class="DragItem">I am 3</div>
<div data-id="4" class="DragItem">I am 4</div>
</div>
<div>
<div data-id="123" class="DropItem">I accept 1, 2 and 3</div>
<div data-id="23" class="DropItem">I accept 2 and 3</div>
<div data-id="34" class="DropItem">I accept 3 and 4</div>
<div data-id="1234" class="DropItem">I accept all</div>
</div>
可以看出,我使用data-*
属性来存储特定的标识值。DragItem 上的 ID 标识拖动对象, DropItem 上的 ID 包含所有有效值。
处理此逻辑,然后应用正确的类的 javascript 如下:
$(".DragItem").draggable({
revert: true,
helper: "clone"
});
$(".DropItem").droppable({
tolerance: "touch",
over: function (event, ui) {
var dropItem = $(this);
var dragItem = $(ui.draggable);
var valid = String(dropItem.data("id")).indexOf(dragItem.data("id")) > -1;
if (valid) {
dropItem.addClass("DropTargetValid");
} else {
dropItem.addClass("DropTargetInvalid");
}
},
out: function (event, ui) {
var dropItem = $(this);
dropItem.removeClass("DropTargetValid");
dropItem.removeClass("DropTargetInvalid");
},
deactivate: function (event, ui) {
var dropItem = $(this);
dropItem.removeClass("DropTargetValid");
dropItem.removeClass("DropTargetInvalid");
}
});
可以看出,我正在做一个简单的“字符串是否包含”逻辑检查。这对于小数字来说很好,但如果需要处理超过 9 个对象,我们需要在 DropItemdata-id
值中使用更可靠的字符串。
我还使用out
anddeactivate
事件来清除应用的类。在此示例中,我复制了代码,但这可以很容易地替换为两个事件都使用的单个函数。
最后,在大家一直在等待的那一刻,这里有一个工作示例。