2012-02-01 14 views
7

Jest to prawdopodobnie zamierzone zachowanie, a przynajmniej nie problem z jQuery/js, ale chciałbym wyjaśnienia, czy jest coś, co można by mieć.Zdarzenie keypress jQuery uruchamia się wielokrotnie po naciśnięciu klawisza - ale nie na wszystkich kluczach

podjąć następujące:

$(document).bind('keypress', function(e){ 
    switch(e.keyCode) 
    { 
     case 37: 
      console.log('left cursor keydown, will fire on hold'); 
      break; 
     case 39: 
      console.log('right cursor keydown, will fire on hold'); 
      break; 
     case 80: 
      console.log('p will only fire once per press!'); 
      break; 
    } 
}); 

Można również grać na przykładzie w docs jQuery: http://api.jquery.com/keypress/

Kiedy lewy lub prawy kursor jest wciśnięty (lub wiele innych klawiszy, takich jak A,E,[, itp), zdarzenie zostanie uruchomione, a na konsoli pojawi się niezły komunikat dziennika. Wszystko dobrze & zgodnie z przeznaczeniem. Teraz jednak spróbuj przytrzymać klawisz - po krótkiej przerwie zobaczysz, że zdarzenie keydown jest uruchamiane wielokrotnie po przytrzymaniu klawisza, jednak jeśli spróbujesz uderzyć w p (lub, na przykład, j), wystrzeli tylko pewnego razu.

Testuję to przy użyciu FF 9.0.1 i Mac OSX 10.7.1 i jQuery 1.7.1.

Czy jest to zgodne z projektem, czy jest to funkcja zależna od przeglądarki, czy ma to związek z systemem operacyjnym, a nawet z samą klawiaturą? Czy ktoś ma listę kluczy, które będą powtarzać, a klucze nie?

Jeśli chodzi o przypadek użycia, tak naprawdę nie ma tak naprawdę - po prostu pojawił się, gdy wiązałem animację do naciśnięcia kursora i zacząłem widzieć dziwne zachowanie po naciśnięciu klawisza. Moim obejściem było użycie zdarzenia keyup() zamiast tego i preventDefault() na zdarzeniu keydown() dla kluczy, które były przedmiotem zainteresowania, aby zatrzymać przewijanie kursorów na ekranie. Wydaje się, że w zdarzeniu keypress keyCode zawsze jest 0 dla większości liter, co może mieć związek z tym, dlaczego myślałem, że przewodnik tylko raz wystrzelił. Po kilku dalszych testach widzę powtarzające się wpisy dziennika, jak na kursory. Jeśli zaznaczysz stronę jQuery API choć i używać demo na tym, że wykazuje zachowanie I opisywał: http://api.jquery.com/keypress/

nadal nie można wyjaśnić, że ja:/

+0

Wszystkie klawisze powtórzyć. Musisz dodać 'break''s na końcu każdego przełącznika, chyba że celowo je pominąłeś. Albo twoja klawiatura źle działa, albo twój kod potrzebuje po prostu 'break'ów. –

+0

Nie dla mnie - "p" powtarza się dobrze. Myślę, że jest to funkcja sprzętu/oprogramowania układowego twojej klawiatury. – Pointy

+0

@BrianGraham zauważyłem to, dziękuję :) po przetestowaniu tego ponownie na jsfiddle widzę powtórzenie na wszystkich klawiszach też - jednak key key attr jest 0 na większości klawiszy dla zdarzenia keypress, co tłumaczyłoby niektóre dziwne zachowanie I widziałem – jammypeach

Odpowiedz

5

Zachowanie waha się między przeglądarkami i systemami operacyjnymi. Poniższa strona obejmuje tematykę auto powtarzane najważniejszych wydarzeń w szczegółowo w rozdziale 2.2:

http://unixpapa.com/js/key.html

+0

świetnie - to doskonale tłumaczy, dziękuję. – jammypeach

1

Ten problem jest już od wieków, ale myślę, że odkryli poprawkę właśnie teraz. To wydaje się działać dobrze

$("#search_query").keyup(function(event) { 

    //this will void fake keypresses 
    if(event.charCode == 0 && event.keyCode == 0) { 
     return false; 
    } 

    //place the rest of you code here 
}); 
+0

Jego lody są gładkie ... wspaniałe !!! –

Powiązane problemy