我正在尝试编写一个jQuery插件,以防止用户输入超过2位小数的数字。具体做法是:
12
且用户在结尾处输入3
,则应该有效。12.34
且用户在结尾处输入1
,则不会发生任何事情。12.34
且用户在开头输入1
,则应该有效。以下是我遇到的问题:
keypress
,我不知道“建议的新价值”是什么; $(this).val()
是用户按下键之前的值,我不知道用户输入的输入字段在哪里。keyup
,$(this).val()
是新值,但它已经出现在文本输入中。如果它有太多的小数位,我可以擦除它,但它看起来很小。我该怎么做?
答案 0 :(得分:3)
Mebbe这个?
jQuery.fn.limitDecimalPlaces = function(maxPlaces) {
$(this).on('keyup', function(e) {
integer = e.target.value.split('.')[0],
mantissa = e.target.value.split('.')[1];
if (typeof mantissa === 'undefined') {
mantissa = '';
}
if (mantissa.length > maxPlaces) {
e.target.value = integer + '.' + mantissa.substring(0, maxPlaces);
}
});
}
进行测试和工作
答案 1 :(得分:2)
这就是我想出来的。
这个解决方案依赖于其他2个jQuery插件,但无论如何我已经在我的项目中使用了它们。
caret()
的{{1}}函数来确定用户输入框中的输入位置。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);
}