Czy można JavaScript symulować kluczowe zdarzenia naciśnięcia klawisza?
javascript
dom-events
dębnik
źródło
źródło
Odpowiedzi:
Wersja nie-jquery, która działa zarówno w pakiecie webkit, jak i gecko:
źródło
keyCode
wynosi zawsze 0 i nie mogę go zmienić.event.which
zawsze tak jest0
podczas używaniadocument.createEvent("KeyboardEvent")
. @lluft udostępnił szczegóły i obejście, które dla mnie zadziałało, w tym komentarzu do innego wątku. Zasadniczo musisz użyć,document.createEvent('Event')
aby utworzyć ogólne zdarzenie, a następnie ustawić typkeydown
i nadaćkeyCode
właściwość równą kodowi znaków klucza.Jeśli możesz używać jQuery 1.3.1:
źródło
trigger
nie można go użyć do naśladowania natywnych zdarzeń przeglądarki .To, co możesz zrobić, to programowo uruchomić kluczowe odbiorniki , uruchamiając kluczowe zdarzenia . Sensowne jest zezwolenie na to z piaskownicy z perspektywy bezpieczeństwa. Korzystając z tej umiejętności, możesz następnie zastosować typowy wzorzec obserwatora . Możesz nazwać tę metodę „symulacją”.
Poniżej znajduje się przykład, jak to osiągnąć w standardzie DOM W3C wraz z jQuery:
Ten przykład został zaadaptowany z: https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events
W jQuery:
Ale od niedawna nie ma sposobu [DOM], aby faktycznie uruchomić kluczowe zdarzenia opuszczające piaskownicę przeglądarki. Wszyscy główni dostawcy przeglądarek będą przestrzegać tej koncepcji bezpieczeństwa.
Jeśli chodzi o wtyczki, takie jak Adobe Flash - które są oparte na NPAPI - i pozwalają na ominięcie piaskownicy: są one wycofywane ; Firefox .
Szczegółowe wyjaśnienie:
Nie możesz i nie możesz ze względów bezpieczeństwa (jak już wskazał Pekka). Zawsze będzie wymagana interakcja użytkownika pomiędzy. Dodatkowo wyobraź sobie, że producenci przeglądarek mogą zostać pozwani przez użytkowników, ponieważ różne programowe zdarzenia na klawiaturze doprowadzą do ataków fałszujących.
Zobacz ten post, aby znaleźć alternatywy i więcej szczegółów. Zawsze istnieje funkcja flashowania i kopiowania. Oto elegancki przykład . Jednocześnie jest to świadectwo, dlaczego sieć odchodzi od dostawców wtyczek.
Podobne podejście do bezpieczeństwa stosuje się w przypadku akceptowalnej zasady CORS w celu programowego dostępu do zdalnej treści.
Odpowiedź brzmi:
w normalnych okolicznościach nie ma możliwości programowego uruchomienia klawiszy wejściowych w środowisku przeglądarki w trybie piaskownicy .
Konkluzja: Nie mówię, że nie będzie to możliwe w przyszłości, przy specjalnych trybach przeglądarki i / lub przywilejach do końcowego celu gry lub podobnych doświadczeń użytkownika. Jednak przed wejściem w takie tryby użytkownik zostanie zapytany o uprawnienia i ryzyko, podobne do modelu pełnoekranowego interfejsu API .
Przydatne: w kontekście KeyCodes to narzędzie i mapowanie kodu klucza przyda się.
Ujawnienie: Odpowiedź opiera się na odpowiedzi tutaj .
źródło
Możesz wywoływać zdarzenia klawiatury dla takiego elementu
źródło
keypress
jest amortyzowana, używająckeydown
zamiast tego -> developer.mozilla.org/en-US/docs/Web/Events/keypressMożesz użyć
dispatchEvent()
:Nie testowałem tego, ale jest on dostosowany z kodu w dokumentacji dispatchEvent () . Prawdopodobnie będziesz chciał to przeczytać, a także dokumenty dla createEvent () i initKeyEvent ().
źródło
initKeyEvent
czyinitKeyboardEvent()
. Oba są przestarzałe na korzyść konstruktora KeyboardEvent () .Możesz tworzyć i wywoływać zdarzenia klawiatury, a one wyzwalają odpowiednie zarejestrowane procedury obsługi zdarzeń, jednak nie generują żadnego tekstu , jeśli zostaną wysłane na przykład do elementu wejściowego.
Aby w pełni zasymulować wprowadzanie tekstu, musisz utworzyć sekwencję zdarzeń na klawiaturze oraz jawnie ustawić tekst elementu wejściowego. Kolejność zdarzeń zależy od tego, jak dokładnie chcesz symulować wprowadzanie tekstu.
Najprostsza forma to:
źródło
W niektórych przypadkach
keypress
zdarzenie nie może zapewnić wymaganej funkcjonalności. Z dokumentów Mozilli możemy zobaczyć, że ta funkcja jest przestarzała:Tak więc, ponieważ
keypress
zdarzenie jest łączone z dwóch konsekwentnie odpalanych zdarzeńkeydown
i następujących po nimkeyup
dla tego samego klucza, wystarczy wygenerować zdarzenia jeden po drugim:źródło
Opierając się na odpowiedzi z alex2k8, oto poprawiona wersja, która działa we wszystkich przeglądarkach obsługiwanych przez jQuery (problemem były brakujące argumenty do jQuery.event.trigger, których łatwo zapomnieć, gdy używasz tej funkcji wewnętrznej).
Możesz nawet popchnąć to dalej i pozwolić nie tylko symulować zdarzenie, ale faktycznie wstawić znak (jeśli jest to element wejściowy), jednak istnieje wiele gotcha w różnych przeglądarkach, gdy próbujesz to zrobić. Lepiej użyj bardziej rozbudowanej wtyczki, takiej jak SendKeys .
źródło
Zainteresowanym możesz w rzeczywistości niezawodnie odtwarzać zdarzenia z klawiatury. Aby zmienić tekst w polu wprowadzania (przesuń kursory lub stronę za pomocą znaku wejściowego), musisz ściśle przestrzegać modelu zdarzeń DOM: http://www.w3.org/TR/DOM-Level-3-Events/ # h4_events-inputevents
Model powinien wykonać:
Następnie dla każdej postaci:
Następnie opcjonalnie dla większości:
To faktycznie zmienia tekst na stronie za pomocą javascript (bez modyfikowania instrukcji wartości) i odpowiednio uruchamia wszelkie detektory / procedury obsługi javascript. Jeśli zepsujesz sekwencję, javascript nie uruchomi się w odpowiedniej kolejności, tekst w polu wejściowym nie zmieni się, zaznaczenia się nie zmienią lub kursor nie przejdzie do następnej spacji w obszarze tekstowym.
Niestety kod został napisany dla pracodawcy w ramach NDA, więc nie mogę go udostępnić, ale jest to zdecydowanie możliwe, ale musisz odtworzyć cały „stos” wejściowego klucza dla każdego elementu we właściwej kolejności.
źródło
Od 2019 r. To rozwiązanie działa dla mnie:
Użyłem tego w mojej przeglądarce, aby obsługiwać urządzenia mobilne z symulowaną klawiaturą.
Wyjaśnienie: ten kod
keydown
wywołuje pojedyncze zdarzenie, podczas gdy naciśnięcie prawdziwego klawisza wyzwoli jednokeydown
zdarzenie (lub kilka z nich, jeśli będzie ono dłużej przechowywane), a następnie jednokeyup
zdarzenie po zwolnieniu tego klucza. Jeśli potrzebujeszkeyup
również zdarzeń, możesz również symulowaćkeyup
zdarzenia, zmieniając"keydown"
na"keyup"
we fragmencie kodu.To również wysyła zdarzenie na całą stronę internetową, stąd
document
. Jeśli chcesz, aby zdarzenie miało tylko określony element, możesz zastąpićdocument
żądany element.źródło
Trusted
?)To podejście obsługuje przeglądarkę zmieniającą wartość kodu klucza . Źródło
źródło
wystarczy użyć CustomEvent
4 ex chce symulować ctrl + z
źródło
Oto biblioteka, która naprawdę pomaga: https://cdn.rawgit.com/ccampbell/mousetrap/2e5c2a8adbe80a89050aaf4e02c45f02f1cc12d4/tests/libs/key-event.js
Nie wiem skąd to się wzięło, ale jest pomocne. Dodaje
.simulate()
do sposobuwindow.KeyEvent
, aby go użyć po prostu zKeyEvent.simulate(0, 13)
za symulowanieenter
lubKeyEvent.simulate(81, 81)
dla'Q'
.Mam go na https://github.com/ccampbell/mousetrap/tree/master/tests .
źródło
To działało dla mnie i symuluje keyup dla mojej textaera. jeśli chcesz go dla całej strony po prostu umieścić
KeySimulation()
na<body>
tak<body onmousemove="KeySimulation()">
lub jeśli nieonmousemove
wtedyonmouseover
alboonload
też działa.źródło
initKeyboardEvent
jest przestarzałe. ( Źródło )Jeden raz był wierszowany ze względu na łatwe użycie w kontekście konsoli. Ale prawdopodobnie nadal przydatne.
źródło
Oto rozwiązanie, które działa w Chrome i Chromium (przetestowałem tylko te platformy). Wygląda na to, że Chrome ma pewne błędy lub własne podejście do obsługi kodów kluczy, więc tę właściwość należy dodać osobno do KeyboardEvent.
źródło
Oto, co udało mi się znaleźć:
źródło
Natywny JavaScript z rozwiązaniem obsługiwanym przez TypeScript:
Wpisz keyCode lub dowolną właściwość, której używasz, i przekaż ją do KeyboardEventInit
Przykład
źródło
Właśnie tego próbowałem z js / maszynopisem w chrome. Dzięki tej odpowiedzi za inspirację.
źródło
jak tylko użytkownik naciśnie klawisz, możesz zapisać odwołanie nawet do tego i użyć go w dowolnym innym elemencie HTML:
możesz ustawić keyCode, jeśli utworzysz własne zdarzenie, możesz skopiować istniejące parametry z dowolnego rzeczywistego zdarzenia na klawiaturze (ignorując cele, ponieważ jest to zadanie dispatchEvent) i:
źródło
Wiem, że pytanie wymaga javascriptowego sposobu symulowania naciśnięcia klawisza. Ale dla tych, którzy szukają jQuery sposobu robienia rzeczy:
źródło
Krytyczną częścią tego, jak to działa, jest uświadomienie sobie tego
charCode
,keyCode
i wszystkiewhich
są przestarzałymi metodami . Dlatego jeśli kod przetwarzający zdarzenie naciśnięcia klawisza używa któregokolwiek z tych trzech, wówczas otrzyma fałszywą odpowiedź (np. Domyślnie 0).Tak długo, jak uzyskujesz dostęp do zdarzenia naciśnięcia klawisza nieaktualną metodą, na przykład
key
powinieneś być w porządku.Na zakończenie dodałem podstawowy kod JavaScript do wywołania zdarzenia:
źródło
Chciałem zasymulować naciśnięcie klawisza „Tab” ... Rozwijając odpowiedź Trevora, widzimy, że naciskany jest specjalny klawisz, taki jak „Tab”, ale nie widzimy rzeczywistego wyniku, jaki miałby klawisz „Tab”. .
próbowano wywołać te zdarzenia dla „activeElement” oraz globalnego obiektu dokumentu zarówno - kod dla obu dodany poniżej;
fragment poniżej:
źródło