Захватить нажатие клавиши Backspace в BlackBerry с помощью jQueryMobile

Есть ли способ захватить нажатие клавиши возврата на input[type="text"] в BlackBerry? Я пробовал с $('input[type="text"]').bind('keydown', function(event) { ... }); и он фиксирует все события нажатия клавиш, кроме одного для возврата (del). Нажатие на эту клавишу не запускает ни одного ключевого события.

Кто-нибудь знает способ запечатлеть событие?

Я занимаюсь разработкой для OS 6.0 и тестирую с помощью симулятора BlackBerry 9800.

EDITED - код, который я тестирую

<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 ответа

Решение

Я только что столкнулся с этим раздражением и нашел этот вопрос в своем поиске ответов, так что вот подробности моего исследования и решения (ну, обходной путь).

keyup а также keydown события просто не будут вызваны input или же textarea элементы в браузере Blackberry при нажатии клавиши возврата. Это будет, однако, срабатывать, когда обработчик события привязан к document:

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

Почему это так, я понятия не имею. keyup событие должно пузыриться, и оно происходит, но поскольку оно даже не срабатывает при нажатии клавиши возврата, это не очень полезно.

Однако в нашем распоряжении есть еще одно событие. input Событие поддерживается браузером Blackberry и корректно запускается каждый раз, когда изменяется значение элемента (в том числе, к счастью для нас, когда это изменение вызвано нажатием клавиши возврата).

Таким образом, мы можем обойти проблему, привязав обработчики событий к обоим 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);

Некоторые заметки:

  • Насколько я могу судить, это проблема только в браузере на Blackberry 6. Я протестировал Blackberry 5 (физическое устройство и симулятор) и 7 (симулятор), и оба будут запускать keydown а также keyup события для клавиши возврата.

  • Это "исправление" работает практически во всех браузерах, в которых я его тестировал (так что вы можете использовать его для правильной поддержки Blackberry 6, не ломая другие браузеры), за исключением Opera Mobile (протестирована в версии 12), которая по каким-то причинам любит запускать input событие дважды иногда.

  • Это позволяет обнаруживать нажатия на клавишу возврата только при наличии текста на входе для удаления (в противном случае input событие не срабатывает). Это, вероятно, самый большой недостаток сценария.

  • Вы можете найти рабочий пример здесь, но для тестирования мобильных устройств быстрее загружать встроенную версию.

Следующий код, работает нормально. Вы можете увидеть это на jsfiddle. проверил это на хром

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

для использования Blackberry

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

см детали

Вы можете использовать этот http://jsbin.com/ezucen/13/ чтобы увидеть, какой код ключа вы получаете обратно. На BlackBerry 9900 7.1 я получаю код ключа 8.

Нет способа сделать это в обычном браузере.

Единственный способ отследить событие возврата ключа с помощью JavaScript - это использовать приложение Widget/WebWorks, используя KEY_BACK API.

Другие вопросы по тегам