2013-01-22 16 views
6

Czy istnieje skrót (właściwie funkcja) w jQuery lub JavaScript, żeby obsłużyć przycisk nacisnąć wyjątkiem coś lub tylko coś, npJquery przyciśnięcie wyjątkiem: {coś}

$(input).keypress('nonfunctional' function(){ 
    // do something 
}); 

która wyzwoli tylko na przyciskach [az] [0-9] naciśniętych i ignorujących pojedyncze shift lub ctrl, ale obsługujących shift+a => A naciśnięty?

P.S.i wiem if(key.code == 123) następnie ...

Odpowiedz

1

Istnieje wtyczka jQuery do używania klas i wyrażenie regularne do filtrowania naciśnięć klawiszy, jeśli nie chcesz pisać dużej instrukcji if, aby wykryć naciśnięty kod klawisza, nazywa się to keyfilter. Przykładem może być

$(selector).keyfilter(/[a-z]/); 
+0

Świetnie, dziękuję – ted

1

Na przykład ta funkcja poniżej zezwala tylko na liczby en obsługujące te funkcje za pomocą zdarzenia keydown.

function OnlyNumbers(event) { 
    if (event.keyCode == 46 || event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 27 || event.keyCode == 13 || (event.keyCode == 65 && event.ctrlKey === true) || (event.keyCode >= 35 && event.keyCode <= 39)) { return; } 
    else { if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) { event.preventDefault(); } } 
} 
0

czy próbowałeś event.altKey/event.shiftKey/event.ctrlKey ??

+0

Chociaż może to być dobre rozwiązanie, nie zapewnia rozwiązania tego problemu. Następnym razem bardziej odpowiednie byłoby umieszczenie tego jako komentarza, a nie odpowiedzi. – RobSiklos

2

Lub można rozszerzyć naciśnięcie klawisza JQuery. Coś takiego Chyba:

$.fn.keypressBut = function(codes, callback) { 
    $(this).keypress(function(e) { 
     ~$.inArray(e.keyCode, codes) || callback.call(this, e); 
    }); 
} 

// Lets ignore Enter and Space 
$('input').keypressBut([13, 32], function(e) { 
    alert(e.keyCode); 
}) 
2

Można zrobić coś

  1. Extend jquerys fn propertie z funkcji, która zajmuje params jak

    • Niektóre dane
    • funkcji zwrotnej
  2. napisać funkcję walidacji które

    • konwertuje keyCode do String
    • dopasować go przed wyrażeniem regularnym.
    • Jeśli shiftKey został naciśnięty
      • przekonwertować go na wielkie litery
    • sprawdzić czy innych warunkach jak klawisz Ctrl/Alt naciśnięty są spełnione.
    • Powoduje zwrócenie wyniku.
  3. Jeśli walidacja powiedzie
    • wykonać funkcję oddzwonienia

Na stronie kodu może to podoba

$.fn.selectedKey = function (cb, data) { 
     def.call(data, { 
      ctrlKey: 2, //0: musn't be pressed, 1: must be pressed, 2: both. 
      altKey: 2, // " 
      invert: 0, //inverts the filter 
      filter: /.*/, // A Regular Expression, or a String with a Regular Expression 
      preventDefault: false //Set to true to prevent Default. 
     }); //Sets the default Data for the values used, 

     function validate(e) { 
      var key = e.char = String.fromCharCode(e.keyCode || e.which); // Converts the pressed key to a String 
      if (e.shiftKey) key = key.toUpperCase(); //Handles Case Sensitivity. 
      var exp = new RegExp(e.data.filter.replace(/\\\\(\d)/g, String.fromCharCode("$1"))); //Creates a new RegExp from a String to e.g. allow "\2" to match the keyCode 2 
      var c = !! (e.data.ctrlKey^e.ctrlKey^1 > 0); //c == true if the above stated conditions are met e.g Ctrl Key Pressed and `ctrlKey == 1` -> true 
      var a = !! (e.data.altKey^e.altKey^1 > 0); //e.g Alt Key Pressed and `altKey == 0` -> false 
      return (exp.test(key) && (c && a)); //Returns the validation Result 
     } 

     function def(obj) { //a minimal helper for default values 
      for (var prop in obj) { 
       this[prop] = this[prop] || obj[prop]; 
      } 
     } 
     this.keypress(data, function (e) { 
      if (e.data.preventDefault) e.preventDefault(); 
      if (validate(e) != e.data.invert) cb(e); //Calls the callback function if the conditions are met 
     }); 
    }; 

które można następnie użyć następujące sposoby

Z regex

$("body").selectedKey(function (e) { 
     console.log("All lower characters Numbers and 'A': " + e.char); 
    }, { 
     filter: /[a-z]|[0-9]|A/, 
     ctrlKey: 2, 
     altKey: 2 
    }); 

To byłby uruchomiony, jeżeli każdy [AZ] lub [0-9] lub klawisz Shift + A został naciśnięty, niezależnie od stanu Ctrl i Alt

Albo keycode

$("body").selectedKey(function (e) { 
     // do somet 
     console.log("KeyCode 2 " + e.char); 
    }, { 
     filter: "\\2", //Ctrl + b 
     ctrlKey: 1, 
     altKey: 2 
    }); 

byłby uruchamiany po naciśnięciu ctrl + b

Można również połączyć oba.

Oto przykład na temat JSBin, w którym można się bawić.

Powiązane problemy