8

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

Кто-нибудь знает способ захвата события?

Я занимаюсь разработкой для 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> 
+0

Этот ответ может быть, что вы хотите: http://stackoverflow.com/questions/942037/how-do-i-detect-the-delete-key-in-my-field-subclass – Kannika

+0

Спасибо за ссылку, но я хочу, чтобы захватить событие с помощью Javascript, так как я не программирую собственное приложение для Blackberry. В моем случае нажатие клавиши backspace не запускает какое-либо событие (не 'keypress', не' keydown' или 'keyup'). – Pablo

ответ

6

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

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

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

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

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

Таким образом, мы можем решить проблему путем привязки обработчиков событий к 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 для ключевого слова backspace.

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

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

  • Рабочий стол here, но для тестирования мобильных устройств он быстрее загружает embedded version.

+0

Очень интересное обходное решение. Раньше я не знал о событии 'input'. Большое спасибо за такой подробный ответ! :-) – Pablo

+0

@Pablo - Добро пожаловать :) Я боролся с этой проблемой на Blackberry в течение большей части 2 дней.Я собираюсь продолжать играть с ним, когда у меня найдется время, чтобы попытаться решить проблему, которая нажимает backspace, когда вход пуст, не запускает событие, но для моих текущих целей описанное обходное решение было достаточным. –

4

следующий код работает отлично. вы можете увидеть его на 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') 
      }); 
     } 

see detail

+0

Не работает. Я уже тестировал его. Не 'keypress', ни' keyup', либо 'keydown' не фиксируют событие нажатия клавиши backspace в симуляторе BlackBerry 9800. – Pablo

+0

Я обновил код и поделился демоверсией также на jsfiddle, если он также не работает, поделитесь больше вашего кода, который я вижу. – Rab

+1

Он работает на Chrome, как вы объяснили, но, к сожалению, он не работает на симуляторе BlackBerry (я открыл ссылку на jsfiddle из браузера BlackBerry, и он не фиксирует обратную печать). Я пробовал с очень простой страницей, подобной вашей. Я редактировал вопрос, добавляя код. – Pablo

1

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

+0

Я протестировал ваш код, но, к сожалению, как и первый код в ответе CoDe aDDict, нажатие клавиши backspace не запускает какое-либо ключевое событие, как это делают другие. При нажатии этой клавиши код не печатается. – Pablo

+0

Это только Blackberry 6, похоже, эта проблема. Я тестировал 5, 6 и 7. См. Мой ответ об обходном пути. –

1

В общем браузере нет возможности выполнить это.

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

+0

Спасибо, но, как я ответил в первом ответе, я не разрабатываю приложение WebWorks, и, кроме того, ключ backspace не отображается. – Pablo