パーセンテージを小数第二位まで入力できるフォームを作成しています。
###やりたいこと
パーセントを入力するフォームで、整数のパーセントの時は"10"まで、少数点を利用する際は
"10.25"といった形で入力をできるようにしたいです。
少数点がフォームに入力された時点で、maxlengthが"5"に書き換わるような実装を考えています。
桁数にこだわる理由ですが、該当ボタン押下で発火するjavascriptの計算を行う箇所で"100"以上の値を該当箇所を入力した際に、エラーになってしまうからです。
###やってみた
javascript
1 $("#RATE").change(function(){ 2 var element = document.getElementById("RATE"); 3 if(element.value.match(/./)){ 4 element.maxLength = 5 5 } 6 });
html
1 <td><input type="text" name="RATE" id="RATE" maxlength="2" value="" /></td>
上記のプログラムで動作が可能かと思い、設定しましたが該当のフォームからフォーカスが外れた際に動き始め、一度、少数点を入力しフォーカスアウトした後、maxlengthが"5"に書き換わっているようです。
なにかスマートな方法があれば、ご教示いただければと思います。よろしくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答7件
0
桁数にこだわる理由ですが、該当ボタン押下で発火するjavascriptの計算を行う箇所で"100"以上の値を該当箇所を入力した際に、エラーになってしまうからです。
ボタン押下時にvalueを確認し、100以上でない場合のみ計算を実行するような作りに変えてしまった方がよいのではないでしょうか…?
投稿2018/12/21 02:59
編集2018/12/21 03:00総合スコア994
0
maxlength制御よりも、数値範囲で制御する実装が賢い気がします。
HTML
1<input type="number" name="rate1" min="0" max="100">
小数点第三位以降を禁止するなら、正規表現で。
HTML
1<input type="text" name="rate2" pattern="100(.0{1,2})?|\d{1,2}(.\d{1,2})?">
後は文法の問題で「どこまでルーズな記述を許すか」ですが、これも正規表現で調整可能です。
.1
を0.1
として扱う1.
を1
として扱う
Re: takany さん
投稿2018/12/21 04:07
編集2018/12/22 10:12総合スコア18194
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
UI/UX側の意見を言うと、
あまりWebサイトを公開する側が、訪問者に対して「俺様のサイトの挙動に従え!」という姿勢はあまり良くありません。
<input type="number" max="10.99" min="0" step="0.05">
のタグをぽんと設置するか、
右や下に「0〜10.95の数値を入力してください。」みたいな注意書きを併記しておくような作りの方が好ましいでしょう。
そういった意味ではthink49さんの意見とほぼ同様です。
この辺の話はさておき、シンプルに問題に向き合いましょうか。
少数点がフォームに入力された時点で、maxlengthが"5"に書き換わるような実装
これは発想・着眼点は面白いのですが、
10と入力した後のドットがそのままでは捨てられてしまいます。
この捨てられるはずのドットはonkeydownやonkeyupで拾えるんですかね?捨てられるんですかね?(未確認
まぁ捨てられてしまうならmaxlength拡張後に.
を補えば良いですが、
その後ドットが削られたらmaxlengthは当然"2"に戻るんですよね?
ドットが2個に増えた後に1個に減ったら?こんな感じでコードばかり複雑で長くなる筋悪な方針に思えます。
だったら最初からmaxlength="5"
で待ち受け、
oninputあたりで毎回の入力を見張って11以上の数値になった場合、
ドットが含まれていなければ10、含まれているならば10.99
を
input要素へ代入させてしまう作りにしたほうが非常に楽に実装出来るでしょう。
でもこの対応ってまんま<input type="number" max="10.99" min="0" step="0.05">
なんですよね。
input要素のデザインが変わったりするんでしょうか?
よくわからん…やっぱり無駄に思えるんですが色々考えてみてください。
投稿2018/12/21 04:55
編集2018/12/21 05:04総合スコア21398
0
HTML
1<input type="text" name="RATE" pattern="[1-9]?[0-9](.[0-9]{1,2})*" value="" />
投稿2018/12/21 02:57
総合スコア117654
0
ご質問を見る限りだと、フォームのメイン機能(サブミットやサブミット後の計算処理)に関しては別の方が実装していて、そこは関知していないように見受けられましたので、目的のRATE inputのみに絞って回答いたします。
jQueryで実装されているようなのでjQueryで書きますね。これをページにそのまま実装すればおそらく動くはずです。
js
1const $rate = $('#RATE') 2 3let invalid = false 4let validInput 5 6$rate.on('keyup', () => { 7 const input = $rate.val().trim() 8 9 if(input === '' || input.match(/^\-?([1-9]\d?|0)(.\d{1,2})?$/)) { 10 invalid = false 11 validInput = input // 正常入力を保存 12 } else { 13 invalid = true 14 } 15}) 16.on('change', () => { 17 if(invalid) $rate.val(validInput) // 直前の正常入力に補正 18})
動作サンプル: https://codepen.io/kotat/pen/qLjqoK
上記サンプルでは、maxlengthの挙動により近づけることと、フォームのメイン機能とできる限り切り離すために、おかしな値を入力した場合にユーザーに何も通知せずに値を補正しています。
この挙動はユーザビリティ上よろしくないと思いますので、本来であればchangeイベント内の処理は実装せず、異常入力が発生したタイミング(上記JSのif文内にあるinvalid = true
あたり)でユーザーに入力値が正しくない旨をメッセージングして、修正を促す実装が良いかと思います。
投稿2018/12/25 10:49
総合スコア23
0
ベストアンサー
keyup使うのであればこれでできます。
2桁に戻す処理が必要か分からなったので5にするやつだけ。
Javascript
1$('#RATE').keyup(function(e) { 2 if (e.keyCode == 190){ 3 var element = document.getElementById("RATE"); 4 element.maxLength = 5 5 } 6});
投稿2018/12/21 03:15
総合スコア480
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/21 03:51