まず第一に、この数か月で解決策を見つけていただければ幸いです。私はこの期間に jQueryUI を使用していて、答えを見つけようとするのは良い練習になると思ったので、これに答えています。また、未回答の質問は嫌いです^_^
残念ながら、ブラウザは、これらの.child
要素の間*over
に.parent
. 私が思いついた唯一のアイデアは、dropover
イベントが親でトリガーされたときに、マウスの位置が実際に子要素内にあるかどうかを検出しようとすることです。その場合、accepting_drops
クラスを親要素ではなく子要素に与える必要があります。
コードは次のとおりです (ソリューションの動作を示すためにjsFiddleを作成しました)。
HTMLとCSSは変更されていないので、二度とコピーしません
Javascript
$('.dragme').draggable({
helper: 'clone'
});
$('.parent,.child').droppable({
greedy: true,
tolerance: 'pointer',
});
$(".parent").on("dropover", function(event, ui) {
var first = $(".child:first");
var last = $(".child:last");
if((event.originalEvent.pageX > first.offset().left) &&
(event.originalEvent.pageY > first.offset().top) &&
(event.originalEvent.pageX <= (last.offset().left + last.width())) &&
(event.originalEvent.pageY <= (last.offset().top + last.height()))) {
$(this).removeClass("accepting_drops");
}
else {
$(this).addClass("accepting_drops");
$(".child").removeClass("accepting_drops");
}
}).on("dropout", function() {
$(this).removeClass("accepting_drops");
});
$(".child").on("dropover", function() {
$(".parent").removeClass("accepting_drops");
$(".child").removeClass("accepting_drops");
$(this).addClass("accepting_drops");
}).on("dropout", function() {
$(this).removeClass("accepting_drops");
});
hoverClass: 'accepting_drops'
ドラッグ可能なコンポーネントのデフォルトの動作をオーバーライドしているため、この行を削除しました。親 div の場合、dropover
イベントがトリガーされたときに子要素内にもいるaccepting_drops
場合は、そこからクラスを削除します。それ以外の場合は、それを持つ可能性のある子から削除し、代わりに親に追加します。イベントがトリガーされるdropout
と、accepting_drops
クラスを削除します。
子の場合、動作はほぼ標準です。イベントではクラスを他のすべてからdropover
削除して子に追加し、イベントでは削除します。accepting_drops
dropout
動作はまだ少し謎ですが、この回避策でうまくいくはずです。