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 );  
 } );
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.