适合我的目的的解决方案
这就是我想出的。
优点
- 多余的小数位根本不出现(与出现并立即被删除相反)
- 用户也不能输入多个小数
缺点
此解决方案依赖于其中的 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;
};