Maus-Ereignisse

Mouse events

Maus-Ereignisse können zur interaktiven Steuerung von Webseiten verwendet werden. Diese Seite zeigt dazu eine Live-Demonstration und einige Beispiele der Programmierung.
Javascript ECMAScript für HTML und XML - Ereignisse (events)
Live-Demo der wichtigsten Maus-Ereignisse
Beispiele zur Programmierung:
Vorbereitung der "überwachten" HTML-Elemente
Zuweisung eigener Event-Handler Funktionen
Beispiele einfacher Funktionen zur Verarbeitung von Events
Lesen (absoluter) Maus-Koordinaten
Lesen der (absoluten) Position von HTML-Elementen
Ändern der Position von HTML-Elementen
Verwandte Themen Interaktive Weltkarte (Live-Demo)
Links Ausgewählte Links zum Thema 'Mouse events'

Live-Demo der Maus-Ereignisse

Die Test-Grafik (rechts) wird auf Maus-Ereignisse überwacht:
Beim Überfahren der Grenzen werden die Ereignisse mouseover bzw. mouseout ausgelöst.
Bei jeder Maus-Bewegung wird mousemove ausgelöst.
Baim Drücken des Maus-Buttons erfolgt mousedown, beim Loslassen mouseup, zusammen mouseclick
Bei mousemove werden die Maus-Koordinaten (relativ zum Mittelpunkt der Test-Grafik) angezeigt.
Bei click wird das Fadenkreuz eingestellt.
Maus
mouseover
mouseout
mousedown
mouseup
mousemove
click
x
0
y
0
Fadenkreuz
x
0
y
0
Zur optimalen Ablesung ist die Testgrafik in Quadrate zu je 10 Pixel Breite und Höhe eingeteilt. In der Praxis werden die Koordinaten meist in andere Einheiten umgerechnet, z.B. mm, m, km ...

Programmierung der überwachten HTML-Elemente

Zur Identifizierung müssen alle zu überwachenden HTML-Elemente mit eindeutigen id-Attributen ausgestattet werden.
Bei Auswertung der Maus-Koordinaten ist es oft sinnvoll, den Mauszeiger (cursor) mit einer CSS-Anweisung als Fadenkreuz anzuzeigen.
HTML
<img id="raster" src="raster.gif" style="cursor:crosshair;" />
Es ist prinzipiell möglich, das gesamte <body>-Element ( = die ganze Webseite) zu überwachen. Besser ist jedoch die Beschränkung auf ein oder einige wenige Elemente. Das reduziert den Aufwand, vor allem bei Überwachung von mousemove

Festlegung der EventListener

Mit Javascript erfolgt die Zuordnung des oder der zu überwachenden Events an eigene Event Handler Programme.

Zunächst wird das zu überwachende DOM-Element (hier die Grafik raster, alternativ das gesamte <body>-Element) als Objekt an eine Variable (hier n) zugewiesen.

Leider ist die Syntax nicht einheitlich: Gängige Browser verwenden 2 verschiedene Methoden: attachEvent oder addEventListener

Beide Methoden werden ausprobiert.
Variable ok zeigt an, ob eine der Methoden funktioniert hat. Halten sie die gezeigte Reihenfolge ein, denn Opera ergibt mit addEventListener keinen Fehler, funktioniert jedoch nicht.

Dieser Code kann erst nach dem Laden der Webseite, muss jedoch vor der Verwendung ausgeführt werden - Sinnvoll mit einem onload-Handler des <body>-Elements.

Details zu Objekten und DOM-Methoden.
Javascript:
var n=document.getElementById("raster");
// var n=document.getElementsByTagName("body")[0];
var ok=false;
try{
n.attachEvent("onmouseover",my_over);
n.attachEvent("onmouseout",my_out);
n.attachEvent("onmousedown",my_down);
n.attachEvent("onmouseup",my_up);
n.attachEvent("onmousemove",my_move);
n.attachEvent("onclick",my_click);
ok = true; // M$IE, Opera
}
catch(e) {}
if(!ok) {
try{
n.addEventListener("mouseover",my_over,true);
n.addEventListener("mouseout",my_out,true);
n.addEventListener("mousedown",my_down,true);
n.addEventListener("mouseup",my_up,true);
n.addEventListener("mousemove",my_move,true);
n.addEventListener("click",my_click,true);
ok=true; // Gecko (Firefox), [Opera ohne Wirkung]
}
catch(e) {}
}
if(!ok) {alert("Fehler...");}
Wenn sie nicht alle Ereignisse überwachen wollen, dann löschen sie die entsprechenden Anweisungen.
Wenn sie zusätzlich das Event dblclick nutzen wollen, dann fügen sie die entsprechende Anweisung ein.
Sie müssen sämtliche angegebenen Handler-Funktionen ( my_over...my_click ) zur Verfügung stellen.
Wenn sie zusätzliche Elemente überwachen wollen, dann fügen sie entsprechende Anweisungen ein.
Im Beispiel werden auch die beiden Fadenkreuz-Linien überwacht. Da diese vor der Grafik liegen, ergeben sich beim Überfahren der Linien mouseout und mouseover Ereignisse, die jedoch hier nicht eigens ausgeblendet werden.

