jQuery: keyPress Backspace nie chce się uruchomić?

186

Zastanawiam się, co robię źle:

$(".s").keypress(function(e) {
   switch (e.keyCode) {
      case 8: // Backspace
      //console.log('backspace');
      case 9: // Tab
      case 13: // Enter
      case 37: // Left
      case 38: // Up
      case 39: // Right
      case 40: // Down
         break;

      default:
         doSearch();
   }
});

Chcę, aby moja doSearch()funkcja była również uruchamiana po Backspacenaciśnięciu klawisza. W tej chwili absolutnie nic się nie dzieje, gdy naciskam Backspacew Chrome i Safari.

jakieś pomysły?

matowy
źródło
Możesz wypróbować tę wtyczkę jQuery code.google.com/p/js-hotkeys i użyć aliasu klucza „backspace”
José Manuel Lucas
3
nie działa na Chrome, ale na Firefox.
vsync
Przepraszam za nekropostę, ale warto zauważyć, że e. Który jest preferowany w porównaniu z e.keyCode
Henry Howeson

Odpowiedzi:

324

Użyj keyupzamiast keypress. Otrzymuje wszystkie kody kluczy, gdy użytkownik coś naciśnie

Jonathon Bolster
źródło
37
Po co keyupstrzelać do Backspace, skoro keypressnie?
Aaron Digulla
tak jest. Klawisz odpala backspace, naciśnięcie klawisza nie -> dziwne. czy jest także szansa na sprawdzenie, czy naciśnięto dwa klawisze, takie jak cmd-c, cmd-v lub cmd-a
mat.
17
To zależy od klucza. Chcesz używać keypressdo Enterklucza, keydowndo Backspacei tak dalej; w przeciwnym razie znajdziesz zdarzenia w niektórych przeglądarkach, które tak naprawdę nie działają zgodnie z oczekiwaniami, zwłaszcza gdy chcesz zapobiec domyślnemu zachowaniu klucza. Kiedy użyjesz niewłaściwego, wydarzy się, że albo twoje wydarzenie nie zostanie w ogóle zarejestrowane (jak w przypadku Backspace), albo nie możesz temu zapobiec; ponieważ dzieje się to już zanim kod obsługi zdarzeń do niego dotrze.
srcspider
5
Problem z tą odpowiedzią polega na tym, że użycie keyupspowoduje uszkodzenie klawiatury numerycznej . Czy znasz odpowiedź, która pozwala poprawnie wykryć dowolny klawisz na pełnej klawiaturze?
przytula
6
keydownjest lepszą opcją dla wszystkich kluczy
artfuldev
32

Sam to spotkałem. Użyłem, .onwięc wygląda trochę inaczej, ale zrobiłem to:

 $('#element').on('keypress', function() {
   //code to be executed
 }).on('keydown', function(e) {
   if (e.keyCode==8)
     $('element').trigger('keypress');
 });

Dodanie mojej pracy tutaj. Musiałem usunąć ssn wpisany przez użytkownika, więc zrobiłem to w jQuery

  $(this).bind("keydown", function (event) {
        // Allow: backspace, delete
        if (event.keyCode == 46 || event.keyCode == 8) 
        {
            var tempField = $(this).attr('name');
            var hiddenID = tempField.substr(tempField.indexOf('_') + 1);
            $('#' + hiddenID).val('');
            $(this).val('')
            return;
        }  // Allow: tab, escape, and enter
        else if (event.keyCode == 9 || event.keyCode == 27 || event.keyCode == 13 ||
        // Allow: Ctrl+A
        (event.keyCode == 65 && event.ctrlKey === true) ||
        // Allow: home, end, left, right
        (event.keyCode >= 35 && event.keyCode <= 39)) {
            // let it happen, don't do anything
            return;
        }
        else 
        {
            // Ensure that it is a number and stop the keypress
            if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) &&       (event.keyCode < 96 || event.keyCode > 105)) 
            {
                event.preventDefault();
            }
        }
    });
Obrabować
źródło
1
działa to z firefox, jeśli używasz event.which zamiast event.keyCode api.jquery.com/event.which
BishopZ
11

Jeśli chcesz uruchomić zdarzenie tylko po zmianie danych wejściowych, użyj:

$('.s').bind('input', function(){
  console.log("search!");
  doSearch();
});
Marcos Nunes
źródło
inputrównież nie przestrzega kodów kluczowych. To też by nie działało.
Mark Pieszak - Trilon.io
3

Zgodnie z dokumentacją jQuery dla .keypress (), nie przechwytuje ona znaków, które nie mogą być wydrukowane, więc backspace nie będzie działał po naciśnięciu klawisza, ale zostanie przechwycony podczas keydown i keyup:

Zdarzenie naciśnięcia klawisza jest wysyłane do elementu, gdy przeglądarka rejestruje dane z klawiatury. Jest to podobne do zdarzenia keydown, z tym wyjątkiem, że modyfikator i klawisze niedrukowalne, takie jak Shift, Esc i kasuj zdarzenia keydown, ale nie zdarzenia keypress. Inne różnice między tymi dwoma zdarzeniami mogą pojawić się w zależności od platformy i przeglądarki. ( https://api.jquery.com/keypress/ )

W niektórych przypadkach keyup nie jest pożądany lub ma inne niepożądane efekty, a keydown jest wystarczający, więc jednym ze sposobów radzenia sobie z tym jest użycie keydown złapanie wszystkich naciśnięć klawiszy, a następnie ustawienie limitu czasu na krótki czas, aby wprowadzić klucz, a następnie przetworzyć odtąd.

jQuery(el).keydown( function() { 
    var that = this; setTimeout( function(){ 
           /** Code that processes backspace, etc. **/ 
     }, 100 );  
 } );
Zimorodek
źródło