Element(e) an beliebiger Koordinate
Olaf Schneider
- javascript
Hallo,
ich suche eine Liste aller Elemente oder das innerste Element, die an einer bestimmten Bildschirmkoordinate liegen. Gibt es eine Funktion oder ein einfaches Script dafür, ohne dass ich den ganzen Objektbaum traversieren muss? (Das wäre im Grunde ein bisschen entsprechend der Firebugfunktion "Inspect Element")
Hintergrund: Bei einem Container wird die Position periodisch durch setInterval() geändert. Dabei kann es passieren, dass ein aktives Kindelement unter der Maus wegwandert, ohne einen entsprechenden onmouseout Event auszulösen oder den :hover-Style wieder zu deaktiviert zu bekommen.
Da in diesem Fall nur exakt ein Element aktiv sein kann, möchte ich als Workaround bei jeder Positionsänderung feststellen, welches Element unter der Mausposition liegt, um diesen Fall dann manuell zu verarbeiten. Da die Änderung durch setInterval() geschieht, steht mir hier kein Eventobjekt zur Verfügung.
Ideen?
Gruß
Olaf
Nachtrag und Alternative:
Kann man Events auch manuell feuern? Wenn ich nach jeder Positionsänderung ein mousemove triggern könnte, wäre das Abfangen dann im entsprechenden Eventhandler möglich.
Gruß
Olaf
Hallo,
IE kennt eine Funktion
document.elementFromPoint, Opera hat die auch implementiert, aber Gecko kennt sie nicht. Wenn du mal bei Google suchst, findem sich aber einige Nachbauten für Gecko.
Kann man Events auch manuell feuern? Wenn ich nach jeder Positionsänderung ein mousemove triggern könnte, wäre das Abfangen dann im entsprechenden Eventhandler möglich.
Bei einem künstlichen Event gibst du selbst die Koordinaten vor - du kannst aber damit nicht die Abfrage der Mauskoordinaten anstoßen.
Außerdem verstehe ich nicht ganz, wie dir das helfen würde. Die jeweils letzte Mauskoordinate kannst du auch in dem mousemove-Handler zwischenspeichern, sodass sie zentral jederzeit zur Verfügung stehen.
Bei einem Container wird die Position periodisch durch setInterval() geändert. Dabei kann es passieren, dass ein aktives Kindelement unter der Maus wegwandert, ohne einen entsprechenden onmouseout Event auszulösen oder den :hover-Style wieder zu deaktiviert zu bekommen.
Wenn es nur darum geht, ein vorher »aktives« Element, welches unter dem Mauszeiger weggewandert ist, ohne dass ein mouseout gefeuert wurde, inaktiv zu machen: Dann ist elementFromPoint wohl nicht nötig, wenn ich dich recht verstanden habe. Dann reicht es, zu überprüfen, ob das betreffende Element (das du kennst) noch unter der Mausposition liegt (die du ebenfalls kennst). Du hast die Position der linken oberen Ecke der Box (offsetTop/offsetLeft), kannst dann über die Höhe und Breite (offsetWidth/offsetHeight) die Koordinate der rechte untere Ecken berechnen und schließlich berechnen, ob die Mausposition noch dazwischen liegt.
Mathias
Hallo Mathias,
vielen Dank für Deine Antwort.
Bei einem künstlichen Event gibst du selbst die Koordinaten vor - du kannst aber damit nicht die Abfrage der Mauskoordinaten anstoßen.
Außerdem verstehe ich nicht ganz, wie dir das helfen würde. Die jeweils letzte Mauskoordinate kannst du auch in dem mousemove-Handler zwischenspeichern, sodass sie zentral jederzeit zur Verfügung stehen.
Das war ein Denkfehler meinerseits. Die Mausposition ist, wie Du schon schreibst, immer bekannt. Ich wollte mousemove benutzen, um Infos über ein darunter liegendes Element zu bekommen. Im Gegensatz zu mouseover oder mouseout kennt mousemove aber kein Source- oder Targetelement, daher nützte das manuelle Feuern (wenn es ginge) natürlich gar nichts.
Wenn es nur darum geht, ein vorher »aktives« Element, welches unter dem Mauszeiger weggewandert ist, ohne dass ein mouseout gefeuert wurde, inaktiv zu machen: [..]
Das alte Element inaktiv machen ist nicht so das Problem. Das würde ich auch wie in Deiner Beschreibung lösen. Mit der Inaktivität eines alten wird aber ein neues Element aktiv und dann müsste ich ja für jedes der potentiellen Elemente abfragen, ob die Maus innerhalb dessen Rechteck liegt. Das ist natürlich nicht soo schwer zu implementieren, ich habe aber gehofft, dass ich da vielleicht drum herum komme.
Gruß
Olaf
P. S.: Irgendwie erinnert das alles an Spieleprogrammierung auf dem C64