molily: Event-Handling: gedrückte Maustaste in Erfahrung bringen

Hallo,

Gibt es eine zuverlässige Vorgehensweise, mit der man bei einem Mouse-Event herausbekommen kann, welche Maustaste(n) gedrückt wurden? ppk hat unter http://www.quirksmode.org/dom/w3c_events.html#miscprop das unterschiedliche Verhalten vieler Browser dokumentiert. Mir scheint es hochkompliziert, letztlich muss man mit direkten Browserabfragen der übelsten Sorte arbeiten (navigator oder »wenn es jenes unbeteiligte Objekt gibt, handelt es sich um einen bestimmten Browser, der ein bestimmtes Maustasten-Schema verwendet«). Ich habe zwei Fallunterscheidungen geschrieben, die meinen Tests nach relativ zuverlässig funktionieren (und beide mit den getestete Browsern dieselben Resultate liefern sollten):

http://molily.de/temp/maustaste.html

Was haltet davon und von dieser Vorgehensweise im Allgemeinen? Wenn man über which geht, ist es freilich einfacher, aber das standardmäßige Anwenden von DOM 2 Events bei einem unbekannten Browser scheint mir zukunftssicherer.
Lohnt es sich, eine solche Browserweiche in SELFHTML unter http://de.selfhtml.org/javascript/objekte/event.htm vorzustellen (diese Seite wird komplett überarbeitet)? Das Browserchaos lässt nur solche heiklen Methoden zu. Kann man mit solchen Scripten überhaupt produktiv arbeiten? Ich frage mich, welchen Gebrauchswert Scripte haben, die alle Möglichkeiten abdecken wollen und dabei wahrscheinlich scheitern. Das Abfragen der rechten Maustaste ist bereits ohne Browserweichen möglich (button gleich 2 oder which gleich 3). Danach wird öfters gefragt, dazu kann ich mir auch praktische Anwendungen vorstellen - aber wann will man denn bitte einen Mittelklick abfangen?

