我有一个脚本,我可以在一个文本框中放入一个数字,它将计算其他文本框中的等价物。
$("input[type=text]").keyup(function () {
var number = parseFloat($(this).val());
var inc = parseFloat($(this).attr("inc"));
var newValue = number / inc;
$("input[type=text]").each(function () {
if(isNaN(newValue * parseFloat($(this).attr("inc"))))
$(this).val(0);
else
$(this).val(newValue * parseFloat($(this).attr("inc")));
});
});
可以查看:JSFiddle Here
目前它不允许使用十进制数字。但我真的需要它。我不知道如何允许小数。
此外,我需要盒子的小数点数限制为2位数。
答案 0 :(得分:1)
TL; DR: 如果您只想修复,请跳至实际代码。以下段落解释了为什么会发生这种情况。
十进制数不起作用的原因是每次单个字符编辑文本框时,所有文本框中的所有数字都将转换为浮点数。如果您在其中一个框中键入1
,则该值会传递到parseFloat
并转换为1
(相同的值)。如果您再按3
字符,则文本框会显示13
,该文本框会传递到parseFloat
并返回相同的值13
。
但是,如果您开始输入13.
,则会传递给parseFloat
; JavaScript意识到句点是不必要的*
,并将值13
放在文本框中。无论你输入的速度有多快,JavaScript都会一直想要删除那个“不必要”的时期,然后再添加额外的数字。
您可以通过仅运行parseFloat
函数(或以任何方式更改值)对您当前未输入的文本字段进行解决。我强调了两行哪个“魔术发生”:
$("input[type=text]").keyup(function () {
var number = parseFloat($(this).val());
var inc = parseFloat($(this).attr("inc"));
var newValue = number / inc;
var current = this; // <---- "current" is the text field that is currently being edited
$("input[type=text]").each(function () {
if(this != current) { // <--------------
if (isNaN(newValue * parseFloat($(this).attr("inc"))))
$(this).val(0);
else
$(this).val(newValue * parseFloat($(this).attr("inc")));
}
});
});
代码的JS小提琴,以便您可以测试它:http://jsfiddle.net/RX2sL/27/
*
技术上由于String -> Float -> String
转换而缩短了期限,但更容易将期间视为“不必要”。