Daniel Bäuerlein: Rechte Maustaste auf Text

Hallo,

ich bräuchte in meiner Page eine Funktion, die mir beim Anklicken eines Textes mit der rechten Maustaste eine Alert-Box ausgibt.
Wichtig ist, das diese Alert-Box wirklich nur geöffnet wird, wenn der Text angeklickt wurde (also nicht, wenn irgendwo in einen leeren Bereich geklickt wurde).

Es sollte möglichst in allen gängigen Browsern funktionieren.
Da ich natürlich kein fauler Webmaster bin hab ich natürlich auch schon selber rumprobiert und ein Script von SELFHTML als Basis genommen, bin jedoch kläglich gescheitert:

<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("Test!");
    alert("Test!");
  }
}
</script>

<a href="#" onmousedown="click()">Klick mich</a>

Kann mir da jemand weiterhelfen?
Vielen Dank schon mal für eure Unterstützung!

Viele Grüße

Daniel

  1. Hallo,

    Instanz opera soll ein Kind von window sein - der IE kennt das nicht.

    Die Auswertung der logischen Bedingung

    if ((e.type && e.type == "contextmenu") || (e.button && e.button == 2) || (e.which && e.which == 3))

    in der der IE e.which nicht kennt, bedeutet zwingend, dass beim IE der Ausdruck nicht komplett abgearbeitet werden darf, sondern beim
    1. ODER-Element bereits den if-zweig betritt. Was aber, wenn komplett abgearbeitet und dann betreten wird ?

    Gruss Tom

    1. Hi,

      danke für deine Antwort.
      Da ich leider noch nicht so´lange Javascript programmiere, komme ich damit irgendwie auch nicht weiter.
      Hast du vielleicht nen Typ  oder ein Beispiel-Script, wie man eine Alert Box beim Anklicken eines Textes mit der rechten Maustaste im firefox auslösen kann?
      Oder besser gesagt in jedem gängigen Browser?

      Gruß

      Daniel

      Hallo,

      Instanz opera soll ein Kind von window sein - der IE kennt das nicht.

      Die Auswertung der logischen Bedingung

      if ((e.type && e.type == "contextmenu") || (e.button && e.button == 2) || (e.which && e.which == 3))

      in der der IE e.which nicht kennt, bedeutet zwingend, dass beim IE der Ausdruck nicht komplett abgearbeitet werden darf, sondern beim

      1. ODER-Element bereits den if-zweig betritt. Was aber, wenn komplett abgearbeitet und dann betreten wird ?

      Gruss Tom

    2. hi,

      Instanz opera soll ein Kind von window sein

      Nein, opera soll eine Eigenschaft von window sein.

      • der IE kennt das nicht.

      Herzlichen Glückwunsch, du erkennst eine einfache Browserweiche, wenn du sie siehst.

      Die Auswertung der logischen Bedingung

      if ((e.type && e.type == "contextmenu") || (e.button && e.button == 2) || (e.which && e.which == 3))

      in der der IE e.which nicht kennt, bedeutet zwingend, dass beim IE der Ausdruck nicht komplett abgearbeitet werden darf, sondern beim

      1. ODER-Element bereits den if-zweig betritt.

      Der IE kennt sowohl event.type als auch event.button.
      Die beiden ersten ODER-Ausdrücke liefern also schon mehr als genug (sprich: eine) Möglichkeit, den Gesamtausdruck wahr werden zu lassen.

      Was aber, wenn komplett abgearbeitet und dann betreten wird ?

      Und auf Deutsch?

      gruß,
      wahsaga

      --
      /voodoo.css:
      #GeorgeWBush { position:absolute; bottom:-6ft; }
      1. Hallo,

        die Weiche window.opera wurde nirgends deklariert im Quellcode. Es muss damit eine Eigenschaft von window sein, die der IE nicht kennt.

        Die Verwendung von Script als Mischung von Objekten divergenter Browser verbirgt Probleme. Es gibt User, die sich Scritpfehler anzeigen lassen z.B. wenn sie auf Bezüge aus nicht deklarierten (nicht vordefinierten) Variablen stammen.

        Die Auswertung eines Ausdruckes als Ganzheit oder in Teilen ist ein typisches Compiler-Problem: Man teilt dem Compiler die gewünschte Variante mit. Bei Scritpmaschine geht dieses nicht, also ist die Reihenfolge des Codes enscheidend - besonders bei brwoserdivergenter
        Programmierung.

        Fazit: Browserdivergente Code nicht mischen.
               Logische Ausdrücke vereinfacht programmieren um Transparenz
                   zu haben z.B. in den Unterschieden des event-Objektes der
                   Browser.

        Tom.

        1. Hi,

          die Weiche window.opera wurde nirgends deklariert im Quellcode.

          Muß auch nicht. Die, die sie kennen, wissen damit etwas anzufangen (Bedingung ist wahr), und ...

          Es muss damit eine Eigenschaft von window sein, die der IE nicht kennt.

          ... die, die sie nicht kennen, eben nicht (Bedingung ist unwahr).

          Das nennt man dann Browserweiche.

          Die Verwendung von Script als Mischung von Objekten divergenter Browser verbirgt Probleme.

          Ja, dafür sind Browserweichen üblicherweise auch gedacht.

          Es gibt User, die sich Scritpfehler anzeigen lassen z.B. wenn sie auf Bezüge aus nicht deklarierten (nicht vordefinierten) Variablen stammen.

          Du bist möglicherweise bewandert in (theoretischer) Informatik, offensichtlich aber nicht in (praktischem) JavaScript.

          Das dieses Konstrukt (unbekannte Objekte/Eigenschaften in Bedingungen) nicht zu einem Fehler, sondern schlicht unwahr ergibt, ist in JS exakt so definiert.

          Fazit: Browserdivergente Code nicht mischen.

          Fazit: Hinsetzen, 6, noch viel lernen ...

          Gruß, Cybaer

          --
          Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
  2. Unter Firefox geht folgendes:

    <script type="text/javascript">
    function klick (e) {
      if(e.button == 2)
      alert("Es wurde geklickt");
    }
    </script>

    <span onmousedown="klick(event)">Klick mich</span>

    Wo das problem bei dir liegt, weiß ich nicht...

  3. Hallo,

    ich bräuchte in meiner Page eine Funktion, die mir beim Anklicken eines Textes mit der rechten Maustaste eine Alert-Box ausgibt.

    Du kannst nicht so ohne weiteres feststellen, ob Text angeklickt wurde. Events passieren bei Elementknoten, nicht bei Textknoten oder CSS-internen Zeilenboxen. D.h. Events kannst du nur auf der Ebene von Elementen auswerten. Du kannst also prüfen, ob der Klick auf ein Element ging, das Text enthält - das gilt aber direkt oder indirekt für fast alle Elemente im DOM, es wäre also schwer, ein Kriterium dafür zu finden. Auch kannst du nicht prüfen, ob der Klick wirklich auf den Text in der Content-Box oder auf border oder padding traf.

    Deshalb nach dem üblichen »das geht so nicht« die übliche Frage: Was hast du eigentlich vor?

    Mathias

    1. Hallo,

      ich bräuchte in meiner Page eine Funktion, die mir beim Anklicken eines Textes mit der rechten Maustaste eine Alert-Box ausgibt.

      Du kannst nicht so ohne weiteres feststellen, ob Text angeklickt wurde.

      Naja, das Beispiel stand ja in einem Element, ich denke mal er hat sich da nur mißverständlich ausgedrückt.

      Struppi.

      --
      Javascript ist toll (Perl auch!)
    2. Hi,

      ich hab ein kleines CMS-System mit PHP programmiert, bei dem man
      Texte nach einem Rechtklick darauf ändern kann.
      D.h. nachdem der Text mit der rechten Maustaste angeklickt wurde, geht dieser in einem separaten Texteditor auf u´nd kann editiert werden.
      Dazu muss aber ja irgendwie ermittelt werden, welcher Text angeklickt wurde.

      Gruß

      Daniel

      Hallo,

      ich bräuchte in meiner Page eine Funktion, die mir beim Anklicken eines Textes mit der rechten Maustaste eine Alert-Box ausgibt.

      Du kannst nicht so ohne weiteres feststellen, ob Text angeklickt wurde. Events passieren bei Elementknoten, nicht bei Textknoten oder CSS-internen Zeilenboxen. D.h. Events kannst du nur auf der Ebene von Elementen auswerten. Du kannst also prüfen, ob der Klick auf ein Element ging, das Text enthält - das gilt aber direkt oder indirekt für fast alle Elemente im DOM, es wäre also schwer, ein Kriterium dafür zu finden. Auch kannst du nicht prüfen, ob der Klick wirklich auf den Text in der Content-Box oder auf border oder padding traf.

      Deshalb nach dem üblichen »das geht so nicht« die übliche Frage: Was hast du eigentlich vor?

      Mathias

      1. Dazu muss aber ja irgendwie ermittelt werden, welcher Text angeklickt wurde.

          
        function onmouse(e)  
        {  
         if(!e) e = window.event;  
         var btn = e.button ;// || e.which;  
         if(btn == 2) {  
         var el = e.target || e.srcElement;  
         alert(el.firstChild.data)  
         }  
         return false;  
        }  
        window.onload = function()  
        {  
        var all = document.getElementsByTagName('*');  
         for(var i = 0; i < all.length; i++) all[i].onmouseup = onmouse;  
        }
        

        wobei der Event so mehrfach ausgeführt wird und laut den Ausführungen auf selfhtml die Abfrage auch nciht zuverlässig fuinktioniert.

        Struppi.

        --
        Javascript ist toll (Perl auch!)
        1. Hallo,

          var btn = e.button ;// || e.which;
          if(btn == 2) {

          Zur bloßen Erkennung von Rechtsklick ist eigentlich diese Funktion am geeignetsten, oder?
          http://www.quirksmode.org/js/events_properties.html#button

          Mathias