Gibt es eine Möglichkeit zu erkennen, ob eine Maustaste derzeit in JavaScript gedrückt ist?
Ich weiß über das "Mousedown" -Ereignis Bescheid, aber das brauche ich nicht. Einige Zeit nach dem Drücken der Maustaste möchte ich feststellen können, ob sie noch gedrückt ist.
Ist das möglich?
Antworten:
In Bezug auf die Lösung von Pax: Es funktioniert nicht, wenn der Benutzer absichtlich oder versehentlich auf mehr als eine Schaltfläche klickt. Frag mich nicht, woher ich das weiß :-(.
Der richtige Code sollte so lauten:
Mit dem Test wie folgt:
Wenn Sie wissen möchten, welche Taste gedrückt wird, müssen Sie mouseDown zu einer Reihe von Zählern machen und diese separat für separate Tasten zählen:
Jetzt können Sie überprüfen, welche Tasten genau gedrückt wurden:
Seien Sie jetzt gewarnt, dass der obige Code nur für standardkonforme Browser funktioniert, die Ihnen eine Schaltflächennummer ab 0 übergeben. IE verwendet eine Bitmaske der aktuell gedrückten Tasten:
Passen Sie also Ihren Code entsprechend an! Ich lasse es als Übung.
Und denken Sie daran: IE verwendet ein globales Ereignisobjekt mit dem Namen ... "Ereignis".
Übrigens hat der IE eine in Ihrem Fall nützliche Funktion: Wenn andere Browser "Schaltfläche" nur für Maustastenereignisse (onclick, onmousedown und onmouseup) senden, sendet der IE diese auch mit onmousemove. Sie können also auf onmousemove warten, wenn Sie den Tastenstatus kennen müssen, und nach evt.button suchen, sobald Sie ihn erhalten haben - jetzt wissen Sie, welche Maustasten gedrückt wurden:
Natürlich bekommst du nichts, wenn sie tot spielt und sich nicht bewegt.
Relevante Links:
Update Nr. 1 : Ich weiß nicht, warum ich den document.body-Code übernommen habe. Es ist besser, Ereignishandler direkt an das Dokument anzuhängen.
quelle
event.buttons
an einen beliebigen Ereignisauslöser anschließen, den Sie verwenden, ohne externe gespeicherte Variablen. Ich habe eine brandneue Frage gestellt (weil mein Mouseup-Ereignis nicht immer ausgelöst wird und diese Lösung für mich nicht funktioniert) und diese Antwort in etwa 5 Minuten erhalten.Dies ist eine alte Frage, und die Antworten hier scheinen hauptsächlich dafür zu sprechen, zu verwenden
mousedown
undmouseup
zu verfolgen, ob eine Taste gedrückt wird. Aber wie andere bereits betont haben,mouseup
wird es nur ausgelöst, wenn es im Browser ausgeführt wird, was dazu führen kann, dass der Schaltflächenstatus aus den Augen verloren wird.Allerdings Mouseevent (jetzt) gibt an, welche Tasten sind zur Zeit gedrückt:
MouseEvent.buttons
MouseEvent.which
(buttons
wird für Safari nicht definiert). Hinweis:which
Verwendet andere Zahlen alsbuttons
für Rechts- und Mittelklicks.Wenn auf registriert
document
,mousemove
wird Feuer sofort, sobald der Cursor den Browser wieder eintritt, also wenn die Benutzer Mitteilungen außerhalb dann wird der Staat, sobald sie die Maus wieder in aktualisiert werden.Eine einfache Implementierung könnte folgendermaßen aussehen:
Wenn kompliziertere Szenarien erforderlich sind (verschiedene Schaltflächen / mehrere Schaltflächen / Steuertasten), lesen Sie die MouseEvent-Dokumente. Wenn Safari sein Spiel aufhebt, sollte dies einfacher werden.
quelle
e.buttons
wird1+2=3
, soe.buttons === 1
wird falsch sein). Wenn Sie überprüfen möchten, ob die primäre Schaltfläche gedrückt ist, sich aber nicht um andere Schaltflächenzustände kümmern, gehen Sie folgendermaßen vor:(e.buttons & 1) === 1
MouseEvent.buttons
, scheint dies zu7
bedeuten, dass die primären, sekundären und zusätzlichen Schaltflächen zusammen gedrückt werden. Ich bin mir nicht sicher, warum dies der Fall sein sollte - verwenden Sie eine erweiterte Maus? Wenn ja, lohnt es sich vielleicht, es mit einem einfachen zu versuchen. Wenn Sie es nur zum Laufen bringen müssen, können Sie eine bitweise Überprüfung verwenden, um sicherzustellen, dass die linke Taste gedrückt wird, und andere ignorieren. z.B.MouseEvent.buttons & 1 === 1
.Ich denke, der beste Ansatz besteht darin, den Status der Maustaste wie folgt selbst aufzuzeichnen:
und dann später in Ihrem Code:
quelle
Die Lösung ist nicht gut. Man könnte das Dokument "mousedown" und dann außerhalb des Browsers "mouseup", und in diesem Fall würde der Browser immer noch denken, dass die Maus unten ist.
Die einzig gute Lösung ist die Verwendung des IE.event-Objekts.
quelle
Ich weiß, dass dies ein alter Beitrag ist, aber ich dachte, dass das Verfolgen der Maustaste mit der Maus nach oben / unten etwas klobig ist, deshalb habe ich eine Alternative gefunden, die einige ansprechen könnte.
Der: active-Selektor verarbeitet den Mausklick viel besser als die Maus nach oben / unten. Sie benötigen lediglich eine Möglichkeit, diesen Status im Ereignis onmousemove zu lesen. Dafür musste ich schummeln und mich darauf verlassen, dass der Standardcursor "auto" ist und ich ändere ihn einfach auf "default", was standardmäßig automatisch ausgewählt wird.
Sie können alles in dem Objekt verwenden, das von getComputedStyle zurückgegeben wird und das Sie als Flag verwenden können, ohne das Erscheinungsbild Ihrer Seite zu beeinträchtigen, z. B. Rahmenfarbe.
Ich hätte gerne meinen eigenen benutzerdefinierten Stil im Abschnitt: active festgelegt, aber ich konnte das nicht zum Laufen bringen. Es wäre besser, wenn es möglich wäre.
quelle
Das folgende Snippet versucht 2 Sekunden nach dem Auftreten des mouseDown-Ereignisses in document.body, die Funktion "doStuff" auszuführen. Wenn der Benutzer die Schaltfläche anhebt, tritt das mouseUp-Ereignis auf und bricht die verzögerte Ausführung ab.
Ich würde empfehlen, eine Methode für das browserübergreifende Anhängen von Ereignissen zu verwenden. Um das Beispiel zu vereinfachen, wurden die Eigenschaften für Mousedown und Mouseup explizit festgelegt.
quelle
Kurz und bündig
Ich bin mir nicht sicher, warum keine der vorherigen Antworten für mich funktioniert hat, aber ich habe diese Lösung in einem Eureka-Moment gefunden. Es funktioniert nicht nur, es ist auch am elegantesten:
Zum Body-Tag hinzufügen:
Dann testen und ausführen,
myfunction()
wenndown
gleich1
:quelle
Sie können @Pax und meine Antworten kombinieren, um auch die Dauer zu ermitteln, für die die Maus gedrückt wurde:
Dann später:
quelle
Sie müssen mit MouseDown und MouseUp umgehen und ein Flag oder etwas setzen, um es "später auf der Straße" zu verfolgen ... :(
quelle
Wenn Sie auf einer komplexen Seite mit vorhandenen Maus-Ereignishandlern arbeiten, würde ich empfehlen, das Ereignis bei der Erfassung zu behandeln (anstelle von Bubble). Stellen Sie dazu einfach den 3. Parameter von
addEventListener
auftrue
.Darüber hinaus möchten Sie möglicherweise überprüfen, ob
event.which
Sie die tatsächliche Benutzerinteraktion und keine Mausereignisse verarbeiten, zelem.dispatchEvent(new Event('mousedown'))
.Fügen Sie den Handler anstelle von document.body zum Dokument (oder Fenster) hinzu. Body ist wichtig, da sichergestellt wird, dass Mouseup-Ereignisse außerhalb des Fensters weiterhin aufgezeichnet werden.
quelle
Verwenden Sie die MouseEvent- API, um die gedrückte Taste zu überprüfen, falls vorhanden:
Rückgabe :
quelle
Mit jQuery behandelt die folgende Lösung sogar das "Ziehen der Seite, dann Fall freigeben".
Ich weiß nicht, wie es mit mehreren Maustasten umgeht. Wenn es eine Möglichkeit gäbe, den Klick außerhalb des Fensters zu starten und dann die Maus in das Fenster zu bringen, würde dies dort wahrscheinlich auch nicht richtig funktionieren.
quelle
Unterhalb des jQuery-Beispiels ändert sich die Farbe, wenn sich die Maus über $ ('. Element') befindet, je nachdem, welche Maustaste gedrückt wird.
quelle
Wie gesagt @Jack, wenn
mouseup
es außerhalb des Browserfensters passiert, sind wir uns dessen nicht bewusst ...Dieser Code hat (fast) bei mir funktioniert:
Leider werde ich die
mouseup
Veranstaltung in einem dieser Fälle nicht bekommen :quelle
Nun, Sie können nicht überprüfen, ob es nach dem Ereignis nicht funktioniert, aber Sie können überprüfen, ob es aktiv ist. Wenn es aktiv ist, bedeutet dies, dass es nicht mehr deaktiviert ist: P lol
Der Benutzer drückt also die Taste nach unten (Ereignis onMouseDown) ... und danach prüfen Sie, ob es aktiv ist (onMouseUp). Während es nicht läuft, können Sie tun, was Sie brauchen.
quelle
Diese browserübergreifende Version funktioniert gut für mich.
quelle