iOS 9 - keyup 事件未触发

iOS 9 - keyup event not firing

是否有人对 iOS 9 中的 keyup 事件没有触发有问题?

只需一个简单的测试台就可以为我复制这个问题。

<input id="txtInput" />

原版 JS:

document.getElementById('txtInput').onkeyup = function () {
    console.log('keyup triggered');
}

jQuery:

$('#txtInput').on('keyup', function () {
    console.log('keyup triggered');
});

都不火...

它不是很漂亮,但解决方法是绑定到 keydown 以捕获按下的键,如果您想获取值,则 input 包括键入的键:

(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);
        });
}());

如果您键入 'a',将出现以下情况:

  1. keydown 触发。
  2. e.keyCode 设置为按下的键的 ASCII 值。
  3. this.value''(即在输入 'a' 之前相同)。
  4. input 触发。
  5. e.keyCodeundefined
  6. this.value'a'.

您也可以在按下回车 (13) 键时手动触发 input 事件; input 默认情况下不会被该键触发。

我建议在带有触摸屏的浏览器上使用 keypress 事件。不过,我知道 you can't really detect touch screen screens,因此它为您提供了一些您的情况可能会决定的选项。

  1. 附加事件 keyupkeypress。这可能取决于正在进行的处理量以及您是否在某些浏览器中出现双重触发。
  2. 尝试判断浏览器是否为触摸屏(如使用Modernizr),然后附加回退处理程序如change.

无论哪种方式,您最终都会得到两个事件侦听器。

$('#yourid').bind('keypress', function(e) {
    // This will work
});