I had a similar problem where I needed to obtain the correct value that a user's keypress would generate to evaluate it properly, so I learned from other answers here and wrote my own.
function getNewValue(evt) {
var start = evt.target.selectionStart,
end = evt.target.selectionEnd,
charCode = (evt.which) ? evt.which : evt.keyCode,
original = $(evt.target).val(),
char = String.fromCharCode(charCode),
newer = "", inserted = false, single = 0;
if (start == end) single = 1;
if (original.length > 0) {
for (var i = 0; i < original.length; i++) {
if (!inserted) {
if (single && i == start) {
newer += char + original[i];
inserted = true;
} else if (!single && i == start) {
newer += char; inserted = true;
} else
newer += original[i];
} else {
if (single)
newer += original[i];
else if (i < start || i >= end)
newer += original[i];
}
}
if (!inserted) newer += char;
} else newer += char;
console.log("newer: " + newer);
// You can add conditions here to evaluate "newer".
// Use "return false" to reject "newer".
}
I use this function by adding the following to the HTML element that I want to evaluate:
onkeypress="return getNewValue(event)"
I haven't had any problems with it, but I'll update this answer if I find a better alternative or notice any problems.