キーを押すたびに、コードはすべてのテキストを完全に置き換え続け、そのたびにキャレットの位置が失われます。
それをしないでください。
押されたキーが次の場合に onkeydown ハンドラーから戻るfalse
space
など、スペースを禁止するためのより良いメカニズムを使用します。
$(function() {
$("input#Username").on("keydown", function (e) {
return e.which !== 32;
});
});
このように、テキストボックスは最初からスペースを受け取ることが禁止されており、テキストを置き換える必要はありません。したがって、キャレットは影響を受けません。
アップデート
@VisioNの適応されたコードkeyup
は、キャレットがまだアクティブなときにテキストボックスの値に影響を与えるtext-replacement-on- ハンドラーを回避しながら、このスペース禁止サポートをコピーアンドペースト操作に追加し
したがって、最終的なコードは次のとおりです。
$(function() {
// "Ban" spaces in username field
$("input#Username").on({
// When a new character was typed in
keydown: function(e) {
// 32 - ASCII for Space;
// `return false` cancels the keypress
if (e.which === 32)
return false;
},
// When spaces managed to "sneak in" via copy/paste
change: function() {
// Regex-remove all spaces in the final value
this.value = this.value.replace(/\s/g, "");
}
// Notice: value replacement only in events
// that already involve the textbox losing
// losing focus, else caret position gets
// mangled.
});
});