How to differentiate capital letters from lower ones in onkeydown event handler method
Asked Answered
P

3

8
<html>
<head>
<title>Test</title>

<script type="text/javascript">

function showChar(e) {
    if (e.keyCode != 16) {
        alert(
           "keyCode: " + e.keyCode + "\n"
          + "SHIFT key pressed: " + e.shiftKey + "\n"
        );
    }
}

</script>
</head>

<body onkeydown="showChar(event);">
<p>Press any character key, with or without holding down
 the SHIFT key.<br /></p>
</body>
</html>

How can I differentiate capital A from lowercase a in onkeydown event handler method? Above algorithm fires the same keyCode value. I need to detect the capital letters when they are pressed in onkeydown.

Note: The code contains an exception for SHIFT key. Otherwise it does not allow to type capital letters. BTW, I need to use onkeydown for my trial.

Pisci answered 26/6, 2010 at 22:39 Comment(0)
B
8

It looks to me like you answered your own question. If you are detecting the SHIFT key, you can easily differentiate between capital and lowercase:

if(e.shiftKey){
   alert("You pressed a CAPITAL letter with the code " + e.keyCode);
}else{
   alert("You pressed a LOWERCASE letter with the code " + e.keyCode);
}

Or am I misunderstanding your question?

Update: Upper case ASCII codes can easily be converted to lower case ASCII codes by adding 32, so all you need to do is this:

<html>
<head>
<title>Test</title>

<script type="text/javascript">

function showChar(e){
  if(e.keyCode!=16){ // If the pressed key is anything other than SHIFT
        if(e.keyCode >= 65 && e.keyCode <= 90){ // If the key is a letter
            if(e.shiftKey){ // If the SHIFT key is down, return the ASCII code for the capital letter
                alert("ASCII Code: "+e.keyCode);
            }else{ // If the SHIFT key is not down, convert to the ASCII code for the lowecase letter
                alert("ASCII Code: "+(e.keyCode+32));
            }
        }else{
            alert("ASCII Code (non-letter): "+e.keyCode);
        }
  }
}

</script>
</head>

<body onkeydown="showChar(event);">
<p>Press any character key, with or without holding down
 the SHIFT key.<br /></p>
</body>
</html>

Update 2: Try this:

<html>
<head>
<title>Test</title>

<script type="text/javascript">

function showChar(e){
  if(e.keyCode!=16){ // If the pressed key is anything other than SHIFT
        c = String.fromCharCode(e.keyCode);
        if(e.shiftKey){ // If the SHIFT key is down, return the ASCII code for the capital letter
            alert("ASCII Code: "+e.keyCode+" Character: "+c);
        }else{ // If the SHIFT key is not down, convert to the ASCII code for the lowecase letter
            c = c.toLowerCase(c);
            alert("ASCII Code: "+c.charCodeAt(0)+" Character: "+c);
        }
  }
}

</script>
</head>

<body onkeydown="showChar(event);">
<p>Press any character key, with or without holding down
 the SHIFT key.<br /></p>
</body>
</html>
Blat answered 26/6, 2010 at 22:51 Comment(8)
But should not the keyCode change, too? I need to get the difference from keyCode or something else as a value. In both examples the keyCode is same. I seek a way that provides a different keyCodes for capital A and lowercase a pressed.Pisci
Take a look at the update to my answer above. I think that's what you are looking for.Blat
Thanks that is pretty close to my need. But how can I add support to UTF-8? Say for capital Ü and smallcase ü throws the "ASCII Code (non-letter)" alert. Is it possible to differentiate Unicode captial latters from smallcase letters in onkeydown.Pisci
I added some more code. I don't know if that will work, but it might.Blat
The reason that the keyCode is a keyCode instead of a character code is that the keyCode is a keyCode representing which KEY is pressed. The key by itself doesn't say whether the character will be uppercase or numeric or punctuation or whatever. Also the key by itself doesn't say whether CAPS LOCK is active, but if CAPS LOCK is active then the presence of a Shift key bit will indicate the opposite of what this code is doing.Dandelion
Windows programmer is correct, but I am not aware of a way to detect the CAPS LOCK key in JavaScript. If caps lock support is required, you would be better off having the user type into a text box and checking what they type.Blat
Computerish, it partially works but I think that is the best solution that can be achieved. Thanks for your help.Pisci
What about the CAPS lock?Preindicate
B
4

More recent and much cleaner: use event.key. No more arbitrary number codes!

node.addEventListener('keydown', function(event) {
    const key = event.key; // "a", "1", "Shift", etc.
    if (/^[a-z]$/i.test(key)) { // or if (key.length === 1 && /[a-z]/i.test(key))
        const isCapital = event.shiftKey;
    }
});

Mozilla Docs

Supported Browsers

Bolitho answered 5/9, 2017 at 18:21 Comment(1)
What about the CAPS lock?Preindicate
M
0

I did quite a bit of searching on this question, as I was writing code to limit an input element (using the keyPress event) to alpha characters only. I was using "character codes between 65 and 90" and could not enter lowercase letters in the field.

I finally discovered that JavaScript is using ASCII codes for this, so I just added "and also between 97 and 122" and viola! I'm able to enter both upper and lower case letters. To wit:

function alphaOnly(e) {
    'use strict';
    if (!e) { // compensates for IE's key code reporting.
        e = window.event;
    }
    var charCode = (e.which) ? e.which : event.keyCode;
    if ((charCode >= 65 && charCode <= 90) || (charCode >= 97 && charCode <= 122)) {
        return true;
    } else {
        return false;
    }
}
Moussaka answered 3/2, 2016 at 23:51 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.