# Rechte Maustaste sperren

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, 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, sodass 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.

zurück