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
він не займається хромом, але працює на Firefox.
vsync

Вибачте за некропостинг, але варто зауважити, що, наприклад, перевагу над e.keyCode
Генрі Хоусон

Відповіді:


324

Використовуйте keyupзамість keypress. Це отримує всі ключові коди, коли користувач щось натискає


37
Чому б keyupзапустити Backspace, коли keypressне буде?
Аарон Дігулла

це справа. Клавіатура спрацьовує назад, клавіша не -> дивно. чи є можливість також перевірити, чи натиснуті дві клавіші, як 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


3

Відповідно до документації jQuery для .keypress (), вона не вловлює символи, що не друкуються, тому зворотний простір не працюватиме на натискання клавіш, але він потрапляє в клавіші та клавіші:

Подія натискання клавіші надсилається елементу, коли браузер реєструє введення з клавіатури. Це подібно до події клавіші, за винятком того, що модифікатор та недрукувальні клавіші, такі як Shift, Esc та видаляють події клавіш тригера, але не події натискання клавіші. Інші відмінності між двома подіями можуть виникнути залежно від платформи та браузера. ( https://api.jquery.com/keypress/ )

У деяких випадках клавіатура не бажана або має інші небажані ефекти, і натискання клавіш достатньо, тому один спосіб впоратися з цим - використовувати 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.