Как захватить события экранной клавиатуры "keydown" и "keyup" для сенсорных устройств
Я определил события клавиатуры, которые хорошо работают на рабочем столе, но для сенсорных устройств, не получающих экранное событие клавиатуры. Мне нужно захватить, если пользователь печатает. Я использовал следующий сегмент кода:
$('#id').keydown(function(e){
//some code here
});
$('#id').keyup(function(e){
//some code here
})
Я хочу, чтобы код, определенный в keydown
и keyup
, запускался даже для сенсорных устройств (как таблеток, так и мобильных телефонов). Пожалуйста, предложите, как захватить экранное событие клавиатуры и выполнить приведенный выше код.
Ответы
Ответ 1
Вы пытались использовать нажатие клавиши, а не клавишу вниз.
$("#id").keypress(function() {
});
Обновлено:
Из-за проблем с андроидами я теперь обычно обертываю свои проверки следующим образом
if ($.browser.mozilla) {
$("#id").keypress (keyPress);
} else {
$("#id").keydown (keyPress);
}
function keyPress(e){
doSomething;
}
Ответ 2
Один из способов решения этой проблемы - использовать setInterval
, когда keyup
или keydown
события не обнаружены.
var keyUpFired = false;
$('#input').on('keyup',function() {
keyUpFired = true;
// do something
});
if( keyUpFired === false) {
setInterval(function() {
if($('#input').val().length>0) {
// do something
}
},100);
}
Вот небольшой пример использования Materialize
для тестирования сенсорных устройств.
$(document).ready(function() {
var keyUpFired = false;
$('#input').on('keyup',function() {
keyUpFired = true;
if ($('#input').get(0).checkValidity() === true) {
$('label[for="input"]').attr('data-success','Custom Success Message: You typed...'+$(this).val());
} else {
$('label[for="input"]').attr('data-error','Custom Error Message: Username too small');
}
validate_field($('#input'));
});
if( keyUpFired == false) {
setInterval(function() {
if($('#input').val().length>0) {
if ($('#input').get(0).checkValidity() !== false) {
$('label[for="input"]').attr('data-success','Custom Success Message: You typed...'+$('#input').val());
} else {
$('label[for="input"]').attr('data-error','Custom Error Message: Username too small');
}
validate_field($('#input'));
}
},100);
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.97.7/js/materialize.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.97.7/css/materialize.min.css" rel="stylesheet"/>
<div class="row">
<form class="col s12">
<div class="row">
<div class="input-field col s12">
<input placeholder="5-20 characters..." id="input" pattern=".{5,20}" type="text" class="validate">
<label for="input" data-error="wrong" data-success="right">Username</label>
</div>
</div>
</form>
</div>
Ответ 3
Последний ответ на этой странице работает:
Как я могу получить jquery.val() ПОСЛЕ события нажатия клавиши? -
В принципе отмените "keyup" и измените на "input", что-то вроде:
$ (document).delegate('# q', 'input', function (e) {etc}