Symuluj naciśnięcie klawiszy za pomocą jQuery

79

Korzystając z jQuery, w jaki sposób mogę zasymulować (wyzwolić?) KeyPress po kliknięciu łącza? Na przykład, gdy użytkownik kliknie poniższy link:

<a id="clickforspace" href="#">Click Here</a>

Następnie kliknięcie odsyłacza sprawi, że użytkownik naciśnie „spację” na klawiaturze.

Coś takiego, zakładam:

$("#clickforspace").click(function(e) { 
    e.preventDefault(); 
    //... Some type of code here to initiate "spacebar" //
                                      });

Jakieś pomysły, jak to osiągnąć?

Dodinas
źródło
2
To może odpowiedzieć na twoje pytanie.
themis
Jestem ciekawy - czy podczas próby zastąpienia clickspacją faktycznie chciałeś, aby przeglądarka przewijała się w dół strony? Naciśnięcie spacji na łączu ma zwykle taki sam efekt, jak naciśnięcie klawisza Strona w dół.
Joel Purra

Odpowiedzi:

15

Zdarzenie keypress z jQuery jest przeznaczone do tego rodzaju pracy. Możesz wyzwolić zdarzenie, przekazując ciąg „keypress” do .trigger (). Jednak aby być bardziej szczegółowym, możesz w rzeczywistości przekazać obiekt jQuery.Event (określ typ jako „keypress”) i podać dowolne żądane właściwości, takie jak kod klucza będący spacją.

http://docs.jquery.com/Events/trigger#eventdata

Przeczytaj powyższą dokumentację, aby uzyskać więcej informacji.

Dmitriy Likhten
źródło
54
Jasne, przeczytaj dokumentację, ale plakat prawdopodobnie już o tym wiedział. Dokumentacja zdarzeń jQuery jest nieco nieprzejrzysta. Andrew Culver udzielił bezpośredniej odpowiedzi, a także podał odniesienie, aby uzyskać więcej informacji.
Roy Leban
142

Myślę, że właśnie tego szukasz:

var press = jQuery.Event("keypress");
press.ctrlKey = false;
press.which = 40;
$("whatever").trigger(press);

Od tutaj .

Andrew Culver
źródło
17
Nie da to żadnego faktycznego tekstu, jeśli zostanie użyte na przykład z kontrolą wprowadzania.
Alex Burtsev
5
@AlexBurtsev - Masz rację, to dlatego, że wyzwala to obsługę zdarzenia tylko tak, jakby został naciśnięty określony klawisz, ale w rzeczywistości nie naciska tego klawisza, jak to się dzieje, gdy klawisz jest naciskany na klawiaturze (prawdopodobnie ze względów bezpieczeństwa)
BornToCode
6
Czy jest jakiś powód, dla którego łączysz „$” i „jQuery”?
Danny Andrews
4
To, co napisałeś, nie działa dla mnie w jQuery 2.2.3 na Chrome. :( Ale tak się stało:$("whatever").trigger($.Event("keydown", {keyCode: 40}))
Jonathan Benn
1
Opierając się na metodzie Jonathana Benna, możesz również użyć tej samej techniki do wysłania klucza zamiast wysyłania kodu (ponieważ kody są oznaczone jako przestarzałe). Na przykład: $ ("cokolwiek"). Trigger ($. Event ("keyup", {key: "Enter"})) - i opcjonalnie, jak pokazano, z różnymi zdarzeniami z klawiatury.
Alan M.
40

Inna opcja:

$(el).trigger({type: 'keypress', which: 13, keyCode: 13});

http://api.jquery.com/trigger/

Denisa Iwanowa
źródło
1
Nie jestem pewien, do czego whichsłuży. Tylko keyCodedziała dla mnie w SAPUI5 (jQuery 2.2.3 na Chrome)
Jonathan Benn
12

Możesz wypróbować tę wtyczkę SendKeys jQuery:

http://bililite.com/blog/2011/01/23/improved-sendkeys/

$(element).sendkeys(string)wstawia ciąg w punkcie wstawiania w danych wejściowych, obszarze tekstowym lub innym elemencie z contenteditable = true. Jeśli punkt wstawiania nie znajduje się obecnie w elemencie, zapamiętuje, gdzie znajdował się punkt wstawiania, gdy ostatnio wywołano sendkeys (jeśli punkt wstawiania nigdy nie znajdował się w elemencie, jest dołączany do końca).

Robert Harvey
źródło
Nie potrzebujesz jQuery, aby tego używać, możesz użyć tej samej funkcjonalności, po prostu pobierając bililiteRangebibliotekę: github.com/dwachss/bililiteRange (w rzeczywistości wtyczka jQuery to tylko cienkie opakowanie wokół tej niesamowitej biblioteki, która stoi samodzielnie ).
fiatjaf
5

To działa:

var event = jQuery.Event('keypress');
event.which = 13; 
event.keyCode = 13; //keycode to trigger this for simulating enter
jQuery(this).trigger(event); 
Anoop PS
źródło
1
[var event = jQuery.Event ('keypress'); event.which = 13; event.keyCode = 13; jQuery (this) .trigger (zdarzenie);] spróbuj tego
Anoop PS
Musiałem kliknąć Enter w oknie, więc z fragmentem tu wymieniłem to z #myEl .. dzięki
Gene Bo