【问题标题】:Capture backspace key press in BlackBerry with jQueryMobile使用 jQueryMobile 在 BlackBerry 中捕获退格键按下
【发布时间】:2012-05-25 19:06:18
【问题描述】:

有没有办法在 BlackBerry 中捕获 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>

【问题讨论】:

  • 这个答案可能是你想要的:stackoverflow.com/questions/942037/…
  • 感谢您的链接,但我想要的是使用 Javascript 捕获事件,因为我不是为 Blackberry 编写本机应用程序。在我的情况下,按退格键不会触发任何事件(不是keypress,也不是keydown 或keyup)。

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


【解决方案1】:

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

当按下退格键时,黑莓浏览器中的input 或textarea 元素将不会触发keyup 和keydown 事件。但是,它将在事件处理程序绑定到document时被触发:

$("#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(模拟器),两者都会触发 keydown 和keyup 退格键的事件。

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

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

  • 您可以找到一个工作示例here,但对于移动设备测试,加载embedded version 会更快。

【讨论】:

  • 一个非常有趣的解决方法。我之前不知道input 事件。非常感谢你这么详细的回答! :-)
  • @Pablo - 不客气 :) 我在 Blackberry 上为这个问题苦苦挣扎了两天。当我有时间尝试解决输入为空时按退格键不会触发事件的问题时,我将继续使用它,但对于我目前的目的,所描述的解决方法就足够了。
【解决方案2】:

以下代码,工作正常。你可以在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')
            });
        }

see detail

【讨论】:

  • 它不起作用。我已经测试过了。不是keypress,也不是keyup 或keydown 捕获黑莓模拟器9800 中按退格键的事件。
  • 我已经更新了代码,并在 jsfiddle 上分享了一个演示,如果它也不起作用,分享更多你的代码,我可以看到。
  • 正如您所解释的,它可以在 Chrome 上运行,但不幸的是它不能在 BlackBerry 模拟器上运行(我从 BlackBerry 浏览器打开了指向 jsfiddle 的链接,但它没有捕获退格键)。我尝试了一个与您类似的非常简单的页面。我已经编辑了添加代码的问题。
  • 没关系,如果你在 Chrome 上测试它,它应该可以在 BlackBerry OS6 上工作!
  • 感谢您的帮助,但这似乎只适用于 WebWorks 应用程序,这不是我的情况。当我包含您的代码时,它似乎无法识别 blackberry Javascript 变量。除此之外,没有 KEY_BACKSPACE 或 KEY_DEL(只有 KEY_BACK),所以我认为它没有映射。
【解决方案3】:

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

【讨论】:

  • 我测试了您的代码,但不幸的是,与 CoDe aDDict 答案中的第一个代码一样,按下退格键不会像其他人那样触发任何键事件。按下该键时不会打印任何代码。
  • 似乎只有 Blackberry 6 存在此问题。我已经在 5、6 和 7 上进行了测试。请参阅我的答案以了解解决方法。
【解决方案4】:

在一般浏览器中无法做到这一点。

使用 JavaScript 跟踪返回键事件的唯一方法是使用 使用@987654321@ API 的小部件/WebWorks 应用程序。

【讨论】:

  • 谢谢,但正如我在第一个答案中回答的那样,我不是在开发 WebWorks 应用程序,除此之外,退格键似乎没有被映射。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
相关资源
最近更新 更多