私は独自のドラッグ アンド ドロップ ファイル マネージャーを作成しています。これには、アクティブなときに交差する要素 (ファイル) を計算し、それらにクラスを追加することによってそれらを選択する JavaScript マーキー選択ボックスが含まれます。
私は現在、mousemove ハンドラー中にチェックを実行し、要素座標の配列をループして、ドラッグ アンド ドロップ選択ボックスと交差する要素を特定します。
関数は現在、次のようになっています。
selectItems : function(voidindex){
var self = this;
var coords = self.cache.selectioncoords;
for(var i=0, len = self.cache.items.length; i<len; i++){
var item = self.cache.items[i];
var itemcoords = item.box_pos;
if(coords.topleft.x < (itemcoords.x+201) && coords.topright.x > itemcoords.x && coords.topleft.y < (itemcoords.y+221) && coords.bottomleft.y > itemcoords.y){
if(!item.selected){
item.selected = true;
item.html.addClass('selected').removeClass('activebutton');
self.cache.selecteditems.push(i);
self.setInfo();
}
}
else{
if(item.selected){
item.selected = false;
if(!voidindex || voidindex !== i){
item.html.removeClass('selected');
}
var removeindex = self.cache.selecteditems.indexOf(i);
self.cache.selecteditems.splice(removeindex, 1);
self.setInfo();
}
}
}
},
上記のコードには、選択が変更された場合にのみ DOM が操作されるようにする汚いロジックがたくさんあります。これは質問とは関係がなく、除外できます。重要な部分は、要素の座標とマーキー選択ボックスの座標をチェックする交差ロジックです。
また、アイテムのサイズは幅 201 ピクセル、高さ 221 ピクセルに固定されていることに注意してください。
私はこれをテストし、すべてが完全に機能しますが、潜在的に数千のファイルをサポートする必要があるため、ある時点で UI パフォーマンスの低下が見られるようになります。
各要素の座標をループせずに交差検出を実行する方法があるかどうかを知りたいです。
マーキー ボックスの座標は、常に次のように定義されます。
selectioncoords : {
topleft : {
x : 0,
y : 0
},
topright : {
x : 0,
y : 0
},
bottomleft : {
x : 0,
y : 0
},
bottomright : {
x : 0,
y : 0
},
width : 0,
height : 0
}
また、self.cache.items 配列に格納されている各アイテムの座標は、次のように定義されます。
item : {
box_pos : {
x : 0,
y : 0
},
grid_pos : {
row : 1,
column : 1
}
}
そのため、利用可能な情報は常に実際のグリッド位置 (行/列) と物理アイテムの位置 (グリッド内のピクセル単位の左と上オフセット) です。
要約すると、質問は、mousemove イベントが発生するたびにアイテム座標の配列全体をループせずに、上記で定義された一連のマーキー選択ボックス座標からアイテムの交差を検出する方法はありますか?
助けてくれてありがとう。