Javascript 什么';在特定区域中获取DOM元素的最佳(最快)方法

Javascript 什么';在特定区域中获取DOM元素的最佳(最快)方法,javascript,dom,Javascript,Dom,我想获得选择器区域内的所有DOM元素(当按下并拖动鼠标左键时创建,如photoshop、illustrator、figma选择器)。如下所示: 所有元素都是绝对位置,具有左、上、宽、高属性。选择器给出一个矩形,带有左、上、下、右、宽、高。请注意,我们有很多元素(例如:10000个DOM元素),所以如果我们循环所有10000个元素来检查它是否在选择器区域中,这不是个好主意 我尝试了两种解决方案: 首先使用intersection observer观察屏幕上的可见元素,然后我们只需要检入这些元素

我想获得选择器区域内的所有DOM元素(当按下并拖动鼠标左键时创建,如photoshop、illustrator、figma选择器)。如下所示:

所有元素都是绝对位置,具有
左、上、宽、高属性。选择器给出一个矩形,带有
左、上、下、右、宽、高
。请注意,我们有很多元素(例如: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。完全可以接受交互式工作。您可以共享您的机器信息吗?我认为这种解决方案不适合拥有弱计算机的客户。