捕获退格键的关键事件

9

我在JavaScript/jQuery中遇到了捕获退格键的困难。在Firefox,Safari,Opera,Chrome和iPhone/iPad上,我可以通过如下方式捕获文本输入框上的keyup事件:

$(id_input).keyup(function(event) {
   that.GetHints($(this).val().trim(), event, fieldName);
});

该事件捕获用户按键,然后将其发送到一个函数中以发出ajax查找调用。但当用户希望删除已经输入的字符时,我的问题就来了。在我可以访问的所有浏览器中,除了我的Droid手机外,当我按下退格键时,这个keyup事件会捕获由$(this).val().trim()返回的值,并将其发送到GetHints函数中进行处理。然而,在Droid上,直到用户删除$(this)中的每个字符,这个keyup事件和等效的keydown事件都不会触发。例如,如果我输入"cu",然后退格键删除"u",只留下输入字段中的"c",在除Droid外的所有浏览器中,keyup事件将触发并调用函数GetHints("c", event, fieldName)。但在Droid上,keyup事件从未触发。我错过了什么?为什么我的Droid软键盘或硬键盘上的退格键不能按预期工作?我该如何解决这个问题?

只是猜测,因为听起来像是一个安卓问题:你尝试过使用keydown或keypress事件了吗?也许你会在这些事件中更加幸运。 - Jon
是的,我会尝试使用keypress而不是keyup。 - jnoreiga
1个回答

2

您可以使用setInterval轮询文本的更改。这可能会更加可靠。例如,如果用户右键- > 剪切,则keyup不会触发。单独轮询响应速度较慢,但您可以将其与keyup结合使用以保持响应迅速。轮询会使处理器负担增加一些。

尝试类似以下内容:

var oldText = '';
var timer = setInterval(function(){
    var text = $(id_input).val().trim();
    if(text != oldText){
        oldText = text;
        that.GetHints(text, fieldName);
    }
}, 500);

根据需要调整时间间隔。

我不确定 that.GetHints 如何处理 event,但显然,使用轮询方法你无法传递它(因为没有实际的事件被触发)。这是个问题吗?

如果需要的话,你可以使用 clearInterval(timer); 停止轮询。

你可以将现有的 keyup 函数保持不变(以增加响应性),或者你可能希望仅使用轮询来避免过于频繁地调用 that.GetHints(例如,如果有人快速输入内容)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接