~b: Kontextmenü mittels onmousedown-Event

Hallo Forum,

ich versuche gerade für eine (nicht öffentliche) Webanwendung ein eigenes Kontextmenü zu erstellen, welches allerdings nur bei einem Rechtsklick auf bestimmte Elemente erscheinen soll. Das Script sollte einigermaßen Cross-Browser-tauglich sein (FX, IE, Opera*, Chrome**). Beim Aufruf der Funktion für das eigene Kontextmenü soll zudem ein (dynmischer) Integer-Wert übergeben werden, was die Sache ein wenig verkompliziert.

Praktischer Weise verstehen einige Browser die "oncontextmenu"-Methode, aber leider eben nicht alle, zumal es kein "Standard" ist. Also versuche ich das Ganze via "onmousedown" zu lösen, was bisher auch ganz gut klappt.

  
function getContextMenu (objEvt, iArg)  
{  
    // for IE  
    if (!objEvt)  
    {  
        objEvt = window.event;  
    }  
  
    // IE uses the "button" event, all other "which"  
    // in IE 2 is the right button, 3 in all other  
    if (objEvt.button === 2 || objEvt.which === 3) {  
        alert(iArg);  
    }  
};  

  
This is a <span onmousedown="getContextMenu(event, 123);">text</span>.  

Ich denke der Code ist recht selbsterklärend. Er funktioniert soweit auch ganz gut und vor allem in allen gewünschten Browsern. Nur gibt es Browser, wie z.B. der Firefox, die die Eigenschaft besitzen, nach dem Rechtsklick-Event und der ausgeführten Funktion noch ihr eigenes Kontextmenü zu präsentieren. Dies ist natürlich nicht gewünscht und soll unterbunden werden. Nun habe ich schon recht viel ausprobiert, bisher aber keine legitime Lösung gefunden.

Hat einer einen Rat, eine Idee oder natürlich am Besten eine Lösung?

Danke und Gruß
Bastian

*) Bei Opera ist das Rechtsklick-Event auf Elemente standardmäßig deaktiviert. Dieses Verhalten wird ignoriert, sprich es wird vorausgesetzt, dass diese Option im Browser aktiviert ist.

