其他答案正是我一直在尋找的。但是,我想在此進一步詳細介紹如何處理邏輯的更好示例。
可以說,例如,有一些簡單的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個對象,我們需要在DropItem data-id
值中使用更可靠的字符串。
我還使用out
和deactivate
事件清除應用的類。在這個例子中,我複製了代碼,但是這可以很容易地被兩個事件使用的單個函數替換。
最後,你都一直在等待的那一刻,here is a working example.
這並不直接回答你的問題,但聽起來很適合你的使用情況 - 你看着使用'scope' /'accept'選擇指定某些拖拽元素一定droppables?然後,您不需要邏輯來確定hoverClass - 只有當可拖動的接受可放下的對象時纔會分配它。 – freejosh 2013-03-05 14:17:54
@freejosh:我不認爲這會允許我指定一個「無效」類的類,儘管如此。無論如何得到了我的答案:D – musefan 2013-03-05 14:49:33