Is anybody else having problems with the keyup
event in iOS 9 not firing?
Just a simple test bed replicates the issue for me.
<input id="txtInput" />
Vanilla JS:
document.getElementById('txtInput').onkeyup = function () {
console.log('keyup triggered');
}
jQuery:
$('#txtInput').on('keyup', function () {
console.log('keyup triggered');
});
Neither fire...
I suggest using the keypress
event on browsers with touch screens. I know that you can't really detect touch screen screens, though, so it leaves you with a few options that your situation will likely dictate.
- Attach both events
keyup
and keypress
. This would likely be dependent on how much processing is going on and if you are getting double-fires in some browsers.
- Attempt to determine whether the browser is a touch screen (like using Modernizr), and then attach a fallback handler like
change
.
Either way, you end up with two event listeners.
$('#yourid').bind('keypress', function(e) {
// This will work
});
It's not pretty, but a work around is to bind to keydown
to capture which key has been pressed, and input
if you want to obtain the value, including the key typed:
(function () {
var keyCode;
$('#txtInput')
.on('keydown', function (e) {
// value not updated yet
keyCode = e.keyCode;
// Enter key does not trigger 'input' events; manually trigger it
if (e.keyCode === 13) $(this).trigger('input');
})
.on('input', function (e) {
console.log(keyCode, this.value);
});
}());
If you type 'a' the following occurs:
keydown
fires.
e.keyCode
is set to the ASCII value of the key pressed.
this.value
is ''
(i.e. the same before 'a' has been typed).
input
fires.
e.keyCode
is undefined
.
this.value
is 'a'
.
You can also manually trigger an input
event if the enter (13) key is pressed; input
isn't fired by this key by default.