Comment savoir si l'.keyup() est une clé de caractère (jQuery))

Comment savoir si .keyup() est une clé de caractère (jQuery)

$("input").keyup(function() {

if (key is a character) { //such as a b A b c 5 3 2 $ # ^ ! ^ * # ...etc not enter key or shift or Esc or space ...etc
/* Do stuff */
}

});
59
demandé sur faressoft 2010-10-20 16:16:02

6 réponses

Note: rétrospectivement, il s'agit d'une réponse rapide et sale, et peut ne pas fonctionner dans toutes les situations. Pour avoir une solution fiable, voir Tim Down's answer (copier coller que ici, car cette réponse est toujours obtenir des vues et des notes positives):

vous ne pouvez pas faire cela de manière fiable avec l'événement keyup. Si vous voulez savoir quelque chose à propos du personnage qui a été tapé, vous devez utiliser la événement de keypress à la place.

l'exemple suivant fonctionnera tout le temps dans la plupart des navigateurs mais il y a quelques cas de bord que vous devriez être au courant. Pour ce qui est en mon point de vue le guide définitif à ce sujet, voir http://unixpapa.com/js/key.html .

$("input").keypress(function(e) {
    if (e.which !== 0) {
        alert("Charcter was typed. It was: " + String.fromCharCode(e.which));
    }
});

keyup et keydown vous donnent des informations sur la clé physique qui a été pressé. Sur claviers standard US / UK dans leurs dispositions standard, il regarde comme il est une corrélation entre la propriété keyCode de ces événements et les personnages qu'ils représentent. Cependant, ce n'est pas fiable: différentes dispositions de clavier auront des mappages différents.


la réponse originale est la suivante, mais elle n'est pas correcte et peut ne pas fonctionner de façon fiable dans toutes les situations.

pour apparier le code avec un caractère word (par ex., a serait-match. space ne serait pas)

$("input").keyup(function(event)
{ 
    var c= String.fromCharCode(event.keyCode);
    var isWordcharacter = c.match(/\w/);
}); 

Ok, c'était une réponse rapide. L'approche est la même, mais méfiez-vous des problèmes de keycode, voir cet article dans quirksmode.

45
répondu Nivas 2017-05-23 11:54:50

vous ne pouvez pas faire cela de manière fiable avec l'événement keyup . si vous voulez savoir quelque chose sur le caractère qui a été tapé, vous devez utiliser l'événement keypress à la place.

L'exemple suivant fonctionnera tout le temps dans la plupart des navigateurs, mais il y a certains cas de bord que vous devriez être au courant. Pour ce qui est à mon avis Le guide définitif à ce sujet, voir http://unixpapa.com/js/key.html .

$("input").keypress(function(e) {
    if (e.which !== 0) {
        alert("Charcter was typed. It was: " + String.fromCharCode(e.which));
    }
});

keyup et keydown vous donnent des informations sur la physique de la touche qui a été pressée. Sur les claviers standard US / UK dans leur disposition standard, il semble qu'il y ait une corrélation entre la propriété keyCode de ces événements et le caractère qu'ils représentent. Cependant, ce n'est pas fiable: différentes configurations de clavier auront des mappages différents.

96
répondu Tim Down 2012-06-21 13:49:19

cela m'a aidé:

