Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

jQuery: how to filter out non-character keys on keypress event?

I tried searching but unsure of what terms to look for.

I'm using jQuery and would like to use the keypress event in a textbox, but prevent all non-printable characters (ie. Enter, ESC, arrow keys, backspace, tab, ctrl, insert, F1-F12, etc) from triggering the event.

Is there an easy way to determine if it is printable?

like image 397
twig Avatar asked Feb 17 '10 22:02

twig


People also ask

How do you detect a keyboard key is pressed in jQuery?

jQuery | keypress() The keypress() method in jQuery triggers the keypress event whenever browser registers a keyboard input. So, Using keypress() method it can be detected if any key is pressed or not.

What is the difference between jQuery's change () and keypress () events?

The change event occurs if the value has been changed when the element loses focus. The keypress event occurs every time you press down and release a (non control) key.

What is the use of Keydown ()?

The keydown() is an inbuilt method in jQuery which is used to trigger the keydown event whenever User presses a key on the keyboard. If the key is kept pressed, the event is sent every time the operating system repeats the key. So, Using keydown() method we can detect if any key is on its way down.

What is Keyup and Keydown in jQuery?

jQuery keyup() Method The order of events related to the keyup event: keydown - The key is on its way down. keypress - The key is pressed down. keyup - The key is released.


2 Answers

The selected answer for this question is not complete. It does not handle the case where a character key is being pressed in combination with a modifier key (e.g. CTRL-A).

Try, for example, typing CTRL-A using firefox with the following code. The current answer will consider it as a character:

HTML:

<input placeholder="Try typing CTRL-A in Firefox" style="width: 200px"/> 

JavaScript:

$("input").keypress(function (e) {     if (e.which !== 0) {         alert(String.fromCharCode(e.which));     } }); 

http://jsfiddle.net/4jx7v/

Note: an alert won't be fired if using some browsers (such as Chrome), since they don't fire a keypress event for non-character inputs.

A better solution might be:

HTML:

<input placeholder="Try typing CTRL-A in Firefox" style="width: 200px"/> 

JavaScript:

$("input").keypress(function (e) {     if (e.which !== 0 &&         !e.ctrlKey && !e.metaKey && !e.altKey     ) {         alert(String.fromCharCode(e.which));     } }); 

http://jsfiddle.net/hY5f4/

In this case, the alert is only being fired when A is pressed, not CTRL-A for all browsers.

like image 112
Daniel Avatar answered Sep 21 '22 08:09

Daniel


<script>     $("input").keypress(function (e) {         if (e.which !== 0 &&             !e.ctrlKey && !e.metaKey && !e.altKey) {             alert(String.fromCharCode(e.which));         }     }); </script> 

Seems to work just fine with jQuery 1.4.2, FF, IE, Chrome.

To delve into the mess that is JS keyboard event handling, see: JavaScript Madness: Keyboard Events


Updated to filter ctrl, meta & alt key combinations as per Daniel's comment.

like image 27
6 revs, 3 users 86% Avatar answered Sep 23 '22 08:09

6 revs, 3 users 86%