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?


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


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();
            }
        }
    });

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();
});

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 );  
 } );
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.