$("#input").keyup(function(event) {
        //use keyup instead keypress because:
        //- keypress will not work on backspace and delete
        //- keypress is called before the character is added to the textfield (at least in google chrome) 
        var searchText = $.trim($("#input").val());

        var c= String.fromCharCode(event.keyCode);
        var isWordCharacter = c.match(/\w/);
        var isBackspaceOrDelete = (event.keyCode == 8 || event.keyCode == 46);

        // trigger only on word characters, backspace or delete and an entry size of at least 3 characters
        if((isWordCharacter || isBackspaceOrDelete) && searchText.length > 2)
        { ...
11
répondu TARL 2016-10-20 18:55:04

Je ne suis pas entièrement satisfait des autres réponses données. Ils ont tous obtenu une sorte de faille.

utiliser keyPress avec event.which n'est pas fiable parce que vous ne pouvez pas attraper un backspace ou un delete (comme mentionné par Tarl). Utiliser keyDown (comme dans les réponses de Niva et Tarl) est un peu mieux, mais la solution est imparfaite parce qu'elle tente d'utiliser event.keyCode avec String.fromCharCode() (keyCode et charCode ne sont pas les mêmes!).

Cependant, ce que nous avons avec l'événement keydown ou keyup est la clé réelle qui a été pressée ( event.key ). Pour autant que je puisse dire, tout key d'une longueur de 1 est un caractère (nombre ou lettre) quelle que soit la langue clavier que vous utilisez. Veuillez me corriger si ce n'est pas vrai!

puis il y a cette très longue réponse de l'asdf. Ça pourrait marcher parfaitement, mais ça semble exagéré.


Donc voici une solution simple qui va attraper tous les caractères, backspace, et supprimer. (Note: keyup ou keydown fonctionnera ici, mais keypress ne fonctionnera pas)

$("input").keydown(function(e) {

    var isWordCharacter = event.key.length === 1;
    var isBackspaceOrDelete = (event.keyCode == 8 || event.keyCode == 46);

    if (isWordCharacter || isBackspaceOrDelete) {

    }
});
7
répondu HankScorpio 2018-02-08 00:41:39

si vous n'avez besoin d'exclure que les clés enter , escape et spacebar , vous pouvez faire ce qui suit:

$("#text1").keyup(function(event) {
if (event.keyCode != '13' && event.keyCode != '27' && event.keyCode != '32') {
     alert('test');
   }
});

Voir les actions ici.

vous pouvez vous référer à la liste complète des codes ici pour votre modification ultérieure.

4
répondu bla 2010-10-20 12:31:26

je voulais faire exactement cela, et j'ai pensé à une solution impliquant à la fois le keyup et le keypress événements.

(Je ne l'ai pas testé sur tous les navigateurs, mais j'ai utilisé les informations compilées à http://unixpapa.com/js/key.html )

Edit: rewrited it as a jQuery plugin.

(function($) {
    $.fn.normalkeypress = function(onNormal, onSpecial) {
        this.bind('keydown keypress keyup', (function() {
            var keyDown = {}, // keep track of which buttons have been pressed
                lastKeyDown;
            return function(event) {
                if (event.type == 'keydown') {
                    keyDown[lastKeyDown = event.keyCode] = false;
                    return;
                }
                if (event.type == 'keypress') {
                    keyDown[lastKeyDown] = event; // this keydown also triggered a keypress
                    return;
                }

                // 'keyup' event
                var keyPress = keyDown[event.keyCode];
                if ( keyPress &&
                     ( ( ( keyPress.which >= 32 // not a control character
                           //|| keyPress.which == 8  || // \b
                           //|| keyPress.which == 9  || // \t
                           //|| keyPress.which == 10 || // \n
                           //|| keyPress.which == 13    // \r
                           ) &&
                         !( keyPress.which >= 63232 && keyPress.which <= 63247 ) && // not special character in WebKit < 525
                         !( keyPress.which == 63273 )                            && //
                         !( keyPress.which >= 63275 && keyPress.which <= 63277 ) && //
                         !( keyPress.which === event.keyCode && // not End / Home / Insert / Delete (i.e. in Opera < 10.50)
                            ( keyPress.which == 35  || // End
                              keyPress.which == 36  || // Home
                              keyPress.which == 45  || // Insert
                              keyPress.which == 46  || // Delete
                              keyPress.which == 144    // Num Lock
                              )
                            )
                         ) ||
                       keyPress.which === undefined // normal character in IE < 9.0
                       ) &&
                     keyPress.charCode !== 0 // not special character in Konqueror 4.3
                     ) {

                    // Normal character
                    if (onNormal) onNormal.call(this, keyPress, event);
                } else {
                    // Special character
                    if (onSpecial) onSpecial.call(this, event);
                }
                delete keyDown[event.keyCode];
            };
        })());
    };
})(jQuery);
4
répondu asdf 2012-07-20 23:12:01