programmatic firing of keydown event

R

runner7

Can anyone help me with how to programmatically fire a keydown event in
Firefox?
 
M

mouseit101

runner7 said:
Can anyone help me with how to programmatically fire a keydown event in
Firefox?


I don't think it's possible to cause a keyDown event for security
reasons, or if you can I don't think you can set the keyCode. I might
be wrong though, so don't take this as a final answer.
 
R

runner7

As best as I can tell from "developer.mozilla" and "w3c" sites, the
following code should work in Firefox, but I cannot get it to work:

function keyFire(e) {
var e1=document.createEvent("KeyboardEvent");
e1.initKeyboardEvent("keydown",true,true,window,"U+0009",
DOM_KEY_LOCATION_STANDARD,null);
document.forms[0].elements[0].dispatchEvent(e1);
e.preventDefault();
e.stopPropagation();
}

"U+0009" happens to be for the tab key. Has anyone got a clue?
 
B

Bart Van der Donck

runner7 said:
As best as I can tell from "developer.mozilla" and "w3c" sites, the
following code should work in Firefox, but I cannot get it to work:

function keyFire(e) {
var e1=document.createEvent("KeyboardEvent");
e1.initKeyboardEvent("keydown",true,true,window,"U+0009",
DOM_KEY_LOCATION_STANDARD,null);
document.forms[0].elements[0].dispatchEvent(e1);
e.preventDefault();
e.stopPropagation();
}

"U+0009" happens to be for the tab key. Has anyone got a clue?

<body onKeyDown="
if ( window.event ) {
alert( window.event.keyCode );
}
else
if ( event ) {
alert( event.which );
}
">
 
R

runner7

Thanks guys for your answers, but I think I need to clarify what I am
trying to do. I am not trying to detect a keystroke or what key was
pressed. I am trying to programmatically send the equivalent of a
keystroke to the Firefox browser.

In IE, the problem is trivial, because window.event.keyCode can be set,
but in Firefox the event.which property appears to be read only.
Thanks to anyone for any further insight on this matter.
 
B

Bart Van der Donck

runner7 said:
Thanks guys for your answers, but I think I need to clarify what I am
trying to do. I am not trying to detect a keystroke or what key was
pressed. I am trying to programmatically send the equivalent of a
keystroke to the Firefox browser.

That equivalent is actually just the decimal code point of the
character.

alert('W'.charCodeAt(0));

should show you '87', the same cp as when pressing 'W' in my previous
snippet. There are some things you should be aware of though (e.g.
upper/lower case), but you can send/retrieve such values wherever you
want.
In IE, the problem is trivial, because window.event.keyCode can be set,
but in Firefox the event.which property appears to be read only.

I don't think this is correct. AFAIK, keyCode should be read-only
too.

Your problem is more fundamental. You want to make javascript think the
user pressed a key, while he actually didn't press it. It's spoofing by
definition - browsers are right to complain about this kind of
trickery. My gut feeling is that you should give up your plan and
rethink your coding strategy.

And honestly I can't think of any good reason why you would want to
fake a keystroke, besides theoretical or hacking motives.
 
R

runner7

Bart said:
I don't think this is correct. AFAIK, keyCode should be read-only
too.

(AFAIK==as far as I know?)

The following code works in IE to replace an "enter" keystroke with a
"tab" keystroke in the first text box:

<html>
<head><title></title>
<script type="text/javascript">
function replace(e) {
if (e.keyCode==13) e.keyCode=9
}
</script>
</head>
<body>
<form>
<input onkeydown="replace(event)" /><br />
<input />
</form>
</body>
</html>

If you replace the "keyCode" property with the "which" property for
Firefox, the code does not work in Firefox.
Your problem is more fundamental. You want to make javascript think the
user pressed a key, while he actually didn't press it. It's spoofing by
definition - browsers are right to complain about this kind of
trickery. My gut feeling is that you should give up your plan and
rethink your coding strategy.

And honestly I can't think of any good reason why you would want to
fake a keystroke, besides theoretical or hacking motives.

The purpose is for a data entry application, such as when using the
numeric keypad to enter data. Typically, the "enter" key will work
like a "tab" key until the last field on the form. Using
String.fromCharCode(9) to append to the fields's value only appends a
"tab" character just like in a word processing application, but does
not cause the cursor to move to the next field. Any ideas on how to
make "enter" work like "tab" in Firefox?
 
R

Richard Cornford

runner7 said:
Bart Van der Donck wrote:

The purpose is for a data entry application, such as when
using the numeric keypad to enter data. Typically, the
"enter" key will work like a "tab" key until the last
field on the form.

Is that typical of web browsers? That has not been my experience.
Using String.fromCharCode(9) to append to the fields's
value only appends a "tab" character just like in a
word processing application, but does not cause the cursor
to move to the next field. Any ideas on how to
make "enter" work like "tab" in Firefox?

While fixating on the insoluble key event problem you are falling to
notice that what you want to do is focus the next field in the tabbing
sequence in response to a key event. That can certainly be done (on the
limited number of browsers you seem interested in) by identifying the
significant key event, cancelling it, identifying the next filed and
explicitly calling its - focus - method. It may not be as simple as
changing the key event, or faking them, but when neither of those will
do it is a viable alternative.

Richard.
 
R

runner7

runner7 said:
Richard Cornford wrote:
Is that typical of web browsers? That has not been my experience.

I meant desktop data-entry applications. This one happens to have a
browser interface.

Richard said:
That can certainly be done (on the
limited number of browsers you seem interested in) by identifying the
significant key event, cancelling it, identifying the next filed and
explicitly calling its - focus - method.

Thank you. That is the solution. I wish I could say I had thought of
it. I am still wondering about the DOM 3 "KeyboardEvent" though, which
developer.mozilla.org says is supposed to be supported by Firefox's
Gecko layout engine.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,767
Messages
2,569,570
Members
45,045
Latest member
DRCM

Latest Threads

Top