Mathias

  1. Hallo,

    Browserabfragen sind natürlich immer heikel und es sollte auf sie wenn es irgendwie geht verzichtet werden. Wie du schon selber andeutetest ist es wahrscheinlich unmöglich, alle Fälle abzudecken, insbesondere da  die Hersteller mit dem Navigator-Objekt nun wirklich schlampig umgehen.

    Auch eine Abfrage nach im Browser implementierten Objekten (z.B. 'document.all') ist nicht immer sicher. Beides kann man in verschiedenen Browsern einstellen, man weiß nie, was die Zukunft bringt und man kennt bestimmt nicht alle Browser auf allen Betriebsystemen und kann auch nicht alle testen. Dennoch gibt es natürlich Momente, bei denen man um eine Browserabfrage nicht vorbei kommt.

    Zu deinem Anliegen im speziellen: die rechte und linke Maustaste gehört mir und meinem System! Viele Browser verbieten mit Recht einen Zugriff auf diese Tasten. Als Anwender fühle ich mich belästigt, wenn meine gewohnten System- und Browserfunktionen nicht mehr existieren. Daher am Besten auf so was ganz verzichten.

    Ciao
    Heinzelhund

    1. Moin,

      Zu deinem Anliegen im speziellen: die rechte und linke Maustaste gehört mir und meinem System! Viele Browser verbieten mit Recht einen Zugriff auf diese Tasten. Als Anwender fühle ich mich belästigt, wenn meine gewohnten System- und Browserfunktionen nicht mehr existieren. Daher am Besten auf so was ganz verzichten.

      Darum geht es auch gar nicht. Es geht um Event-Handling allgemein und das ist als solches weder böse noch gut. Es muss einfach die Möglichkeit geben, Events aus dem Dokument zu bekommen und darauf angemessen zu reagieren, http://www.ploetzli.ch/forum/highlight/ kann man beispielsweise unmöglich ohne bauen. Und da habe ich es mir noch einfach gemacht und reagiere auf jeden Mausklick gleich, es sollte aber halt auch möglich sein zu programmieren "Klick mit der linken Taste lädt die Eigenschaften des Objekts, klick mit der rechten Taste setzt die Eigenschaften zurück" (oder so, vielleicht etwas sinnvolleres). Oder schlimmer noch: vor langer Zeit habe ich mal Mausgesten in JavaScript implementiert und da ist es, ähm, äusserst sinnvoll wenn man die nur auf eine bestimmte Maustaste legen kann.

      --
      Henryk Plötz
      Grüße aus Berlin
      ~~~~~~~~ Un-CDs, nein danke! http://www.heise.de/ct/cd-register/ ~~~~~~~~
      ~~ Help Microsoft fight software piracy: Give Linux to a friend today! ~~
      1. Hallo,

        Darum geht es auch gar nicht. Es geht um Event-Handling allgemein und das ist als solches weder böse noch gut. Es muss einfach die Möglichkeit geben, Events aus dem Dokument zu bekommen und darauf angemessen zu reagieren, http://www.ploetzli.ch/forum/highlight/ kann man beispielsweise unmöglich ohne bauen. Und da habe ich es mir noch einfach gemacht und reagiere auf jeden Mausklick gleich, es sollte aber halt auch möglich sein zu programmieren "Klick mit der linken Taste lädt die Eigenschaften des Objekts, klick mit der rechten Taste setzt die Eigenschaften zurück"

        Aber das ist ja das Problem. Das angegebene Beispiel ist ja sinnvoll und schön. In meinem Browser (Firefox) sehe ich das auch so, wie ich es haben will. Klick ich mit der linken Maustaste auf bspw. eine Farbe, dann wird diese ins Feld eingetragen. Das ist ja in Ordnung und im Grunde nichts anderes als das Setzen eines einfachen Links. Da gibt mir die Seite ja auch das darauf folgende Ereignis vor.

        Klick ich aber auf meine rechte Maustaste bei einer Seite, die den rechten Mausklick abfängt, weil ich bspw. ein Lesezeichen auf diese Seite setzen möchte, geht entweder nicht mein vom Browser generiertes Contentmenü auf oder es geht anders herum ständig auf, wenn ich die von der Seite unterlegte Funktion nützen will. Beides nervt.

        Ciao
        Heinzelhund

        1. Moin,

          Klick ich aber auf meine rechte Maustaste bei einer Seite, die den rechten Mausklick abfängt, weil ich bspw. ein Lesezeichen auf diese Seite setzen möchte, geht entweder nicht mein vom Browser generiertes Contentmenü auf oder es geht anders herum ständig auf, wenn ich die von der Seite unterlegte Funktion nützen will. Beides nervt.

          Ja, aber ich denke da wieder viel mehr an Webapplikationen wie etwa Mailinterfaces. Dort ist es in der Regel unsinnig auf einen Teilframe oder so ein Bookmark legen zu wollen, aber höchst sinnvoll beispielsweise mit der rechten Mauste auf einer Mail weitere Eigenschaften aufzurufen (halt ein eigene Kontextmenü), mit der linken Maustaste die Mail zu öffnen und mit der mittleren sie in einem neuen Fenster zu öffnen.

          Oder noch besseres Beispiel: s5 sollte Code enthalten (hab nicht nochmal nachgesehen) um bei _Links_klick irgendwo in das Dokument, _ausser_ auf einen Link zur nächsten Folie zu wechseln, bei jedem anderen Klick aber nichts zu tun.

          Und wenigstens zum Unterdrücken der Standardaktion ist die DOM-Definition recht brauchbar: Da gibt es zwar wieder spaßige Browserinkompatibilitäten, aber die kann man mit Objektabfragen recht leicht loswerden: DOM kennt preventDefault(), IE kennt returnValue.

          --
          Henryk Plötz
          Grüße aus Berlin
          ~~~~~~~~ Un-CDs, nein danke! http://www.heise.de/ct/cd-register/ ~~~~~~~~
          ~~ Help Microsoft fight software piracy: Give Linux to a friend today! ~~
          1. Hallo,

            Ja, aber ich denke da wieder viel mehr an Webapplikationen wie etwa Mailinterfaces. Dort ist es in der Regel unsinnig auf einen Teilframe oder so ein Bookmark legen zu wollen, ...

            Letztlich ist es sicherlich eine Frage der Abwägung. Ich lass mir bspw. gerne mal über die "Web Developer"-Extention von Firefox anzeigen, wie etwas in der Seite konstruiert worden ist. Da würde es mich also bei jeder denkbaren Seite stören.

            Ob der User es aber nun als nervend empfindet oder nicht, liegt wohl an der Seite selber. Hat diese eher den Charakter einer Anwendung, also ein webbasierter Texteditor oder so was, dann wird er nichts dagegen haben, dass sein Contextmenü "angepasst" wurde, da er selbiges ja offline gewohnt ist. Gleiches gilt natürlich auch in Intranets mit sehr begrenzter Nutzerzahl und spezifischen Anwendungen.

            Aber allgemein in der freien Wildbahn, würde ich eher vorsichtig damit sein. (Abgesehen davon ist das Verwenden des Event-Objekts, da man es ja mindestens für den IE und für's W3C schreiben muss, recht umständlich. NS4 kann man wohl mittlerweile getrost ignorieren.)

            Ciao
            Heinzelhund

    2. Hallo,

      die rechte und linke Maustaste gehört mir und meinem System!

      Die Pawlowsche Antwort musste ja kommen, ohne dass mein Posting dieses Thema überhaupt tangierte.

      Viele Browser verbieten mit Recht einen Zugriff auf diese Tasten. Als Anwender fühle ich mich belästigt, wenn meine gewohnten System- und Browserfunktionen nicht mehr existieren.

      Schön, aber was hat das mit meinem Posting und meiner Frage zu tun? »Zugriff auf Tasten«, also das Auslesen der gedrückten Maustaste, das erlauben alle modernen Browser, das kann man nicht abschalten. Darum geht es mir. »Abfangen von Maustasten«, das Abschalten der Standard-Ereignisbehandlung, das heißt vor allem das Rechtsklick-Kontextmenü, das hat mit der Maustasten-Frage nichts zu tun. Wenn man das will, nutzt man für Mozilla und MSIE keine Mausereignisse, sondern den contextmenu-Event. Einen Rechtsklick als Rechtsklick kann man z.B. im Mozilla auch gar nicht abfangen.

      Mathias

      1. Hallo,

        Die Pawlowsche Antwort musste ja kommen, ohne dass mein Posting dieses Thema überhaupt tangierte.

        Dass ich manchmal mit Speichelfluss vor einigen Fragen stehe, will ich ja gar nicht bestreiten...

        Schön, aber was hat das mit meinem Posting und meiner Frage zu tun? »Zugriff auf Tasten«, also das Auslesen der gedrückten Maustaste, das erlauben alle modernen Browser, das kann man nicht abschalten. Darum geht es mir. »Abfangen von Maustasten«, das Abschalten der Standard-Ereignisbehandlung, das heißt vor allem das Rechtsklick-Kontextmenü, das hat mit der Maustasten-Frage nichts zu tun. Wenn man das will, nutzt man für Mozilla und MSIE keine Mausereignisse, sondern den contextmenu-Event. Einen Rechtsklick als Rechtsklick kann man z.B. im Mozilla auch gar nicht abfangen.

        Ich zitiere mich mal von anderer Stelle des Threads selber:
        "Klick ich aber auf meine rechte Maustaste bei einer Seite, die den rechten Mausklick abfängt, weil ich bspw. ein Lesezeichen auf diese Seite setzen möchte, geht entweder nicht mein vom Browser generiertes Contextmenü auf oder es geht anders herum ständig auf, wenn ich die von der Seite unterlegte Funktion nützen will. Beides nervt."
        (https://forum.selfhtml.org/?t=103324&m=636205)

        Es bezog sich also nicht einfach auf das 'Contextmenü-Unterdrücken um seinen Quelltext zu schützen'. Das war eh nie sonderlich erfolgreich. Sondern es hat etwas mit Usability zu tun.

        Mir scheint es hochkompliziert, letztlich muss man mit direkten Browserabfragen der übelsten Sorte arbeiten (navigator oder »wenn es jenes unbeteiligte Objekt gibt, handelt es sich um einen bestimmten Browser, der ein bestimmtes Maustasten-Schema verwendet«).

        Eine Browserabfrage benötigst du ja schon allein für das Verwenden des Event-Objektes. Bezüglich der Maustasten habe ich mir aus angegebenen Grund noch keine Gedaken gemacht, aber das scheint mir noch anfälliger. Aber dazu hab ich mich auch mehrmals geäußert.

        Was haltet davon und von dieser Vorgehensweise im Allgemeinen?

        Genau das habe ich dir geantwortet (sogar noch als 'Meinung' im Kopf kenntlich gemacht). Um es klar zu sagen: ich finde dein Script als Script völlig in Ordnung und eventuell mag es Anwendungsbereiche geben, wo so etwas Sinn macht (ließ mal weiter im Thread ...), aber im Allgemeinen stört es _mich_ als Nutzer, wenn irgendetwas mit meiner rechten Maustaste passiert, und auf Grund der uneinheitlichen Browser ist es umständlich zu realisieren und fehleranfällig, da man ja nicht wissen kann, ob es nicht doch einen Browser, ein OS oder eine Maus gibt, die irgendwie etwas anderes machen, als das, was man erwartet hat.

        Ciao
        Heinzelhund

        1. Hallo,

          "Klick ich aber auf meine rechte Maustaste bei einer Seite, die den rechten Mausklick abfängt, weil ich bspw. ein Lesezeichen auf diese Seite setzen möchte, geht entweder nicht mein vom Browser generiertes Contextmenü auf oder es geht anders herum ständig auf, wenn ich die von der Seite unterlegte Funktion nützen will. Beides nervt."

          Über Mausereignisse ist es wie gesagt wenig sinnvoll, Änderungen am Kontextmenü vornehmen zu wollen. Ohne entsprechende Kontrolle über den Browser ist es selbstverständlich sinnlos, mit einem contextmenu-Event etwas sinnvolles anfangen zu wollen. Bei WWW-Anwendungen hingegen wäre es eher interessant, ob es sich bei einem Mausereignis *nicht* um einen Rechtsklick handelt bzw. kein contextmenu-Event ausgelöst wird.

          Es bezog sich also nicht einfach auf das 'Contextmenü-Unterdrücken um seinen Quelltext zu schützen'. Das war eh nie sonderlich erfolgreich. Sondern es hat etwas mit Usability zu tun.

          Wie kommst du jetzt auf »Quelltext schützen«?

          Mir scheint es hochkompliziert, letztlich muss man mit direkten Browserabfragen der übelsten Sorte arbeiten (navigator oder »wenn es jenes unbeteiligte Objekt gibt, handelt es sich um einen bestimmten Browser, der ein bestimmtes Maustasten-Schema verwendet«).

          Eine Browserabfrage benötigst du ja schon allein für das Verwenden des Event-Objektes.

          *Das* ist glücklicherweise eine simple Abfrage von beteiligten Objekten.

          im Allgemeinen stört es _mich_ als Nutzer, wenn irgendetwas mit meiner rechten Maustaste passiert

          Diese Meinungsäußerung sei dir ungenommen, als Replik auf mein Posting verstehe ich sie trotzdem nicht. Das Verarbeiten von Mausereignissen, bei denen die rechte Maustaste gedrückt wurde, ist, wie ich schon im Ausgangsposting schrieb, technisch gesehen nicht der Rede wert. Ebenso gibt es contextmenu. Natürlich hilft einem beides wenig weiter, da die Funktionalität vorbelegt ist. Darüber wollte ich nicht diskutieren.

          Mathias

          1. Hallo,

            Über Mausereignisse ist es wie gesagt wenig sinnvoll, Änderungen am Kontextmenü vornehmen zu wollen. Ohne entsprechende Kontrolle über den Browser ist es selbstverständlich sinnlos, mit einem contextmenu-Event etwas sinnvolles anfangen zu wollen. Bei WWW-Anwendungen hingegen wäre es eher interessant, ob es sich bei einem Mausereignis *nicht* um einen Rechtsklick handelt bzw. kein contextmenu-Event ausgelöst wird.

            Es ist ja so, dass beim PC die rechte Maustaste standardmäßig mit dem Contextmenü belegt ist, insofern wäre eine Verwendung der rechten Maustaste immer ein Verstoß gegen die Erwartungshaltung des Nutzers. Als interessante Anwendung einer modifizierten rechten Maustaste wäre ein Verhalten wie beispielsweise das des Adobe Readers denkbar, bei dem man mit der rechten Maustaste die Seite verschieben kann. Soetwas müsstest man einem Nutzer aber zuvor erklären, da es wie gesagt nicht seiner Erwartungshaltung bei seinem Browser entsprechen würde. Hier würde es dann aber auch Sinn machen, das Contextmenü zu unterbinden, was bekanntlich nicht bei allen Browsern funktioniert. Gleiches gilt für rechte Mausklicks über ausgewählte Elemente. Da würde mich ein Contextmenü dann auch stören.

            Wie kommst du jetzt auf »Quelltext schützen«?

            Diese Diskussionen bezüglich der rechten Maustaste hier im Forum hast du doch mit "Pawlowsche Antwort" angedeutet. - Dachte ich zumindest.

            Eine Browserabfrage benötigst du ja schon allein für das Verwenden des Event-Objektes.

            *Das* ist glücklicherweise eine simple Abfrage von beteiligten Objekten.

            Und ja leider notwendig, damit man das Event-Objekt überhaupt benutzen kann.

            Diese Meinungsäußerung sei dir ungenommen, als Replik auf mein Posting verstehe ich sie trotzdem nicht. [...]  Natürlich hilft einem beides wenig weiter, da die Funktionalität vorbelegt ist. Darüber wollte ich nicht diskutieren.

            Dann bezog sich deine Frage "Was haltet davon und von dieser Vorgehensweise im Allgemeinen?" aus dem Anfangsposting ausschließlich auf den technischen Aspekt. Ich dachte "im Allgemeinen" bezöge sich auf den Gebrauch der Funktionalität. Da habe ich dich offensichtlich falsch verstanden. :-(

            Dein Script halte ich, wie bereits gesagt, für in Ordnung. Zumindest wüsste ich nichts besseres. ;-)

            Ciao
            Heinzelhund

            1. Hello,

              Es ist ja so, dass beim PC die rechte Maustaste standardmäßig mit dem Contextmenü belegt ist,

              nein. Die rechte Maustaste ist standardmäßig mit dem Index für die rechte Maustaste belegt beim PC. Und das auch nur, wenn der IBM-konforme Standard-Handler für den IRQ 33h eingerichtet ist. Sonst hat die Maus eben den Effekt, der im passenden Hardware-Kanal (Hardware-Interrupt) eingetragen ist.

              insofern wäre eine Verwendung der rechten Maustaste immer ein Verstoß gegen die Erwartungshaltung des Nutzers.

              Es ist Sache des Programmierers der Applikation, welche Funktion er der Taste zuweist. Allerdings sollten die Eigenheiten des OS erstmal berücksichtigt werden, sofern das geht, und dann die Eigenheiten des Wrapper-Programs (der Browser ist so eines, wenn er intern wieder eigene Scripte zulässt).

              Harzliche Grüße aus http://www.annerschbarrich.de

              Tom

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              Nur selber lernen macht schlau
      2. Hello,

        die rechte und linke Maustaste gehört mir und meinem System!

        Aber trotzdem haben die Tasten der Maus jede eine eigene Kennung im Datenblock.
        Diese Kennung wird im OS dann übernommen und durch "Taste A", "Taste B" und "Taste C" dereferenziert. Die API, mit der das Programm arbeitet, sollte also nur noch mit "Taste A", "Taste B" und "Taste C" arbeiten. Ob A nun 1 bedeutet oder A die 3 (aus der Hardwareschicht) repräsentiert, sollte Dir als Anwendugnsprogrammierer egal sein.

        Du bietest im Programm dann bestenfalls mehrere Möglichkeiten an. Eine echte SAA-Oberfläche wird es hier aufgrund der allzu vielfältigen Möglichkeiten auf beiden Seiten (Applikation / Nutzer) und der allzu unterschiedlichen Möglichkeiten des Transfermediums (Maus) nicht geben. Wenn Du es schaffst, eine allgemeingültige Abbildungsfunktion hierfür zu erstellen, dann hast Du meiner Meinung nach einen Preis verdient.

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. Moin,

          Datenblock [...] dereferenziert [...] SAA-Oberfläche [...] Transfermediums [...] Abbildungsfunktion

          Bullshit!

          Und, was habe ich gewonnen?

          PS: Könntest du das nächste mal nicht noch Synergieeffekte einbauen? Dann erkennt man das Bullshit-Spielfeld leichter als solches.

          --
          Henryk Plötz
          Grüße aus Berlin
          ~~~~~~~~ Un-CDs, nein danke! http://www.heise.de/ct/cd-register/ ~~~~~~~~
          ~~ Help Microsoft fight software piracy: Give Linux to a friend today! ~~
          1. Hello,

            Bullshit!

            Sind das jetzt die neuen Umgangsformen im Forum? Dann sollten wir mal die FAQ anpassen :-)

            Harzliche Grüße aus http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
  2. Hello,

    hat denn der Mac inzwischen auch Mehrtastenmäuse?

    Für die PC-Welt wundert es mich allerdings, dass es da Unterschiede gibt, denn der INT33 ist dort schon seit mehr als 23 Jahren für die Mäuse zuständig und sollte inzwischen auch bei den hinterwäldlerischsten Softwareentwicklern angekommen sein.

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. Hallo Tom,

      hat denn der Mac inzwischen auch Mehrtastenmäuse?

      Nicht mit den Macs ausgeliefert, obwohl es dort mit Ctrl+Klick auch eine »rechte Maustaste« gibt. Aber so ziemlich jede USB-Mehrtastenmaus funktioniert problemlos am Mac, einstöpseln und sofort loslegen mit dem rumwedeln. Ich hab hier eine Logitech dran.

      Tim

      1. Hello,

        Nicht mit den Macs ausgeliefert, obwohl es dort mit Ctrl+Klick auch eine »rechte Maustaste« gibt. Aber so ziemlich jede USB-Mehrtastenmaus funktioniert problemlos am Mac, einstöpseln und sofort loslegen mit dem rumwedeln. Ich hab hier eine Logitech dran.

        Man guckt leider viel zu selten über den (PC-)Tellerrand.
        Ich würde ja gerne mal ein paar MAC-Nachhilfestunden nehmen.

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau