By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
459,654 Members | 1,554 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 459,654 IT Pros & Developers. It's quick & easy.

keyboard events and dead letters

P: n/a
I'm trying to find what character was pressed, using an accent with a
dead letter, e.g an á, on an input box.

I have made an small program to check the keyboard events keydown,
keypress and keyup, and only the
keyup one is fired two times. The first with a 0 keycode and the
characte code just later. No keydown or keypress events, and it is
not enough information to know what character was really pressed.
It happens with Firefox 2.0.0.14 on Linux. Firefox on Windows works
and behaves in a different way.

The input box is properly modified, so, I guess Firefox understands
whatever key sequence is
receiving from the Operating or the X system.

Any suggestion?

Thanks in advance.
Jun 27 '08 #1
Share this Question
Share on Google+
12 Replies


P: n/a
Joaquín Zuazo wrote on 18 mei 2008 in comp.lang.javascript:
I'm trying to find what character was pressed, using an accent with a
dead letter, e.g an *, on an input box.

I have made an small program to check the keyboard events keydown,
keypress and keyup, and only the
keyup one is fired two times. The first with a 0 keycode and the
characte code just later. No keydown or keypress events, and it is
not enough information to know what character was really pressed.
It happens with Firefox 2.0.0.14 on Linux. Firefox on Windows works
and behaves in a different way.

The input box is properly modified, so, I guess Firefox understands
whatever key sequence is
receiving from the Operating or the X system.

Any suggestion?
Why not compare the whole content on each keyup with the earlier content?

--
Evertjan.
The Netherlands.
(Please change the x'es to dots in my emailaddress)
Jun 27 '08 #2

P: n/a
Thomas 'PointedEars' Lahn wrote:
var charCode = (typeof e.charCode != "undefined"
? e.charCode
: (typeof e.keyCode != "undefined"
? e.keyCode
: charCode);
: charCode));
Jun 27 '08 #3

P: n/a
On 18 mayo, 11:52, Thomas 'PointedEars' Lahn <PointedE...@web.de>
wrote:
Thomas 'PointedEars' Lahn wrote:
var charCode = (typeof e.charCode != "undefined"
? e.charCode
: (typeof e.keyCode != "undefined"
? e.keyCode
: charCode);

: charCode));
This is the html test page:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<!-- Keyboard events test program, by Joaquín Zuazo -->
<head>
<title>Testing keyboard events</title>
<meta http-equiv="encoding=UTF-8"></meta>

<script language="javascript" type="text/javascript">
window.onload=testkeys;
var checkinput, out;
var title = "Event\t\tkeyCode\t\twhich\t\tcharCode\tfromCharCo de
\tInput Box\n\n";

function testkeys()
{
checkinput = document.getElementById("checkinput");
out = document.getElementById("out");
out.innerHTML = title;
checkinput.onkeydown=check_down;
checkinput.onkeypress=check_press;
checkinput.onkeyup=check_up;
}
function reset_all()
{
out.innerHTML = title;
checkinput.value ="";

}
function output_message(function_name,event)
{
var valid_one = event.keyCode ? event.keyCode : event.which ?
event.which : event.charCode;
var message = function_name + "\t"
+ ( event.keyCode ? event.keyCode : event.keyCode == 0 ?
0 : "undef" )
+ "\t\t"
+ ( event.which ? event.which : event.wich == 0 ?
0 : "undef" )
+ "\t\t"
+ ( event.charCode ? event.charCode : event.charCode == 0 ?
0 :"undef" )
+ "\t\t"
+ ( valid_one >= 32 ? String.fromCharCode ( valid_one ) :
"Ctrl" )
+ "\t\t"
+ checkinput.value
+ "\n";
out.innerHTML += message;
}
function check_press(e)
{
var event = e ? e : window.event;
output_message("keypress",event);
}
function check_up(e)
{
var event = e ? e : window.event;
output_message("keyup ",event);
}
function check_down(e)
{
var event = e ? e : window.event;
output_message("keydown ",event);
}
</script>
</head>

<body>
<h1>Testing keyboard events</h1>
<button onclick="reset_all();">Reset </button>
<input id="checkinput"></input>
<pre id="out"</pre>
</body>

</html>

This is the return with Firefox 2.0.0.14 with Linux/Fedora
keyup 0 undef 0 Ctrl
keyup 65 65 0 A á
And with Firefox 2.0.0.14 on Windows Xp
keydown
keyup 0 undef 0 Ctrl
keyup 65 65 0 A á
Jun 27 '08 #4

P: n/a
On 18 mayo, 11:52, Thomas 'PointedEars' Lahn <PointedE...@web.de>
wrote:
Thomas 'PointedEars' Lahn wrote:
var charCode = (typeof e.charCode != "undefined"
? e.charCode
: (typeof e.keyCode != "undefined"
? e.keyCode
: charCode);

: charCode));
This is the test page

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<!-- Keyboard events test program, by Joaquín Zuazo -->
<head>
<title>Testing keyboard events</title>
<meta http-equiv="encoding=UTF-8"></meta>

<script language="javascript" type="text/javascript">
window.onload=testkeys;
var checkinput, out;
var title = "Event\t\tkeyCode\t\twhich\t\tcharCode\tfromCharCo de
\tInput Box\n\n";

function testkeys()
{
checkinput = document.getElementById("checkinput");
out = document.getElementById("out");
out.innerHTML = title;
checkinput.onkeydown=check_down;
checkinput.onkeypress=check_press;
checkinput.onkeyup=check_up;
}
function reset_all()
{
out.innerHTML = title;
checkinput.value ="";

}
function output_message(function_name,event)
{
var valid_one = event.keyCode ? event.keyCode : event.which ?
event.which : event.charCode;
var message = function_name + "\t"
+ ( event.keyCode ? event.keyCode : event.keyCode == 0 ?
0 : "undef" )
+ "\t\t"
+ ( event.which ? event.which : event.wich == 0 ?
0 : "undef" )
+ "\t\t"
+ ( event.charCode ? event.charCode : event.charCode == 0 ?
0 :"undef" )
+ "\t\t"
+ ( valid_one >= 32 ? String.fromCharCode ( valid_one ) :
"Ctrl" )
+ "\t\t"
+ checkinput.value
+ "\n";
out.innerHTML += message;
}
function check_press(e)
{
var event = e ? e : window.event;
output_message("keypress",event);
}
function check_up(e)
{
var event = e ? e : window.event;
output_message("keyup ",event);
}
function check_down(e)
{
var event = e ? e : window.event;
output_message("keydown ",event);
}
</script>
</head>

<body>
<h1>Testing keyboard events</h1>
<button onclick="reset_all();">Reset </button>
<input id="checkinput"></input>
<pre id="out"</pre>
</body>

</html>
This is the result for the key sequence 'a on Linux, Firefox 2.0.0.14
Event keyCode which charCode fromCharCode Input Box

keyup 0 undef 0 Ctrl
keyup 65 65 0 A á

And this is the result with Firefox 2.0.0.14 on Windows Xp
Event keyCode which charCode fromCharCode Input Box

keydown 222 222 0 Þ
keyup 222 222 0 Þ
keydown 65 65 0 A
keypress 0 225 225 á
keyup 65 65 0
A á

Do you think is this a bug of Firefox?
The problem is that the only place where is kept valid information
with the Linux implementation
is inside the input text box, and hacking this is somewhat dirty.
I really thank any suggestion
Jun 27 '08 #5

P: n/a
JoaquÃ*n Zuazo wrote:
[103 quoted lines]

Yes no keypress events. Only two keyup events as shown.
(sic!)

http://jibbering.com/faq/#FAQ2_3
PointedEars
--
Anyone who slaps a 'this page is best viewed with Browser X' label on
a Web page appears to be yearning for the bad old days, before the Web,
when you had very little chance of reading a document written on another
computer, another word processor, or another network. -- Tim Berners-Lee
Jun 27 '08 #6

P: n/a
On 19 mayo, 01:25, Thomas 'PointedEars' Lahn <PointedE...@web.de>
wrote:
Joaquín Zuazo wrote:
[103 quoted lines]
Yes no keypress events. Only two keyup events as shown.

(sic!)

http://jibbering.com/faq/#FAQ2_3

PointedEars
--
Anyone who slaps a 'this page is best viewed with Browser X' label on
a Web page appears to be yearning for the bad old days, before the Web,
when you had very little chance of reading a document written on another
computer, another word processor, or another network. -- Tim Berners-Lee
There is another place to check keyboard events: http://unixpapa.com/js/testkey.html
that I
have worked before. The result is the same.

Also there is a line I don't understand from your code Is it a typo?
var charCode = (typeof e.charCode != "undefined"
? e.charCode
: (typeof e.keyCode != "undefined"
? e.keyCode
: charCode);
:charCode); <<<<<<<

var charCode = charCode if no other value is available ?

Thanks a lot.
Jun 27 '08 #7

P: n/a
JoaquÃ*n Zuazo wrote:
On 19 mayo, 01:25, Thomas 'PointedEars' Lahn <PointedE...@web.de>
wrote:
>JoaquÃ*n Zuazo wrote:
>>[103 quoted lines]
Yes no keypress events. Only two keyup events as shown.
(sic!)
[...]
Could you please trim your quotes?
There is another place to check keyboard events: http://unixpapa.com/js/testkey.html
that I have worked before. The result is the same.

Also there is a line I don't understand from your code Is it a typo?
var charCode = (typeof e.charCode != "undefined"
> ? e.charCode
: (typeof e.keyCode != "undefined"
? e.keyCode
: charCode);
:charCode); <<<<<<<
Another `)' is missing before the `;'. I had corrected that in a followup
already.
var charCode = charCode if no other value is available ?
Exactly. At this point, the `charCode' variable is already instantiated
(since variable instantiation comes before execution), but not explicitly
initialized yet. So its value is `undefined', the sole value of the
Undefined type. It is a convenient way to avoid reproducing the variable
identifier and to assign `undefined' anyway (i.e. keep the initial
`undefined' value), without having to resort to the `undefined' property of
the Global Object, which is not universally available, or read access to
non-existing properties, which would cause strict script warnings in Geckos.

If you find this too confusing, you may use an explicit universally
available false-value (like `null' or `false') or you can write

var charCode;

if (typeof e.charCode != "undefined")
{
charCode = e.charCode;
}
else if (typeof e.keyCode != "undefined")
{
charCode = e.keyCode;
}

instead.
PointedEars
--
Anyone who slaps a 'this page is best viewed with Browser X' label on
a Web page appears to be yearning for the bad old days, before the Web,
when you had very little chance of reading a document written on another
computer, another word processor, or another network. -- Tim Berners-Lee
Jun 27 '08 #8

P: n/a
[snipped attribution novel]

JoaquÃ*n Zuazo wrote:
Thomas 'PointedEars' Lahn wrote:
>JoaquÃ*n Zuazo wrote:
>>[103 quoted lines]
Yes no keypress events. Only two keyup events as shown.
(sic!)

There is another place to check keyboard events: http://unixpapa.com/js/testkey.html
that I have worked before. The result is the same.
"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.12) Gecko/20080129
Iceweasel/2.0.0.12 (Debian-2.0.0.12-0etch1)":

| keydown keyCode=68 (D) which=68 (D) charCode=0
keyIdentifier=undefined
| keypress keyCode=0 which=100 (d) charCode=100 (d)
keyIdentifier=undefined
| keyup keyCode=68 (D) which=68 (D) charCode=0
keyIdentifier=undefined

So probably it's a bug in the Firefox version of your Linux distribution.

Please trim your quotes to the relevant parts.
PointedEars
--
Use any version of Microsoft Frontpage to create your site.
(This won't prevent people from viewing your source, but no one
will want to steal it.)
-- from <http://www.vortex-webdesign.com/help/hidesource.htm>
Jun 27 '08 #9

P: n/a
On 20 mayo, 11:53, Thomas 'PointedEars' Lahn <PointedE...@web.de>
wrote:
[snipped attribution novel]

Joaquín Zuazo wrote:
Thomas 'PointedEars' Lahn wrote:
Joaquín Zuazo wrote:
[103 quoted lines]
>
"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.12) Gecko/20080129
Iceweasel/2.0.0.12 (Debian-2.0.0.12-0etch1)":

| keydown keyCode=68 (D) which=68 (D) charCode=0
keyIdentifier=undefined
| keypress keyCode=0 which=100 (d) charCode=100 (d)
keyIdentifier=undefined
| keyup keyCode=68 (D) which=68 (D) charCode=0
keyIdentifier=undefined

So probably it's a bug in the Firefox version of your Linux distribution.
I guess from your message, that you are pressing the key "d". This
works well with my distribution,
and with the same result you are posting.

The problem comes when I need to identify an "á" or an "ö". For that,
I must press two keys, one for
the accent ( the dead key ) and other for the letter itself with an
spanish keyboard, or an english international
keyboard, that provides dead letters also.

Then, only two keyup events are returned for all the keys pressed.

With windows, you get five keyboard events, and all the information
you need to identify
the key.
Thanks a lot for your help.
Jun 27 '08 #10

P: n/a
JoaquÃ*n Zuazo wrote:
Thomas 'PointedEars' Lahn wrote:
>[snipped attribution novel]
JoaquÃ*n Zuazo wrote:
>>Thomas 'PointedEars' Lahn wrote:
JoaquÃ*n Zuazo wrote:
[103 quoted lines]

"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.12) Gecko/20080129
Iceweasel/2.0.0.12 (Debian-2.0.0.12-0etch1)":

| keydown keyCode=68 (D) which=68 (D) charCode=0
keyIdentifier=undefined
| keypress keyCode=0 which=100 (d) charCode=100 (d)
keyIdentifier=undefined
| keyup keyCode=68 (D) which=68 (D) charCode=0
keyIdentifier=undefined

So probably it's a bug in the Firefox version of your Linux distribution.

I guess from your message, that you are pressing the key "d". This
works well with my distribution, and with the same result you are posting.

The problem comes when I need to identify an "á" or an "ö". For that,
I must press two keys, one for the accent ( the dead key ) and other
for the letter itself with an spanish keyboard, or an english international
keyboard, that provides dead letters also.
Sorry, I missed that this time.
Then, only two keyup events are returned for all the keys pressed.
I am afraid I have to confirm this (with only "keypress" suppressed):

| keyup keyCode=0 which=0 charCode=0
keyIdentifier=undefined
| ókeyup keyCode=79 (O) which=79 (O) charCode=0
keyIdentifier=undefined
With windows, you get five keyboard events, and all the information
you need to identify the key.
Yes, indeed (same character, same settings):

| keydown keyCode=221 which=221 charCode=0
keyIdentifier=undefined
| keyup keyCode=221 which=221 charCode=0
keyIdentifier=undefined
| keydown keyCode=79 (O) which=79 (O) charCode=0
keyIdentifier=undefined
| keypress keyCode=0 which=243 charCode=243
keyIdentifier=undefined
| keyup keyCode=79 (O) which=79 (O) charCode=0
keyIdentifier=undefined

So ISTM for Linux you have to watch for a keyup event for a character key
immediately preceded by a keyup event where keyCode == which == 0.
Unfortunately, `charCode' is not available then, and ISTM keyCode/which
is specific to a keyboard layout. But maybe it suffices here.
PointedEars
--
Use any version of Microsoft Frontpage to create your site.
(This won't prevent people from viewing your source, but no one
will want to steal it.)
-- from <http://www.vortex-webdesign.com/help/hidesource.htm>
Jun 27 '08 #11

P: n/a
So ISTM for Linux you have to watch for a keyup event for a character key
immediately preceded by a keyup event where keyCode == which == 0.
Unfortunately, `charCode' is not available then, and ISTM keyCode/which
is specific to a keyboard layout. But maybe it suffices here.
The problem is than you can not know even what kind of accent was
pressed.
The only place where you can get the information is within the input
box
value.

I think this is a bug of Firefox.
Jun 27 '08 #12

P: n/a
JoaquÃ*n Zuazo wrote:
>So ISTM for Linux you have to watch for a keyup event for a character key
immediately preceded by a keyup event where keyCode == which == 0.
Unfortunately, `charCode' is not available then, and ISTM keyCode/which
is specific to a keyboard layout. But maybe it suffices here.

The problem is than you can not know even what kind of accent was
pressed. The only place where you can get the information is within
the input box value.
Right. So that would mean evaluation after input, using .selectionStart and
..selectionEnd. Not pretty, but works.
I think this is a bug of Firefox.
Or of X? Yes, you should file a bug.
PointedEars
--
Prototype.js was written by people who don't know javascript for people
who don't know javascript. People who don't know javascript are not
the best source of advice on designing systems that use javascript.
-- Richard Cornford, cljs, <f8*******************@news.demon.co.uk>
Jun 27 '08 #13

This discussion thread is closed

Replies have been disabled for this discussion.