我正在编写自己的拖放文件管理器。这包括一个 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。这与问题无关,可以排除。重要的部分是检查元素坐标与选取框坐标的交集逻辑。
另请注意,项目尺寸固定为201px 宽 x 221px 高。
我已经对此进行了测试,并且一切正常,但是我需要支持潜在的数千个文件,这意味着在某些时候我们将开始看到 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 事件时循环遍历整个项目坐标数组?
提前感谢您的帮助。