2009-07-03 10 views
26

私は基本的なHTML <input type="text"/>テキストフィールドを数値で扱っています。矢印を押しながらテキスト入力のデフォルト動作を防止する

JavaScriptイベントkeyupを追加して、ユーザーが矢印の上向きキー(e.which == 38)を押したときを確認してから、数値を増やします。

コードはうまく動作しますが、バグが1つあります。 Safari/MacとFirefox/Macの両方が、矢印の上向きのキーを押しているときにカーソルを最初に移動します。これはすべての<input type="text"/>テキストフィールドの既定の動作です。これは私が知る限り意味があります。

しかし、カーソルの前後のジャンプ(値が変更された後)の美的効果はあまりありません。

最初のジャンプは​​に起こりますが、この知識があっても発生を防ぐことはできません。私は、次のことを試してみました:keyupイベントでe.preventDefault()を置く

input.addEventListener('keydown', function(e) { 
    e.preventDefault(); 
}, false); 

はどちらか助けていません。

カーソルが動かないようにする方法はありますか?

答えて

27

カーソル位置を保持するには、値を変更する前にinput.selectionStartをバックアップします。

問題は、WebKitが​​に反応し、Operaがkeypressを好むので、kludgeがあります。両方が処理され、抑制されます。

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); 
+1

それを倒せ!ありがとう、それは完璧です。 :) – riddle

+0

"kludge"への投票がアップしました!私のために働いた、答えのおかげで。 – NotJay

-1

おそらくそうではありません。代わりに、カーソルを元のフィールドの最後に戻すソリューションを探してください。この効果は、人間が知覚するには速すぎるので、ユーザにとっては同じであろう。

私はグーグルでこのコードを見つけました。私は今それをテストすることはできませんし、それはIE 6で動作しないと言われています。

textBox.setSelectionRange(textBox.value.length、textBox.value.length);

+1

ありがとうございました。実際にinput.valueを更新すると、最後にカーソルが戻ってきます。だから、私はカーソルの位置を検出し、変更が行われた後にそれを復元するかもしれません(例えば数字の真中にある場合)。 しかし、私はまだ解決策が見つかっています。 – riddle

0

私はコードをテストしたが、それはイベントをキャンセルするようだが、非常に短時間矢印を押していないと、キー入力イベントが発生し、そのイベントは実際にカーソルを移動する。 keypressイベントハンドラでもpreventDefault()を使用するだけで問題ありません。

+0

残念ながら、 'keypress'イベント中の' e.preventDefault() 'はそこに何も入力できないようにしました(私は入力をFirebugのように動作させたい)。そして、少なくとも私のブラウザでは、私の問題を解決することはできません - カーソルはまだまだ始まりにジャンプします。 – riddle

13

私はよりよい解決策は、デフォルトの矢印キーの動作を防ぐために、ちょうどreturn false;にあることがわかった。

input.addEventListener("keydown", function(e) { 
    if (e.keyCode === 38 || e.keyCode === 40) return false; 
}, false); 
+0

ありがとうございました。その考え方は、keyupの代わりにkeydownイベントを使用することです。 –

+4

右keydownはトリックです。 falseを返すと、イベントの伝播が完全に停止するように見えますが、 'preventDefault()'は入力ボックスにイベントを無視させますが、他のリスナーはそれを処理することができます。 – CmdrMoozy

+2

@ Lukas、あなたのソリューションは私にとって最も効果的でした。しかし、 'false'を返す代わりに、' e.preventDefault(); 'を呼び出しています。後者は、上向きのキーの動作の凍結を達成しませんでした。別の簡単な解決策を投稿してくれてありがとう。 –

4

実は、この仕事を行うには良いと簡単な方法があります。

$('input').bind('keydown', function(e){ 
    if(e.keyCode == '38' || e.keyCode == '40'){ 
     e.preventDefault(); 
    } 
}); 

はい、とても簡単です!

+0

あなたは英雄です。おかげで – zeeks

+0

ありがとう、それは仕事をした –

+0

あなたはこの問題を扱う支出時間から私を救った、ありがとう! –

関連する問題