Event-Handler

Event Handler sind eigene Javascript-Funktionen zur Verarbeitung auftretender Ereignisse.
Der Name jeder Event-Handler Funktion muss genau jenem entsprechen, der als EventListener (Kapitel oben) angegeben wurde.
Rechts wird ein Beispiel für einen Handler des onclick Ereignisses gezeigt.
Einfacher Event-Handler
function my_click() {
alert("Click !");
}
Wenn sie Eigenschaften des Events verarbeiten wollen, dann verwenden sie eine etwas erweiterte Form:

Die Funktion erhält das Event-Objekt als Argument (hier evt).
Alternativ wird das Event als Sub-Objekt des window-Objekts zugewiesen.

In diesem Beispiel wird die eigene Funktion mouse_coords (nächstes Kapitel) zur Auswertung verwendet. Sie liest die aktuelle Maus-Position vom Event-Objekt und gibt sie als Array zurück.
function my_click(evt) {
if(!evt) {evt = window.event;}
// Event verarbeiten
var xy = mouse_coords(evt);
alert("x="+xy[0]);
alert("y="+xy[1]);
}

Lesen von (absoluten) Maus-Koordinaten

Bei der Verarbeitung von Maus-Ereignissen müssen fast immer auch die Koordinaten ausgewertet werden.

Leider ist die Syntax nicht einheitlich: Gängige Browser verwenden 2 verschiedene Eigenschaften: pageX oder clientX

Die Funktion benötigt das Event-Objekt zur Auswertung. Dieses Objekt wird beim jeweiligen Ereignis an die Handler-Funktion (Kapitel oben) übergeben.
Im Beispiel wird es als Argument evt an die Funktion weitergegeben. Dabei erhält die Funktion keine Kopie (wie bei gewöhnlichen skalaren Variablen) sondern das Original-Objekt.

Beachten sie die Reihenfolge der beiden Syntax-Varianten. Opera ergibt mit pageX keinen Fehler, funktioniert jedoch nicht.

Die Funktion gibt ein Array der beiden Koordinaten (x,y) zurück.
Lesen der Maus-Koordinaten
function mouse_coordinates(evt) {
var xy = new Array(0,0);
var ok = false;
try{
xy[0]=evt.clientX;
xy[1]=evt.clientY;
ok=true; // M$IE, Opera
}
catch(e) {}
if(!ok) {
try{
xy[0]=evt.pageX;
xy[1]=evt.pageY;
ok=true; // Gecko (Firefox)
}
catch(e) {}
}
if(!ok) {alert("Fehler...");}
return xy;
}
Die Koordinaten werden in Pixeln (Bildpunkten) angegeben.
Der Ursprung des Koordinaten-Systems befindet sich in der linken oberen Ecke der Webseite.
Eine Umrechnung in mm oder cm ist mit CSS-Methoden bedingt möglich: Die Auflösung von Monitoren beträgt klassisch 72 dpi (Punkte pro 1 Zoll = 25.4mm), auf neueren Monitoren auch 96 dpi.
Die X-Koordinaten wird wie üblich von links nach rechts gemessen.
Die Y-Koordinate wird von oben nach unten gemessen !   Das ist in der Informatik bei der Verarbeitung von Grafik allgemein üblich.
Alle modernen Browser messen absolute Koordinaten vom linken oberen Ende der Webseite.

