【问题标题】:Capturing key event for backspace捕获退格键的关键事件
【发布时间】:2010-04-27 18:06:36
【问题描述】:

我很难在 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() 返回的值并将其发送到函数中处理获取提示。然而,在 Droid 上,这个 keyup 和等效的 keydown 事件都不会触发,直到用户退格到 $(this) 中的每个字符。

因此,例如,如果我输入“cu”,然后在“u”上退格,在输入字段中只留下“c”,在除 Droid 之外的所有浏览器中,keyup 事件将触发并调用函数GetHints("c", event, fieldName)。在 Droid 上,keyup 事件永远不会触发。

我错过了什么?我的 Droid 上的软键盘或硬键盘上的退格键如何/为什么无法按预期运行?我该如何解决这个问题?

【问题讨论】:

  • 只是在黑暗中拍摄,因为这听起来像一个 android 问题:您是否尝试过 keydown 或 keypress 事件?也许你会有更多的运气。
  • 是的,我会尝试按键而不是按键

标签: javascript jquery android


【解决方案1】:

您可以轮询文本中的更改(使用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.GetHintsevent 做了什么,但显然,您无法使用轮询方法传递它(因为没有触发实际事件)。这是个问题吗?

如果您愿意,可以使用clearInterval(timer); 停止轮询。

您可以保持现有的 keyup 功能不变(以提高响应能力)。或者,您可能希望只进行轮询以避免that.GetHints 被调用过多(例如,如果有人非常快速地输入内容)。

【讨论】:

    猜你喜欢
    • 2011-01-22
    • 2013-06-21
    • 1970-01-01
    • 2016-07-31
    • 2020-08-31
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    相关资源
    最近更新 更多