0

入力フィールドと、数字のみを入力できるようにする正規表現を含むコードがあります

$('input').keyup(function () { 
    this.value = this.value.replace(/[^0-9]/g,'');
}); 

しかし、誰かがフィールドの中央にあるシンボルを編集しようとすると、カーソルがフィールドの最後に配置されます。編集したいシンボル以降のすべてのシンボルを削除する必要があるため、編集が難しくなります。

簡単なデモンストレーション:

http://jsfiddle.net/NehmP/

誰かがそれを修正するのを手伝ってくれますか?

4

4 に答える 4

4

新しい文字列が古い文字列と異なる場合にのみ置き換える必要があります。

$('input').keyup(function () { 
   var v = this.value.replace(/[^0-9]/g,'');
   if (v!=this.value) this.value = v;
}); 

このようにして、値が有効である限り、カーソルは最後に置かれません。

デモンストレーション

于 2013-04-22T13:28:37.413 に答える
0

このコードでは、値が有効でない場合でも、カーソルは単語の最後に置かれません。これは、dystroy のソリューションと、インターネットで見つけたコードを組み合わせたものです。まだ多くの欠陥があり、長すぎると思いますが、それでも誰かを助けることができるかもしれません...皆さんに感謝します:)

function doGetCaretPosition (ctrl) {    
    var CaretPos = 0;
// IE Support
    if (document.selection) {   
        ctrl.focus ();
        var Sel = document.selection.createRange ();    
        Sel.moveStart ('character', -ctrl.value.length);    
        CaretPos = Sel.text.length;
    }
// Firefox support
    else if (ctrl.selectionStart || ctrl.selectionStart == '0'){
        CaretPos = ctrl.selectionStart;
    }
    return (CaretPos);  
}
function setCaretPosition(ctrl, pos){   
    if(ctrl.setSelectionRange){
        ctrl.focus();
        ctrl.setSelectionRange(pos,pos);
    }else if (ctrl.createTextRange) {
        var range = ctrl.createTextRange();
        range.collapse(true);
        range.moveEnd('character', pos);
        range.moveStart('character', pos);
        range.select();
    }
}
var remember;
$('input').keyup(function () { 
    remember = doGetCaretPosition(this);
    var v = this.value.replace(/[^0-9]/g,'');
    if (v!=this.value) {
        this.value = v; 
        setCaretPosition(this,remember - 1)
    };      
})

そしてjsfiddle

于 2013-06-03T11:30:34.920 に答える
-2

誰かの足元から敷物を引っ張ってはいけません。あなたがやろうとしていることは、javascript の範囲を超えており、ブラウザー/オペレーティング システムで処理する必要があります。

テキスト フィールドを誰かに提示する場合、彼らはそこに何でも入力できることを期待します (特定のキーボードを定義できる携帯電話などの特定の状況を除きます)。

状況に応じたメッセージでユーザーに誤った入力を通知し、慣れ親しんだ方法でユーザー自身が修正できるようにする方が、はるかに優れたアプローチです。

入力方法自体に干渉しようとすると、混乱やフラストレーションを引き起こす可能性があります。また、さまざまなデバイスでテストすると、言い表せない癖が生じます。

また、クライアント側の検証は操作できるため、検証はサーバーで実行する必要があります。

クライアント側での検証は、ユーザーの便宜のためにのみ行う必要があります。

于 2013-04-22T13:32:57.017 に答える