Leider zeigt M$IE auch hier ein abweichendes Verhalten. Das kompliziert die Anwendung von Maus-Ereignissen unangenehm.
Die Methoden clientX, clientY messen Koordinaten von der linken oberen Ecke des angezeigten Fensters. Diese Koordinaten entsprechen etwa jenen, die von allen anderen Browsern absolut gemessen werden - Allerdings nur, solange die Seite nicht gerollt (scroll down) wurde !
Die Methoden offsetX, offsetY messen (relative) Koordinaten von der linken oberen Ecke jenes Elements, welches das Event auslöste.

Position von HTML-Elementen lesen

Absolute Koordinaten

Die Maus-Koordinaten werden zunächst (Kapitel oben) nur absolut gelesen, d.h. von der linken oberen Ecke der Webseite. Das ist leider für eine Auswertung noch nicht brauchbar.
Die Koordinaten müssen Live gelesen werden, da eine Webseite von jedem Browser etwas anders dargestellt wird, und außerdem jede/r AnwenderIn das Fenster anders einstellen kann.

Relative Koordinaten

In der Praxis sind nur Koordinaten relativ zu Elementen der Webseite (z.B. einer Grafik) interessant.
Deshalb muss man die absolute Position des jeweiligen Elements ermitteln.
Die Differenz zwischen den absoluten Positionen von Maus und Element ergibt die relative Position - d.h. die Aussage, an welcher Stelle einer Grafik sich der Mauszeiger befindet.
Voraussetzung ist ein eindeutiges id-Attribut, mit welchem ein HTML-Element identifiziert werden kann (z.B. id="raster" für die Test-Grafik dieser Seite). Das id-Attribut wird als String an die Funktion position_get übergeben.

Zunächst wird das zu untersuchende DOM-Element (hier: die Grafik raster.gif ) als Objekt an eine Variable (hier n ) zugewiesen.

Leider ist die Syntax nicht einheitlich: Gängige Browser verwenden 2 verschiedene Varianten.

Die erste Variante verwendet die Eigenschaften x,y des Objekts (Gecko, Firefox, ...).

Die zweite Variante (M$IE) ist unglaublich kompliziert. Man muss die Positionen sämtlicher Parent-Elemente addieren, um die Daten eines Elements zu erhalten.

Die Funktion gibt ein Array der beiden absoluten Koordinaten x,y zurück.
Festellung der absoluten Position eines HTML-Elements:
function position_get(id) {
var n=document.getElementById(id);
var xy=new Array(0,0);
try{
xy[0]=n.x;
xy[1]=n.y;
}
catch(e) {}
if((!xy[0]) || (!xy[1])) {
try{
xy[0]=0; xy[1]=0;
while(n) {
xy[0]+=n.offsetLeft;
xy[1]+=n.offsetTop;
n=n.offsetParent;
}
}
catch(e) {}
}
return(xy);
}
Die Position eines Webseiten-Elements wird normalerweise einmalig ermittelt, und zwar unmittelbar nach dem Laden (Ereignis onload des <body>-Elements). Die Position muss erneut bestimmt werden, wenn die Größe des Browser-Fensters geändert wurde, d.h. nach dem Ereignis onresize

Position von HTML-Elementen ändern

Dieses Thema hat nichts mit Ereignissen zu tun. Es wird hier vorgestellt, weil es bei der Verarbeitung der Ereignisse verwendet wird. Beim Ereignis onclick im Bereich der Test-Grafik wird ein rotes Fadenkreuz genau auf den angeklickten Punkt gesetzt.

Fadenkreuz

Zur Anzeige von Objekt-Grafik wird normalerweise SVG verwendet. Das funktioniert mit allen modernen Browsern, jedoch leider nicht mit M$IE.
Daher wird hier ein Trick verwendet: Beide Linien bestehen aus der gleichen Grafik ( r.gif ), die nur ein einziges rotes Pixel enthält.
Mit CSS-Anweisungen werden die beiden Elemente auf die Breite bzw. Höhe von 200 Pixel gebracht.
HTML
<img id="line_x" src="r.gif"
style="height:1px; width:200px;
position:absolute;" />
<img id="line_y" src="/r.gif"
style="height:200px; width:1px;
position:absolute;" />

Absolute Position

Zur Adressierung der beiden Elemente mit DOM-Methoden erhalten sie eindeutige id-Attribute.
In der Funktion werden die Eigenschaften top, left des style-Objekts entsprechend geändert.
Absolute Position mit Javascript ändern:
function position_set(id,x,y) {
var n = document.getElementById(id);
n.style.top = y;
n.style.left = x;
}
Anwendung:
position_set("line_x",123,45);
position_set("line_y",234,56);