内部的には、jQuery UIは、をドラッグし始めるたびに次のコードを実行して、を受け取る資格がdraggable
あるかどうかを判断します。droppable
draggable
var m = $.ui.ddmanager.droppables[t.options.scope] || [];
var type = event ? event.type : null; // workaround for #2317
var list = (t.currentItem || t.element).find(":data(droppable)").andSelf();
droppablesLoop: for (var i = 0; i < m.length; i++) {
if(m[i].options.disabled || (t && !m[i].accept.call(m[i].element[0],(t.currentItem || t.element)))) continue; //No disabled and non-accepted
for (var j=0; j < list.length; j++) { if(list[j] == m[i].element[0]) { m[i].proportions.height = 0; continue droppablesLoop; } }; //Filter out elements in the current dragged item
m[i].visible = m[i].element.css("display") != "none"; if(!m[i].visible) continue; //If the element is not visible, continue
if(type == "mousedown") m[i]._activate.call(m[i], event); //Activate the droppable if used directly from draggables
m[i].offset = m[i].element.offset();
m[i].proportions = { width: m[i].element[0].offsetWidth, height: m[i].element[0].offsetHeight };
}
ご覧のとおり、コードは簡単ではなく、ドラッグを開始するたびにパフォーマンスが低下する理由を説明しています。
注意すべきことの1つは、で最初にチェックされるのは、が無効になってdroppablesLoop
いるかどうかdroppable
です。
したがって、パフォーマンスを向上させるために、適切なdroppable
ウィジェットを常に手動で無効にすることができます。これにより、上記のコードブロックからすばやくジャンプできます。これを行うには、が最初に発生するstart
イベントを使用します。draggable
$('.draggable').draggable({
start: function() {
$('.invalid-droppable-elements').droppable('option', 'disabled', true);
},
stop: function() {
$('.invalid-droppable-elements').droppable('option', 'disabled', false);
}
});
これにより、基本的にaccept
/scope
ロジックを自分で実装することになり、パフォーマンスへの影響はアルゴリズム次第です。ただし、実装するのはそれほど悪くないはずです。プラグインが遅いのは、さまざまな状況に対応する必要があるためです。
draggable
jQuery UIは、個々の/要素への複数のスコープの追加をサポートしていませんdroppable
が、その機能を独自にロールすることができます。
ここにこれを示すために例をまとめました-http://jsfiddle.net/tj_vantoll/TgQTP/1/。