web-dev-qa-db-ja.com

タッチデバイスのオンスクリーンキーボードの「keydown」および「keyup」イベントをキャプチャする方法

デスクトップでは正常に機能するキーボードイベントを定義しましたが、タッチデバイスではオンスクリーンキーボードイベントを取得しません。ユーザーが入力しているかどうかをキャプチャする必要があります。私は次のコードセグメントを使用しました:

$('#id').keydown(function(e){
  //some code here
});

$('#id').keyup(function(e){
  //some code here
})

keydownkeyupで定義されたコードが、タッチデバイス(タブレットとモバイルの両方)でもトリガーされるようにしたい。画面上のキーボードイベントをキャプチャし、上記のコードを実行する方法を提案してください。

15
user850234

キーダウンの代わりにキープレスを使用してみましたか

$("#id").keypress(function() {

});

更新しました :

Androidの問題により、通常はこのようにチェックをラップします

if ($.browser.mozilla) {
    $("#id").keypress (keyPress);
} else {
    $("#id").keydown (keyPress);
}

function keyPress(e){
    doSomething;
}
15
Dominic Green

これを解決する1つの方法は、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>
1
Peter Darmis