Czy istnieje sposób na wykrycie, czy przycisk myszy w JavaScript jest obecnie wyłączony?
Wiem o zdarzeniu „mousedown”, ale nie tego potrzebuję. Jakiś czas PO naciśnięciu przycisku myszy chcę móc wykryć, czy nadal jest wciśnięty.
czy to możliwe?
Czy istnieje sposób na wykrycie, czy przycisk myszy w JavaScript jest obecnie wyłączony?
Wiem o zdarzeniu „mousedown”, ale nie tego potrzebuję. Jakiś czas PO naciśnięciu przycisku myszy chcę móc wykryć, czy nadal jest wciśnięty.
czy to możliwe?
Odpowiedzi:
Odnośnie rozwiązania Pax: nie działa, jeśli użytkownik celowo lub przypadkowo kliknie więcej niż jeden przycisk. Nie pytaj mnie, skąd wiem :-(.
Prawidłowy kod powinien wyglądać tak:
Z takim testem:
Jeśli chcesz wiedzieć, który przycisk jest wciśnięty, przygotuj się na zrobienie mouseDown tablicę liczników i policz je osobno dla oddzielnych przycisków:
Teraz możesz sprawdzić, jakie dokładnie przyciski zostały wciśnięte:
Teraz ostrzegamy, że powyższy kod będzie działał tylko w przeglądarkach zgodnych ze standardami, które przekazują ci numer przycisku zaczynający się od 0 i wyżej. IE używa maski bitowej aktualnie wciśniętych przycisków:
Więc odpowiednio dostosuj swój kod! Zostawiam to jako ćwiczenie.
I pamiętaj: IE używa globalnego obiektu zdarzenia o nazwie… „zdarzenie”.
Nawiasem mówiąc, IE ma funkcję przydatną w twoim przypadku: kiedy inne przeglądarki wysyłają „przycisk” tylko dla zdarzeń związanych z przyciskiem myszy (onclick, onmousedown i onmouseup), IE wysyła go również z onmousemove. Możesz więc zacząć nasłuchiwać onmousemove, gdy potrzebujesz znać stan przycisku, i sprawdzać, czy występuje evt.button, gdy tylko go otrzymasz - teraz wiesz, jakie przyciski myszy zostały naciśnięte:
Oczywiście nic nie dostaniesz, jeśli udaje martwą i się nie rusza.
Odpowiednie linki:
Aktualizacja nr 1 : Nie wiem, dlaczego przeniosłem kod w stylu document.body. Lepiej będzie dołączyć programy obsługi zdarzeń bezpośrednio do dokumentu.
źródło
event.buttons
dowolny wyzwalacz zdarzenia, którego używasz, bez zewnętrznych zapisanych zmiennych. Zadałem zupełnie nowe pytanie (ponieważ moje zdarzenie mouseup nie zawsze się uruchamia, więc to rozwiązanie nie działa dla mnie) i otrzymałem tę odpowiedź w ciągu może 5 minut.To jest stare pytanie, a odpowiedzi tutaj wydają się być zwolennikami używania
mousedown
imouseup
śledzenia, czy przycisk jest wciśnięty. Ale jak zauważyli inni,mouseup
będzie uruchamiany tylko wtedy, gdy jest wykonywany w przeglądarce, co może prowadzić do utraty śledzenia stanu przycisku.Jednak MouseEvent (teraz) wskazuje, które przyciski są aktualnie wciśnięte:
MouseEvent.buttons
MouseEvent.which
(buttons
będzie niezdefiniowane dla Safari) Uwaga:which
używa innych liczb niżbuttons
dla kliknięć prawym i środkowym.Gdy zarejestrowana w dniu
document
,mousemove
natychmiast zwolnić, gdy tylko kursor ponownie przechodzi przeglądarkę, więc jeśli użytkownik zwalnia poza to państwo będzie aktualizowany jak tylko mysz z powrotem do środka.Prosta implementacja może wyglądać następująco:
Jeśli wymagane są bardziej skomplikowane scenariusze (różne przyciski / wiele przycisków / klawisze kontrolne), zapoznaj się z dokumentacją MouseEvent. Kiedy / jeśli Safari podniesie swoją grę, powinno to być łatwiejsze.
źródło
e.buttons
zostaną zarówno podstawowe, jak i dodatkowe, będzie1+2=3
, więce.buttons === 1
będzie fałszywe). Jeśli chcesz sprawdzić, czy podstawowy przycisk jest w dół, ale nie dbają o innych stanów przycisku, to zrobić:(e.buttons & 1) === 1
MouseEvent.buttons
, wydaje się, że7
oznacza to, że myśli, że przyciski Primary, Secondary i Auxilary są wciśnięte razem. Nie jestem pewien, dlaczego tak się dzieje - czy używasz zaawansowanej myszy? Jeśli tak, to może warto spróbować z podstawowym. Jeśli potrzebujesz tylko uruchomić, możesz użyć bitowego sprawdzenia, aby upewnić się, że lewy przycisk jest naciśnięty i zignorować inne. na przykład.MouseEvent.buttons & 1 === 1
.Myślę, że najlepszym podejściem jest zachowanie własnego zapisu stanu przycisku myszy w następujący sposób:
a później w kodzie:
źródło
rozwiązanie nie jest dobre. można by przesunąć kursor myszy na dokument, a następnie przesunąć mysz poza przeglądarkę, aw tym przypadku przeglądarka nadal myślałaby, że mysz nie działa.
jedynym dobrym rozwiązaniem jest użycie obiektu IE.event.
źródło
Wiem, że to stary post, ale pomyślałem, że śledzenie przycisku myszy za pomocą myszy w górę / w dół wydawało się nieco niezgrabne, więc znalazłem alternatywę, która może spodobać się niektórym.
Selektor: active radzi sobie z kliknięciem myszy znacznie lepiej niż myszką w górę / w dół, potrzebujesz tylko sposobu na odczytanie tego stanu w zdarzeniu onmousemove. W tym celu musiałem oszukiwać i polegać na fakcie, że domyślny kursor to „auto” i po prostu zmieniam go na „domyślny”, czyli to, co domyślnie wybiera automatycznie.
Możesz użyć w obiekcie wszystkiego, co jest zwracane przez getComputedStyle, czego możesz użyć jako flagi bez zmiany wyglądu strony, np. Border-color.
Chciałbym ustawić własny styl zdefiniowany przez użytkownika w sekcji: active, ale nie mogłem tego zmusić. Byłoby lepiej, gdyby to było możliwe.
źródło
Poniższy fragment kodu spróbuje wykonać funkcję „doStuff” 2 sekundy po wystąpieniu zdarzenia mouseDown w pliku document.body. Jeśli użytkownik podniesie przycisk, nastąpi zdarzenie mouseUp i anuluje opóźnione wykonanie.
Radziłbym użyć jakiejś metody dołączania zdarzeń w różnych przeglądarkach - jawne ustawienie właściwości myszy i myszy zostało zrobione w celu uproszczenia przykładu.
źródło
Krótkie i słodkie
Nie jestem pewien, dlaczego żadna z poprzednich odpowiedzi nie zadziałała, ale wpadłem na to rozwiązanie w chwili eureki. Nie tylko działa, ale jest też najbardziej elegancki:
Dodaj do tagu ciała:
Następnie przetestuj i wykonaj,
myfunction()
jeślidown
równa się1
:źródło
Możesz połączyć @Pax i moje odpowiedzi, aby uzyskać również czas, przez jaki mysz była wyłączona:
Później:
źródło
Musisz obsłużyć MouseDown i MouseUp i ustawić jakąś flagę lub coś, aby śledzić to "później w drodze" ... :(
źródło
Jeśli pracujesz na złożonej stronie z istniejącymi programami obsługi zdarzeń myszy, polecam obsługę zdarzenia podczas przechwytywania (zamiast bąbelków). Aby to zrobić, wystarczy ustawić trzeci parametr
addEventListener
natrue
.Ponadto możesz chcieć sprawdzić,
event.which
czy obsługujesz rzeczywistą interakcję użytkownika, a nie zdarzenia myszy, npelem.dispatchEvent(new Event('mousedown'))
.Dodaj moduł obsługi do dokumentu (lub okna) zamiast do document. Body jest ważne b / c zapewnia, że zdarzenia myszy poza oknem są nadal rejestrowane.
źródło
Używając interfejsu API MouseEvent , aby sprawdzić wciśnięty przycisk, jeśli jest dostępny:
Zwrot :
źródło
Korzystając z jQuery, poniższe rozwiązanie obsługuje nawet „przeciągnij stronę, a następnie zwolnij”.
Nie wiem, jak obsługuje wiele przycisków myszy. Gdyby istniał sposób na rozpoczęcie klikania poza oknem, a następnie przeniesienie myszy do okna, prawdopodobnie również tam nie działałoby to poprawnie.
źródło
Poniżej przykładu jQuery, kiedy mysz znajduje się nad $ ('. Element'), kolor zmienia się w zależności od tego, który przycisk myszy jest wciśnięty.
źródło
Jak powiedział @Jack, kiedy
mouseup
dzieje się poza oknem przeglądarki, nie jesteśmy tego świadomi ...Ten kod (prawie) działał dla mnie:
Niestety nie dostanę
mouseup
zdarzenia w jednym z tych przypadków:źródło
Cóż, nie możesz sprawdzić, czy jest wyłączony po wydarzeniu, ale możesz sprawdzić, czy jest włączony… Jeśli jest włączony… oznacza to, że już nie działa: P lol
Tak więc użytkownik naciska przycisk w dół (zdarzenie onMouseDown) ... a następnie sprawdzasz, czy jest włączony (onMouseUp). Chociaż nie jest to możliwe, możesz zrobić to, czego potrzebujesz.
źródło
ta wersja dla różnych przeglądarek działa dobrze dla mnie.
źródło