3

重複の可能性:
keydown イベントの新しい値

私が探していた答えが見つからず、しばらく試してみましたが、必死になりました:

私の目標は、10 進数で、文字である 1 文字の接尾辞を持つことができる数値の非負の入力フィールドを持つことです (legel 接尾辞コレクションが存在します)。

技術的なレベルでは、入力文字を拒否できるようにする必要があり、両方の値 (入力の前後) が必要です。

私が試して失敗したアプローチ:

Keydown \ Keypress イベント:

「後」を取得することはできません。前と char/KeyCode だけです。新しい文字を古い値に挿入する場所がわからないため(必ずしも最後ではありません..)、これは問題です-「後」または少なくとも文字が属するインデックスを取得する方法が必要です。

キーアップ イベント:

前の値はありませんが、さらに悪いことに、これは長押し (「00000000000000000...」) があると起動しないため、入力を拒否できません。

OnChange/change/blur - 必要な機能ではなく、フォーカスを失ったときにのみ起動します。

何か案は?

4

3 に答える 3

1

現在の値を隠しフィールドに保存し、必要に応じて更新する非常に野蛮な方法はどうですか?これにより、「前」と「後」の状態にアクセスできるようになります。

これは素晴らしいアプローチではありませんが、以前の値を取得することはほぼ不可能であることを考えると、私はそれを検討します。

于 2012-12-19T13:18:00.253 に答える
0

onkeypressその後の値がどうなるかを知ることはまったく不可能です。はい、押されたキー (およびモディファイア) と選択/カーソルがわかっているので、何が起こるか、およびイベントpreventDefaultActionをシミュレートできます。keypressしかし、キーボード レイアウトについては間違っている可能性があると想定しており、非常に多くの特殊な入力方法があり、すべてを処理することはほとんどできません。

私が思いついた解決策は、入力の状態を手動で維持し、できるだけ頻繁に変更を探すことです。発生した場合、ハンドラーは前と後の状態で起動され、新しい値を返します。これは次のようになります。

function handler(afterval, prevval) {
    // do something
    return afterval; // return val can be used for length limits etc
}
(function(el, handler) {
    var curval = el.value;
    function check(e) {
        if (el.value != curval)
            curval = el.value = handler(el.value, curval);
    }
    $(el)
      .on("keyup input keydown change mouseup cut paste focus", check)
      .on("keypress", function(e) {
        check(e);
        setTimeout(check, 0); // also check after keypress as soon as possible
      });
})(handler);
于 2012-12-19T13:14:43.260 に答える
0

私はむしろあなたを別の方向に向けたいと思います。以前のプロジェクトでは、同じ問題がありました。jQueryプラグインを使用して解決しました。いわゆる「マスク入力」。

次に、そのフィールドへの入力をユーザーがどのように行うべきかについて、正規表現を与えることができます。

これはプラグインの GitHup リソースです! https://github.com/digitalBush/jquery.maskedinput

ここで例とドキュメントを見つけることができます!

例:

jQuery(function($){
    $("#element-id").mask("9.99a");
});

多くのオプションが利用可能です。独自のマスクを作成する機能をチェックしてください!

于 2012-12-19T13:04:10.737 に答える