| 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
|
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 KoordinatenIn 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;
<img id="line_y" src="/r.gif"
position:absolute;" />
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) {
Anwendung:
var n = document.getElementById(id);
}
n.style.top = y; n.style.left = x;
position_set("line_x",123,45);
position_set("line_y",234,56); |
|
|
Microsoft: die Anzahl der Möglichkeiten sagt nichts über deren Brauchbarkeit...Artikel: About Element Positioning, Measuring Element Dimension and Location Events onscroll, onload, onmousedown, onmouseenter, onmouseleave, onmousemove, onmouseout, onmouseover, onmouseup, onmousewheel, Properties
event.clientX,
event.clientY,
event.offsetX,
event.offsetY,
event.screenX,
event.screenY,
event.x,
event.y,object.clientLeft, object.clientTop, object.offsetLeft, object.offsetTop, object.scrollLeft, object.scrollTop, style.Left, style.pixelLeft, style.pixelTop, style.posLeft, style.posTop, style.top, window.screenLeft, window.screenTop, window.top, |
Mozilla:
Event keyCode,
keyPress,
altKey,
ctrlKey,
metaKey,
shiftKey,Property event.clientX, event.clientY, event.pageX, event.pageY, event.screenX, event.screenY, |
|