Захватить нажатие клавиши 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.