Alle Elemente an einem Punkt mit JavaScript abfragen

Mit JavaScript ist es möglich, ein Element an einer gegebenen Position (Koordinate) abzufragen. Die linke obere Ecke des Browser entspricht dabei der Koordinate (0/0). Leider gibt es im DOM-Standard nur die Methode document.elementFromPoint, welche nur das oberste Element einer Koordinate liefert. Wenn zwei Elemente an einer Position übereinander liegen wird nur das Element, was oben liegt, erkannt.

Im Windows Internet Explorer ist es aber möglich, alle Elemente an einem Punkt zu bestimmen. Dafür wurde die Methode document.msElementsFromRect (siehe Erweiterte Treffererkennung) eingeführt.

Beispiel

Das folgende Beispiel beinhaltet zwei Quadrate. Ein rotes Quadrat und ein blaues Quadrat. Die Quadrate liegen genau an derselben Stelle und das blaue Quadrat verdeckt das rote Quadrat. Mit document.elementFromPoint wird nur das blaue Quadrat erkannt (weil dessen z-index am Höchsten ist). Die Methode document.msElementsFromPoint erkennt jedoch beide Quadrate:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<!DOCTYPE html>
<html>
  <head>
    <title>document.elementFromPoint / document.msElementsFromPoint</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <style>
      *{ margin: 0; padding: 0; border: 0;}
 
      .square{
        width: 400px;
        height: 400px;
        position: absolute;
      }
 
      #blueSquare{
        background-color: blue;
        z-index: 2;
      }
 
      #redSquare{        
        background-color: red;
        z-index: 1;
      }
    </style>
  </head>
  <body>
    <div id="blueSquare" class="square"></div>
    <div id="redSquare" class="square"></div>
    <script>
      console.log("document.elementFromPoint");
      var element = document.elementFromPoint(0, 0);
      console.log(" - Element: "+element.id);
 
      // getElementsFromPoint
      console.log("document.msElementsFromPoint");
      var elements = document.msElementsFromPoint(0, 0);
      for (var i = 0; i < elements.length; i++){
        if(elements[i].id.length > 0)
          console.log(" - Element: "+elements[i].id);
      }
    </script>
  </body>
</html>

Ausgabe

 document.elementFromPoint 
  - Element: blueSquare 
 document.msElementsFromPoint 
  - Element: blueSquare 
  - Element: redSquare

Browserübergreifender Lösungsansatz

Wer etwas Ähnliches für andere Browser haben möchte, der könnte sich eine Methode namens elementsFromPoint selber schreiben und die ID eines Elements an Position X, Y holen, danach die Eigenschaft pointer-events: none für das erkannte Element setzen und dann wieder das nächste Element an Position X, Y abfragen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.