8

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>
4

4 回答 4

6

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

当按下退格键时,不会在黑莓浏览器中的or元素上触发keyupand事件。但是,它将事件处理程序绑定到时触发:keydowninputtextareadocument

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

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

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

因此,我们可以通过将事件处理程序绑定到keydown和来解决问题input。该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事件。

  • 这个“修复”几乎适用于我测试过的每一个浏览器(所以你可以使用它来正确支持 Blackberry 6 而不会破坏其他浏览器)除了 Opera Mobile(在版本 12 中测试),它出于某种原因喜欢触发input事件有时两次。

  • 这仅允许您在输入中有要删除的文本时检测退格键(否则input事件不会触发)。这可能是剧本最大的败笔。

  • 您可以在此处找到一个工作示例,但对于移动设备测试,加载嵌入式版本会更快。

于 2012-09-13T15:22:18.453 回答
4

以下代码,工作正常。你可以在jsfiddle上看到它。在 chrome 上测试它

$(document).ready(function() { 
$('input[type="text"]').bind('keydown', function(e){
    if(e.keyCode == 8)
        alert('backspace trapped')
     });
   });​

黑莓使用

function captureBackButton() {
            blackberry.system.event.onHardwareKey(blackberry.system.event.KEY_BACK,
            function() {
             alert('Backspace Pressed')
            });
        }

查看详情

于 2012-05-18T07:54:39.207 回答
1

您可以使用此http://jsbin.com/ezucen/13/查看您返回键码。在 BlackBerry 9900 7.1 上,我得到了 keyCode 8。

于 2012-05-31T15:08:15.047 回答
1

在一般浏览器中没有办法做到这一点。

使用 JavaScript 跟踪返回键事件的唯一方法是使用使用KEY_BACKAPI 的 Widget/WebWorks 应用程序。

于 2012-05-31T23:24:03.510 回答