数値を含む基本的なHTML _<input type="text"/>
_テキストフィールドを使用しています。
JavaScriptイベントkeyup
を追加して、ユーザーが上矢印キー(_e.which == 38
_)を押したときを確認します。次に、数値を増やします。
コードは問題なく機能しますが、バグが1つあります。上矢印キーを押すと、Safari/MacとFirefox/Macの両方が最初にカーソルを移動します。これは、私が知る限り、すべての_<input type="text"/>
_テキストフィールドのデフォルトの動作であり、意味があります。
しかし、これはカーソルが前後にジャンプすることによる非常に審美的な効果を生み出しません(値が変更された後)。
最初のジャンプはkeydown
で発生しますが、この知識があっても発生を防ぐことはできません。私は以下を試しました:
_input.addEventListener('keydown', function(e) {
e.preventDefault();
}, false);
_
keyup
イベントにe.preventDefault()
を配置しても効果はありません。
カーソルが動かないようにする方法はありますか?
カーソル位置を保持するには、バックアップinput.selectionStart
値を変更する前。
問題は、WebKitがkeydown
に反応し、Operaがkeypress
を優先することです。そのため、どちらも処理されてスロットルされます。
var ignoreKey = false;
var handler = function(e)
{
if (ignoreKey)
{
e.preventDefault();
return;
}
if (e.keyCode == 38 || e.keyCode == 40)
{
var pos = this.selectionStart;
this.value = (e.keyCode == 38?1:-1)+parseInt(this.value,10);
this.selectionStart = pos; this.selectionEnd = pos;
ignoreKey = true; setTimeout(function(){ignoreKey=false},1);
e.preventDefault();
}
};
input.addEventListener('keydown',handler,false);
input.addEventListener('keypress',handler,false);
より良い解決策はreturn false;
デフォルトの矢印キーの動作を防止するには:
input.addEventListener("keydown", function(e) {
if (e.key === 'ArrowUp' || e.key === 'ArrowDown') return false;
}, false);
実際には、この仕事を行うためのより良い、より簡単な方法があります。
$('input').bind('keydown', function(e){
if(e.keyCode == '38' || e.keyCode == '40'){
e.preventDefault();
}
});
はい、とても簡単です!
私はコードをテストしましたが、イベントをキャンセルするようですが、非常に短い間矢印を押さないと、キープレスイベントが発生し、そのイベントが実際にカーソルを移動します。キープレスイベントハンドラーでもpreventDefault()を使用するだけで問題ありません。