他の答えはまさに私が探していたものです。ただし、ロジックを処理する方法のより良い例を示すために、ここでもう少し詳しく説明したいと思います。
たとえば、次のような単純な 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
およびdeactivate
イベントを使用して、適用されたクラスをクリアします。この例ではコードを複製していますが、これは両方のイベントで使用される単一の関数に簡単に置き換えることができます。
最後に、皆さんが待ち望んでいた瞬間、ここに実用的な例があります。