Das folgende Script sperrt die rechte Maustaste, genauer gesagt verhindert es das Aufklappen des Kontextmenüs. Im Mozilla, Opera und Konqueror ist es möglich, das Abfangen von Rechtsklicks durch JavaScript zu unterbinden. In diesen Fällen funktioniert das Script nicht.
Bitte beachten Sie, dass dieses Script einige Techniken benutzt werden, die momentan nicht in SELFHTML dokumentiert sind, sondern nur hier Verwendung finden.
<script type="text/javascript"> function click (e) { if (!e) e = window.event; if ((e.type && e.type == "contextmenu") || (e.button && e.button == 2) || (e.which && e.which == 3)) { if (window.opera) window.alert("Sorry: Diese Funktion ist deaktiviert."); return false; } } if (document.layers) document.captureEvents(Event.MOUSEDOWN); document.onmousedown = click; document.oncontextmenu = click; </script>
Im Internet Explorer ab Version 5 sowie in Gecko-basierten Browsern (Mozilla, Mozilla Firefox usw.) tritt vor dem Aufklappen des Kontextmenüs das Ereignis contextmenu
ein. Dieses ist ursprünglich dazu gedacht, das Browser-Kontextmenü in geschlossenen Webanwendungen durch ein eigenes Kontextmenü zu ersetzen. Es ist aber auch möglich, darüber schlichtweg das Aufklappen des Browser-Kontextmenüs zu verhindern, ohne stattdessen ein eigenes Kontextmenü auf Basis von HTML und CSS erscheinen zu lassen - vorausgesetzt, die Browsereinstellungen lassen dies zu.
Über document.oncontextmenu = click;
wird die Funktion click()
als Event-Handler für das contextmenu
-Ereignis beim Objekt document angegeben. Dadurch wird die Funktion immer dann ausgeführt, wenn der Benutzer irgendwo im Dokument das Kontextmenü aktivieren will, z.B. durch einen Rechtsklick.
In IE 4, Netscape 4, Opera und Konqueror wird bei einem Rechtsklick lediglich ein reguläres mousedown-Ereignis erzeugt, genauso wie bei einem Linksklick. Über document.onmousedown = click;
wird ebenfalls die Funktion click()
als Event-Handler für alle Mausklicks im Dokument registriert.
Damit im Netscape 4 die Behandlung des mousedown
-Ereignisses möglich ist, muss zusätzlich document.captureEvents mit dem Parameter Event.MOUSEDOWN
ausgeführt werden. Mit if (document.layers)
wird vorher abgefragt, ob es sich um einen Netscape-4-Browser handelt.
Die Funktion click()
wird folglich in zwei Fällen ausgeführt: Bei einem contextmenu
-Ereignis oder einem mousedown
-Ereignis. Im ersten Fall kann das Ereignis sofort abgefangen werden. Im zweiten Fall muss erst geprüft werden, ob es sich um einen Klick mit der rechten Maustaste handelt. Die nötigen Informationen - den Typ des Ereignisses sowie die gedrückte Maustaste - erhält die Funktion über das Event-Objekt. Doch bereits der Zugriff darauf gestaltet sich schwierig. Im Internet Explorer ist das Event-Objekt unter window.event
abrufbar. In allen anderen Browsern wird es der Event-Handler-Funktion als Parameter übergeben. Die Funktion click()
nimmt daher einen Parameter mit dem Namen e
entgegen. Eine if-Anweisung prüft direkt beim Start der Funktion, ob das Event-Objekt auf diese Weise übergeben wurde und somit das Objekt e
existiert (siehe Abfragen ob ein Objekt existiert). Wenn dies nicht der Fall ist, wird das Event-Objekt aus window.event
in die Variable e
kopiert. Durch diese Zuweisung ist das Event-Objekt auf jeden Fall als e
ansprechbar.
Im Folgenden prüft die Funktion, ob eine der drei folgenden Bedingungen erfüllt ist: Erstens wird abgefragt, ob der Typ des Ereignisses type gleich contextmenu
ist. Zweitens und Drittens wird abgefragt, ob die rechte Maustaste gedrückt wurde. Im Internet Explorer, Opera, Mozilla und Konqueror lässt sich mithilfe der Eigenschaft button des Event-Objekts in Erfahrung bringen, welche Maustaste gedrückt wurde. Die Zahl 2
steht einhellig für die rechte Maustaste. Im Netscape 4 hingegen heißt die Eigenschaft which. In dem Fall steht die Zahl 3
für die rechte Maustaste. Bei allen drei Abfragen wird vorher geprüft, ob die jeweilige verwendete Event-Eigenschaft existiert, so dass das Script mit den zur Verfügung stehenden Objekten arbeitet.
Wenn also eine dieser Bedingungen zutrifft, muss das Ereignis abgefangen werden, um das Erscheinen des Kontextmenüs zu unterbinden. Dies wird mit dem Rückgabewert false
bewerkstelligt. Vorher jedoch muss unter gewissen Umständen ein Dialogfenster angezeigt werden, und zwar nur dann, wenn das Script vom Opera-Browser ausgeführt wird. Dies wird über if (window.opera)
abgefragt. Genau genommen ist das Dialogfenster für Opera 8 nötig. In früheren Opera-Versionen führt bereits document.onmousedown = click;
dazu, dass alle Kontextmenüs deaktiviert werden - ohne dass die Funktion click()
bei einem Rechtsklick überhaupt ausgeführt wird. In Version 8 ist dieser Fehler behoben. Zudem reicht ein einfaches return false;
nicht mehr aus, um das Aufklappen des Kontextmenüs zu verhindern. Es muss zusätzlich ein Dialogfenster angezeigt werden. Das Dialogfenster kann nicht einfach in allen Browsern angezeigt werden, denn z.B. Mozilla erzeugt bei einem Rechtsklick sowohl ein mousedown
- als auch ein contextmenu
-Ereignis. Daher würden bei einem Rechtsklick zwei Dialogfenster angezeigt.