jQuery: keyPress Backspace не сработает?

186

Интересно, что я делаю не так

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

Я хочу, чтобы моя doSearch()функция также запускалась при Backspaceнажатии клавиши. На данный момент абсолютно ничего не происходит, когда я нажимаю Backspaceв Chrome и Safari.

Любые идеи?

матовый
источник
Вы можете попробовать этот плагин jQuery code.google.com/p/js-hotkeys и использовать псевдоним ключа «backspace»
Хосе Мануэль Лукас
3
он не работает на Chrome, но на Firefox.
vsync
Извините за некропостинг, но стоит отметить, что e.which предпочтительнее e.keyCode
Генри Хоусон,

Ответы:

324

Используйте keyupвместо keypress. Это получает все коды клавиш, когда пользователь что-то нажимает

Джонатон Болстер
источник
37
Зачем keyupстрелять по Backspace, когда keypressне будет?
Аарон Дигулла
это тот случай. Keyup запускает Backspace, нажатие клавиши не -> странно. есть ли возможность проверить, нажаты ли две клавиши, например, cmd-c, cmd-v или cmd-a
matt
17
Это на самом деле зависит от ключа. Вы хотите использовать keypressдля Enterключа, keydownдля Backspaceи так далее; в противном случае вы обнаружите, что ваши события в некоторых браузерах работают не так, как вы ожидаете, особенно если вы хотите запретить поведение ключа по умолчанию. Когда вы используете не тот, что произойдет, либо ваше событие вообще не будет записано (как в случае с Backspace), либо вы не сможете предотвратить это; поскольку это уже происходит до того, как ваш код обработки событий попадет к нему.
srcspider
5
Проблема с этим ответом, что использование keyupбудет сломать цифровую клавиатуру . Знаете ли вы ответ, который позволяет правильно определить любую клавишу на полноценной клавиатуре?
Хью
6
keydownлучший вариант для всех ключей
artfuldev
32

Я сам с этим сталкивался. Я использовал, .onтак что это выглядит немного по-другому, но я сделал это:

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

Добавление моей работы здесь. Мне нужно было удалить ssn, набранный пользователем, поэтому я сделал это в 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
это работает с firefox, если вы используете event.which вместо event.keyCode api.jquery.com/event.which
BishopZ
11

Если вы хотите инициировать событие только при изменениях ввода, используйте:

$('.s').bind('input', function(){
  console.log("search!");
  doSearch();
});
Маркос Нуньес
источник
inputтакже не соблюдает keyCodes. Это тоже не сработает.
Марк Пешак - Trilon.io
3

Согласно документации jQuery для .keypress (), он не перехватывает непечатаемые символы, поэтому backspace не будет работать при нажатии клавиш, но он попадает в keydown и keyup:

Событие нажатия клавиши отправляется элементу, когда браузер регистрирует ввод с клавиатуры. Это похоже на событие нажатия клавиш, за исключением того, что модификаторы и непечатаемые ключи, такие как Shift, Esc, и удаляют события нажатия клавиш запуска, но не события нажатия клавиш. Другие различия между этими двумя событиями могут возникать в зависимости от платформы и браузера. ( https://api.jquery.com/keypress/ )

В некоторых случаях keyup нежелателен или имеет другие нежелательные эффекты, и keydown достаточно, поэтому одним из способов справиться с этим является использование keydown нажатие клавиш нажатия клавиш для перехвата всех нажатий клавиш, затем установить тайм-аут на короткий интервал, чтобы ввести ключ, затем выполнить обработку в там после.

jQuery(el).keydown( function() { 
    var that = this; setTimeout( function(){ 
           /** Code that processes backspace, etc. **/ 
     }, 100 );  
 } );
зимородок
источник