私の目的のために働く解決策
これが私が思いついたものです。
長所
- 過剰な小数点以下の桁数はまったく表示されません(表示されてすぐに消去されるのとは対照的です)
- ユーザーは複数の小数点以下を入力することもできません
短所
このソリューションは、この中の他の2つのjQueryプラグインに依存していますが、とにかくプロジェクトにすでに含まれています。
caret()
の一部である関数を使用してjQuery.maskedInput
、ユーザーが入力ボックスのどこに入力しているかを判別しています。
- 私はすでに
jQuery.keyfilter
この入力を使用して、とのみ1-9
を入力できるよう.
にしています。(ただし、個々のキーストロークのみが考慮され、結果の入力内容は考慮されません。)
コード
jQuery.fn.limitDecimalPlaces = function (maxPlacesArg) {
$(this).each(function() {
var maxPlaces, presetValue;
if (maxPlacesArg) {
maxPlaces = maxPlacesArg;
} else {
presetValue = $(this).attr('value');
// If the value attribute has a decimal in it...
if (presetValue.indexOf('.') !== -1) {
// ... assume it has the correct number of places
maxPlaces = presetValue.split('.')[1].length;
} else {
// Sensible default
maxPlaces = 2;
}
}
$(this).bind("keypress", function(e) {
var currentVal, cursorIsAfterDecimal, hasMaxDecimalPlaces, inputHasDecimal, keystrokeIsDecimal;
currentVal = $(this).val();
inputHasDecimal = currentVal.indexOf('.') !== -1;
if (inputHasDecimal) {
// Booleans
keystrokeIsDecimal = String.fromCharCode(e.which) === '.';
hasMaxDecimalPlaces = athena.format.hasNDecimalPlaces(currentVal, maxPlaces);
cursorIsAfterDecimal = ($(this).caret().begin) > (currentVal.lastIndexOf('.'));
if (keystrokeIsDecimal || (hasMaxDecimalPlaces && cursorIsAfterDecimal)) {
e.preventDefault();
}
}
});
});
return $(this);
}
サポート機能:
hasNDecimalPlaces = function (number, places) {
fixed = parseFloat(number).toFixed(places);
return number.toString() === fixed;
};