jquery-mobile - 使用 jQueryMobile 在 BlackBerry 中捕获退格键按下

标签 jquery-mobile blackberry keyevent blackberry-simulator jquery-events

有没有办法捕获 input[type="text"] 上的退格键按下?在黑莓?我试过 $('input[type="text"]').bind('keydown', function(event) { ... });它会捕获除退格键 (del) 之外的所有按键事件。按下此键不会触发任何键事件。

有谁知道捕捉事件的方法?

我正在为 OS 6.0 开发并使用 BlackBerry 模拟器 9800 进行测试。

已编辑 - 我正在测试的代码

<div id="myPage" data-role="page" data-theme="b">

  <div data-role="content">  
    <input type="text"  id="ddd" />
  </div>

  <script type="text/javascript">
    $('input[type="text"]').bind('keydown', function(e){
      if(e.keyCode == 8)
        alert('backspace trapped')
    });
  </script>

</div>

最佳答案

我刚刚遇到了这种烦恼,并在寻找答案时发现了这个问题,所以这里是我的调查和解决方案的详细信息(嗯,解决方法)。

当按下退格键时,黑莓浏览器中的 keyupkeydown 元素将不会触发 inputtextarea 事件。但是,当事件处理程序绑定(bind)到 document 时,它将被触发:

$("#myInput").keydown(someFn); //Will not fire for backspace
$(document).keyup(someFn); //Will fire for backspace

为什么会这样,我完全不知道。 keyup 事件应该冒泡,确实如此,但由于按下退格键时它甚至不会触发,所以没有多大用处。

但是,我们还有另一个事件可供使用。黑莓浏览器支持 input 事件,并在元素值发生变化时正确触发(幸运的是,当该变化是由于按下退格键时)。

因此,我们可以通过将事件处理程序绑定(bind)到 keydowninput 来解决这个问题。 keydown 事件将在 input 之前触发,除非按下退格键,在这种情况下 keydown 不会触发。所以我们可以很容易地跟踪它:
function handler(e) {
    if (e.keyCode === 8) {
        alert("Backspace!"); //Backspace was pressed :)
    }
}

var elem = document.getElementById("example");
elem.addEventListener("keydown", function (e) { //Bind to keydown event
    this.keydownFired = true; //Remember that keydown fired in expando property
    handler.call(this, e); //Call the event handler
}, false)
elem.addEventListener("input", function (e) { //Bind to input event
    if (!this.keydownFired) { //Keydown didn't fire, must have pressed backspace
        e.keyCode = 8; //Fix the event object
        handler.call(this, e); //Call the event handler
    }
    delete this.keydownFired; //Clean up so we can handle next key press
}, false);

一些注意事项:
  • 据我所知,这只是黑莓 6 浏览器中的一个问题。我已经测试了黑莓 5(物理设备和模拟器)和 7(模拟器),两者都会触发退格键的 keydownkeyup 事件。
  • 这个“修复”几乎适用于我测试过的每一个浏览器(所以你可以用它来正确支持黑莓 6 而不会破坏其他浏览器)除了 Opera Mobile(在版本 12 中测试),它出于某种原因喜欢触发input 事件有时会发生两次。
  • 这仅允许您在输入中有要删除的文本时检测退格键(否则不会触发 input 事件)。这可能是剧本最大的败笔。
  • 您可以找到一个工作示例 here ,但对于移动设备测试,加载 embedded version 会更快。
  • 关于jquery-mobile - 使用 jQueryMobile 在 BlackBerry 中捕获退格键按下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10648700/

    相关文章:

    jquery - 使用 jquery mobile 更改字体系列

    css - 在 Jquery Mobile 中禁用的输入字段不使用 CSS 更改文本颜色

    html - 绝对位置在黑莓移动应用程序中不起作用

    Java 机器人类按键

    jquery-mobile - 如何使用 jquery mobile 创建 100% 高度的 div?

    移动网站背景图片的CSS

    java - 这是地道的Java吗?

    blackberry - 运行 blackberry webworks 项目时,.cod 数据部分变大

    java - 当键盘输入与字母匹配时,使字母/数字消失

    animation - JavaFX : How to detect if a key is being held down?