jQuery: keyPress Backspace ateş etmiyor mu?


186

Ne yaptığımı merak ediyorum:

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

Ben istiyorum doSearch()ben vurduğunda da işlev kovulmak üzere Backspaceanahtarı. Şu anda BackspaceChrome ve Safari'ye bastığımda kesinlikle hiçbir şey olmuyor .

herhangi bir fikir?


Bu jQuery eklenti code.google.com/p/js-hotkeys 'i deneyebilir ve "geri al" tuşu takma adını kullanabilirsiniz
José Manuel Lucas

3
kromda değil Firefox'ta yanıyor.
vsync

Necroposting için özür dilerim ama e.keyCode yerine e.which tercih edildiğini belirtmek gerekir
Henry Howeson

Yanıtlar:


324

Yerine keyupkullanın keypress. Kullanıcı bir şeye bastığında tüm anahtar kodları alır


37
Neden keyupBackspace için ateş edesin keypresski?
Aaron Digulla

durum böyle. Keyup geri atar, keypress yapmaz -> tuhaf. cmd-c veya cmd-v veya cmd-a gibi iki tuşun basılı olup olmadığını da kontrol etme şansı var mı
matt

17
Aslında anahtara bağımlı. Kullanmak istediğiniz keypressiçin Enter, anahtarın keydowniçin Backspaceve benzeri; Aksi takdirde, bazı tarayıcılardaki etkinliklerin beklediğiniz gibi çalışmadığını görürsünüz, özellikle de anahtarın varsayılan davranışını önlemek istediğinizde. Yanlış olanı kullandığınızda, ya etkinliğiniz hiç yakalanmaz (Backspace için olduğu gibi) ya da önleyemezsiniz; çünkü olay işleme kodunuz buna ulaşmadan önce gerçekleşir.
srcspider

5
Bu cevap sorun kullanarak olmasıdır keyupedecektir sayı takımını kırmak . Tam bir klavyedeki herhangi bir tuşun doğru bir şekilde algılanmasına izin veren bir cevap biliyor musunuz?
Hughes

6
keydowntüm tuşlar için daha iyi bir seçenektir
artfuldev

32

Ben de kendimle karşılaştım. Bu .onyüzden biraz farklı görünüyor kullandım ama bunu yaptım:

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

Buralara İşimi ekliyorum. Ben jQuery bunu yaptım böylece kullanıcı tarafından yazılan ssn silmek gerekiyordu

  $(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
event.keyCode yerine event.which kullanırsanız firefox ile çalışır api.jquery.com/event.which
BishopZ

11

Etkinliği yalnızca giriş kullanımınızdaki değişikliklerle başlatmak istiyorsanız:

$('.s').bind('input', function(){
  console.log("search!");
  doSearch();
});

inputayrıca keyCodes'u gözlemlemez. Bu da işe yaramaz.
Mark Pieszak - Trilon.io

3

.Keypress () için jQuery belgelerine göre, yazdırılamayan karakterleri yakalamaz, bu nedenle geri tuşu tuşa basmada çalışmaz, ancak tuşa basma ve tuşa takma sırasında yakalanır:

Tuş basma olayı, tarayıcı klavye girişini kaydettiğinde bir öğeye gönderilir. Bu, Shift, Esc ve silme tetikleme tuş olaylarını silme, ancak tuş basma olayları gibi değiştirici ve baskı yapmayan tuşlar dışında keydown olayına benzer. İki olay arasındaki diğer farklılıklar platforma ve tarayıcıya bağlı olarak ortaya çıkabilir. ( https://api.jquery.com/keypress/ )

Bazı durumlarda tuşlar istenmez veya başka istenmeyen efektler vardır ve tuşlar yeterlidir, bu yüzden bunu ele almanın bir yolu keydowntüm tuş vuruşlarını yakalamak için kullanmaktır , daha sonra anahtarın girilmesi için kısa bir aralıkta bir zaman aşımı ayarlamak ve ardından işlem yapmaktır. orada sonra.

jQuery(el).keydown( function() { 
    var that = this; setTimeout( function(){ 
           /** Code that processes backspace, etc. **/ 
     }, 100 );  
 } );
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.