**) Für Testzwecke nutze ich Iron.

  1. Hi,

    Nur gibt es Browser, wie z.B. der Firefox, die die Eigenschaft besitzen, nach dem Rechtsklick-Event und der ausgeführten Funktion noch ihr eigenes Kontextmenü zu präsentieren. Dies ist natürlich nicht gewünscht und soll unterbunden werden. Nun habe ich schon recht viel ausprobiert

    Und was hast du probiert?

    Die gaengige Methode zum Unterbinden der Default-Aktion, die auf einen Event erfolgt, ist das simple return false.
    So Sachen wie event.preventDefault gibt's dann natuerlich auch noch.

    Allerdings ermoeglichen es neuere Browser dem Nutzer oftmals, solches Verhalten - Unterbindung des normalen Kontext-Menues per Script - in den Optionen gaenzlich zu unterbinden. Wenn du also keine Kontrolle ueber die verwendeten Browser hast, kannst du dir eine vollkommene "Loesung" definitiv von der Backe wischen.

    MfG ChrisB

    --
    „This is the author's opinion, not necessarily that of Starbucks.“
    1. Hi,

      Moin!

      Und was hast du probiert?
      Die gaengige Methode zum Unterbinden der Default-Aktion, die auf einen Event erfolgt, ist das simple return false.
      So Sachen wie event.preventDefault gibt's dann natuerlich auch noch.

      Wie schon in der Antwort auf den Beitrag von Harlequin geschrieben, habe ich es zuerst mit einem return false; probiert, was allerdings keinerlei Auswirkungen hat. Zudem habe ich probiert das Event an dieser Stelle zu stoppen (Vermeiden von "bubbling"), z.B. mittels objEvt.stopPropagation();, was aber auch nicht klappt. Vielleicht habe ich aber auch etwas falsch gemacht.

      Allerdings ermoeglichen es neuere Browser dem Nutzer oftmals, solches Verhalten - Unterbindung des normalen Kontext-Menues per Script - in den Optionen gaenzlich zu unterbinden. Wenn du also keine Kontrolle ueber die verwendeten Browser hast, kannst du dir eine vollkommene "Loesung" definitiv von der Backe wischen.

      Wie ich bereits im Ausgangsbeitrag geschrieben habe, wird davon ausgegangen, dass derarties Verhalten (Unterbinden) nicht aktiviert ist, sodass es eigentlich funktionieren sollte.

      Derzeit lässt sich die Sache nur "umgehen", indem man zusätzlich die Funktion oncontextmenu mit einer eigenen Funtkion überschreibt bzw. hier einen return false; liefert. Denn die Browser, die weiterhin das eigene Kontextmenü anzeigen, kennen diese Funktion. Dies ist aber eigentlich nicht gewollt, da a) kein Standard und somit b) recht Browserspezifisch (was zu vermeiden ist). Zudem kommen noch so Sachen wie vermeiden von unnötig langem und komplexem Code, etc.

      MfG ChrisB

      Gruß
      ~b

      1. Hi,

        Wie schon in der Antwort auf den Beitrag von Harlequin geschrieben, habe ich es zuerst mit einem return false; probiert, was allerdings keinerlei Auswirkungen hat.

        Na ja, onmousedown ist wohl nicht der richtige Event dafuer.
        Wenn dieser es nicht ist, der das Erscheinen des Browser-Kontextmenues ausloest - dann kannst du es auch nicht bei diesem Event unterbinden.

        Derzeit lässt sich die Sache nur "umgehen", indem man zusätzlich die Funktion oncontextmenu mit einer eigenen Funtkion überschreibt bzw. hier einen return false; liefert. Denn die Browser, die weiterhin das eigene Kontextmenü anzeigen, kennen diese Funktion.

        Na dann hast du doch bereits eine Loesung ...?

        Dies ist aber eigentlich nicht gewollt, da a) kein Standard und somit b) recht Browserspezifisch (was zu vermeiden ist). Zudem kommen noch so Sachen wie vermeiden von unnötig langem und komplexem Code, etc.

        Du willst das Browser-Kontextmenue unterbinden, und du hast eine Moeglichkeit dazu gefunden - was willst du denn jetzt noch? Weltfrieden?
        Nutze die Moeglichkeit, oder lass' es.

        Und unnoetig komplex oder langsam wird's dadurch sicher auch nicht.

        MfG ChrisB

        --
        „This is the author's opinion, not necessarily that of Starbucks.“
        1. Hi,

          Nabend.

          Na dann hast du doch bereits eine Loesung ...?

          Du willst das Browser-Kontextmenue unterbinden, und du hast eine Moeglichkeit dazu gefunden - was willst du denn jetzt noch? Weltfrieden?
          Nutze die Moeglichkeit, oder lass' es.

          Weltfrieden wäre eine Idee, aber... Ach, lassen wir das.
          Ich werde es vorerst auch so machen. Warum ich es nicht wollte, habe ich zwar gesagt, aber darauf scheint kein Wert gelegt zu werden. Solange frickeln, bis es passt!? Es sollte halt W3C-Standardkonform sein. Ich habe aber gerade noch mal nachgeschaut und es scheint so, als würde oncontextmenu in HTML5 eh Standard werden. Also nehme ich das einfach mal so hin.

          Und unnoetig komplex oder langsam wird's dadurch sicher auch nicht.

          Von langsam habe ich auch nichts gesagt. Und zu dem komplex erspare ich mir mal meinen Kommentar.

          MfG ChrisB

          Gruß und dennoch Danke,
          ~b

      2. Derzeit lässt sich die Sache nur "umgehen"

        Da umgeht man nichts, sondern geht das Problem direkt an.

        indem man zusätzlich die Funktion oncontextmenu mit einer eigenen Funtkion überschreibt bzw. hier einen return false; liefert. Denn die Browser, die weiterhin das eigene Kontextmenü anzeigen, kennen diese Funktion. Dies ist aber eigentlich nicht gewollt, da a) kein Standard und somit b) recht Browserspezifisch (was zu vermeiden ist).

        Weißt du, wieviel im Bereich von JavaScript kein Standard ist? Du willst es gar nicht wissen, dann müsstest du dich auf deine Hände setzen und dürftest kein einziges Script mehr schreiben.

        Der contextmenu-Event ist das, was du willst, natürlich ist der letztlich browserspezifisch, aber solche Fälle hat man in JavaScript ungefähr fünfhunderttausend Mal. Da musst du dich einfach dran gewöhnen. Das heißt nicht, dass man sich über über Standards keine Gedanken machen sollte und sie nicht nach Möglichkeit benutzen sollte, aber ein signifikanter Teil der JavaScript-Landschaft ist von diesen einfach nicht abgedeckt.

        http://aktuell.de.selfhtml.org/weblog/javascript-standards

        Mathias

  2. Yerf!

    Ich denke der Code ist recht selbsterklärend. Er funktioniert soweit auch ganz gut und vor allem in allen gewünschten Browsern. Nur gibt es Browser, wie z.B. der Firefox, die die Eigenschaft besitzen, nach dem Rechtsklick-Event und der ausgeführten Funktion noch ihr eigenes Kontextmenü zu präsentieren. Dies ist natürlich nicht gewünscht und soll unterbunden werden. Nun habe ich schon recht viel ausprobiert, bisher aber keine legitime Lösung gefunden.

    Hat einer einen Rat, eine Idee oder natürlich am Besten eine Lösung?

    Das Default-Verhalten des Browsers lässt sich normalerweise mittels eines return false; im Event-Handler unterbinden. Möglicherweise ist aber onmousedown der falsche Event dafür, es gibt glaub ich auch noch ein onrightclick oder so ähnlich. Allerdings wird das zumindest im Opera trotzdem nicht funktionieren, der lässt sich das Kontextmenü nicht abgewöhnen.

    Gruß,

    Harlequin

    --
    <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
    1. Yerf!

      Moin!

      Das Default-Verhalten des Browsers lässt sich normalerweise mittels eines return false; im Event-Handler unterbinden. Möglicherweise ist aber onmousedown der falsche Event dafür, es gibt glaub ich auch noch ein onrightclick oder so ähnlich. Allerdings wird das zumindest im Opera trotzdem nicht funktionieren, der lässt sich das Kontextmenü nicht abgewöhnen.

      Mittels einem return false; hatte ich bereits versucht dieses Verhalten zu unterbinden, was bei diesem Event allerdings nicht klappt.

      Gruß,

      Harlequin

      Gruß
      ~b