// convert the number to it's standard value (kilogram)
standard = parseFloat(unit / from);
// now convert it to the new measurement unit
converted = parseFloat(standard * eval(to));
如果输入小于1的数字,例如“0.234234234”,请尝试通过更改下拉列表转换为新单位。任何小于1的数字,它都会变为零。
知道这里发生了什么吗?
答案 0 :(得分:2)
以下是如何避免eval
并使您的代码更清晰,更明显,希望这有助于理解您的代码错误的原因以及为什么IMO应该回到基础并从评论中的建议开始。您可以从MDN开始。
var units = {
milligram: 1000000,
carrat: 5000,
gram: 1000,
kilogram: 1,
ounce: 35.27399072294044,
pound: 2.2046244201837775,
stone: 0.157473,
ton: 0.001
};
var $input = $('#weight_value');
$('#weight_unit').change(function() {
var from = $input.data('unit'),
to = $(this).val(),
standard = $input.val() / units[ from ],
converted = standard * units[ to ];
$input.val( converted ).data('unit', to);
});
另请注意,我没有使用parseFloat
或parseInt
,我只是利用JavaScript的类型强制。
答案 1 :(得分:2)
虽然错误是由于parseInt()
使用parseFloat()
而导致的,但您的代码还有很多错误的。
eval()
是邪恶的,你正在使用它甚至不需要它,或者可以用一个更好的解决方案轻松替换它。
eval(to)
是不必要的,因为to
已经是一个数字。eval
用于使用字符串来访问全局变量。这是非常糟糕的主意,将单位/值映射存储在对象文字中更合适,例如var units = { gram: 1000, kilogram: 1, ... }
然后,您只需使用字符串即可访问该值作为索引,例如unit["milligram"]
。parseFloat()
,例如unit / from
或standard * to)
from
除外)都是全局的,因为您错过了前面的var
关键字。这里有点"fixed" fiddle。
答案 2 :(得分:0)
将更改代码放在try块中并捕获异常以查看错误。
您可以使用选择列表中的值选项来存储来自通用转换单元的转换单元。
答案 3 :(得分:0)
实际上没有抛出任何错误..
您描述的具体问题是因为您执行
unit = parseInt($('#weight_value').val());
因此,如果值介于0和1之间,则变为0.将其更改为
unit = parseFloat($('#weight_value').val());
除此之外,还有无效的html(就像自我关闭select
标记并且公开地离开label
),你正在使用eval
你真的不应该(在评论中解释/强调)