Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Detecting "value" of input text field after a keydown event in the text field?

Tags:

My site has an input box, which has a onkeydown event that merely alerts the value of the input box.

Unfortunately the value of the input does not include the changes due to the key being pressed.

For example for this input box:

<input onkeydown="alert(this.value)" type="text" value="cow" /> 

The default value is "cow". When you press the key s in the input, you get an alert("cow") instead of an alert("cows"). How can I make it alert("cows") without using onkeyup? I don't want to use onkeyup because it feels less responsive.

One partial solution is to detect the key pressed and then append it to the input's value, but this doesn't work in all cases such as if you have the text in the input highlighted and then you press a key.

Anyone have a complete solution to this problem?

like image 314
rawrrrrrrrr Avatar asked Aug 27 '09 01:08

rawrrrrrrrr


People also ask

What is the return value of Keydown function?

So, Using keydown() method we can detect if any key is on its way down. Here selector is the selected element. Parameter: It accepts an optional parameter as a function which gives the idea whether any key is pressed or not. Return values: It returns whether any key is pressed or not or which key is pressed.

What is the use of on Keydown event?

Definition and Usage The onkeydown event occurs when the user is pressing a key (on the keyboard). Tip: The order of events related to the onkeydown event: onkeydown. onkeypress.


1 Answers

The event handler only sees the content before the change is applied, because the mousedown and input events give you a chance to block the event before it gets to the field.

You can work around this limitation by giving the browser a chance to update the field's contents before grabbing its value - the simplest way is to use a small timeout before checking the value.

A minimal example is:

<input id="e"     onkeydown="window.setTimeout( function(){ alert(e.value) }, 1)"     type="text" value="cow" /> 

This sets a 1ms timeout that should happen after the keypress and keydown handlers have let the control change its value. If your monitor is refreshing at 60fps then you've got 16ms of wiggle room before it lags 2 frames.


A more complete example (which doesn't rely on named access on the Window object would look like:

var e = document.getElementById('e');  var out = document.getElementById('out');    e.addEventListener('input', function(event) {    window.setTimeout(function() {      out.value = event.target.value;    }, 1);  });
<input type="text" id="e" value="cow">  <input type="text" id="out" readonly>

When you run the above snippet, try some of the following:

  • Put the cursor at the start and type
  • Paste some content in the middle of the text box
  • Select a bunch of text and type to replace it
like image 124
kibibu Avatar answered Sep 30 '22 15:09

kibibu