Javascript 什么';在特定区域中获取DOM元素的最佳(最快)方法
我想获得选择器区域内的所有DOM元素(当按下并拖动鼠标左键时创建,如photoshop、illustrator、figma选择器)。如下所示: 所有元素都是绝对位置,具有Javascript 什么';在特定区域中获取DOM元素的最佳(最快)方法,javascript,dom,Javascript,Dom,我想获得选择器区域内的所有DOM元素(当按下并拖动鼠标左键时创建,如photoshop、illustrator、figma选择器)。如下所示: 所有元素都是绝对位置,具有左、上、宽、高属性。选择器给出一个矩形,带有左、上、下、右、宽、高。请注意,我们有很多元素(例如:10000个DOM元素),所以如果我们循环所有10000个元素来检查它是否在选择器区域中,这不是个好主意 我尝试了两种解决方案: 首先使用intersection observer观察屏幕上的可见元素,然后我们只需要检入这些元素
左、上、宽、高属性。选择器给出一个矩形,带有左、上、下、右、宽、高
。请注意,我们有很多元素(例如:10000个DOM元素),所以如果我们循环所有10000个元素来检查它是否在选择器区域中,这不是个好主意
我尝试了两种解决方案:
首先使用intersection observer
观察屏幕上的可见元素,然后我们只需要检入这些元素
使用4个对象缓存所有元素:
- byTops:以升序存储所有元素
- 按底部:按顺序存储所有元素
bottom
升序
- BYLEFT:以升序
左
存储所有元素
- byRights:以升序存储所有元素
当我们检查时,可能会更快
这是解决方案1的演示:
对于这个场景有没有更好的解决方案?请帮帮我
非常感谢 如果您知道他们可以选择的每个元素的最小大小,则可以使用来选择元素
我的意思是,假设他们画了一个选择,他们能选择的每件东西至少是40px,60px。然后,您可以执行以下操作:
let {top, left, right, bottom} = rectangleCoords;
const selectedElements = new Set();
for (let x = left; x <= right; x += 40) {
for (let y = top; y <= bottom; y+= 60) {
const el = document.elementFromPoint(x, y).closest('.thing-you-want');
if (el) {
selectedElements.add(el);
}
}
}
设{top,left,right,bottom}=矩形坐标;
const selectedElements=new Set();
对于(让x=left;在我的机器上,x迭代,并且具有10000个值的数组需要约0.4msIt’s,这不仅仅是“迭代”,我们必须做大量的检查操作。每次鼠标移动都会生成一个新区域,并且每次鼠标移动都必须检查10000多个元素。除非元素非常自定义并且在内存空间方面非常大,否则迭代是可以的,如果我能建议一种未经测试的方法,它将是javascript中的拖放,检查这个,我将在选择元素作为已删除元素
,并捕获其下元素上的事件。接受挑战:)对每个项目(10000个)进行4次比较需要约1ms。完全可以接受交互式工作。您可以共享您的机器信息吗?我认为这种解决方案不适合拥有弱计算机的客户。