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 */
}
});
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
etkeydown
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.
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.
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)
{ ...
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) {
}
});
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');
}
});
vous pouvez vous référer à la liste complète des codes ici pour votre modification ultérieure.
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);