如何使用jQuery防止用户键入过多的小数点?
我正在尝试编写一个jQuery插件,以防止用户键入超过2位小数的数字。具体而言:如何使用jQuery防止用户键入过多的小数点?,jquery,Jquery,我正在尝试编写一个jQuery插件,以防止用户键入超过2位小数的数字。具体而言: 如果一个输入包含12,并且用户在最后键入3,则它应该可以工作 如果输入包含12.34,并且用户在末尾键入1,不应发生任何事情 如果输入包含12.34,并且用户在开始时键入1,则该输入应该可以工作 以下是我遇到的问题: 如果我绑定到按键,我不知道“建议的新值”是什么$(this).val()是用户按键前的值,我不知道用户在输入字段中键入的位置 如果绑定到keyup,$(this).val()是新值,但它已经出现
- 如果一个输入包含
,并且用户在最后键入12
,则它应该可以工作3
- 如果输入包含
,并且用户在末尾键入12.34
,不应发生任何事情1
- 如果输入包含
,并且用户在开始时键入12.34
,则该输入应该可以工作1
- 如果我绑定到
,我不知道“建议的新值”是什么按键
是用户按键前的值,我不知道用户在输入字段中键入的位置$(this).val()
- 如果绑定到
,keyup
是新值,但它已经出现在文本输入中。如果小数点太多,我可以删除它,但它看起来有问题$(this).val()
- 小数点过多的地方根本不会出现(与出现并立即擦除相反)
- 用户也不能输入多个小数
- 我正在使用
中的jQuery.maskedInput
函数来确定用户在输入框中键入的位置caret()
- 我已经在此输入上使用了
,以确保只允许在其中键入jQuery.keyfilter
和1-9
。(不过,它只考虑单个按键,而不考虑结果输入内容。)
hasNDecimalPlaces = function (number, places) {
fixed = parseFloat(number).toFixed(places);
return number.toString() === fixed;
};
这是我的吗
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);
}
});
}
在进行测试和工作时,您是否尝试过
onkeydown
?@Ryan-是的,但我看不出keydown
在这方面与keypress
有什么不同。如果我按下一个键,keydown
继续启动,但keypress
只启动一次;这就是我所能看到的不同之处。这可以接受吗@ŠimeVidas-让我输入12.34
并按住5
;只有当我放手时,5
s才会消失。我还可以键入12.34.56…..7
@NathanLong,这是因为处理程序在keyup上触发了-这就是为什么我问演示是否可以接受。关于这两点,演示不会阻止您输入非数值。例如,您还可以键入ABC…
。在你的问题中,你写了“禁止用户键入数字…”。您没有说明也应该禁止输入非数值。如果您有23.45
,并且用户在开始时键入1
,会发生什么情况?没有异常。以2的maxPlaces
为例,小数点距离字符串的末尾还有两位数,因此允许用户将1添加到字符串的开头。如果将其添加到末尾,则会失败,因为这会将小数点位置移离字符串末尾的距离超过maxPlaces
。在这里进行测试--当我指定2时,我可以输入3个小数点位置,一旦我这样做,在删除小数点右侧的一个字符之前,我无法添加小数点左侧的任何内容。皮特-希望您不介意我的编辑;我结合了你的插件和你更新的代码。接受你的答案,因为它比我的简单。有两个缺点:1)在被擦除之前,额外的小数位会立即出现2)如果我有12.45
并在小数位之后输入3
,则5
会被擦除(而不是3
)。不过,我认为这些都是简单的折衷办法,可能是比我更好的一般案例解决方案。另外,谢谢你教我“尾数”这个词。我只想一遍又一遍地说。“尾数,伙计……蒂萨。”:)
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);
}
});
}