-3
// 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));

http://jsfiddle.net/zeByX/23/

如果您输入小于 1 的数字,例如“0.234234234”并尝试通过更改下拉列表转换为新单位。任何小于 1 的数字都会归零。

知道这里发生了什么吗?

4

4 回答 4

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);

});

另请注意,我没有使用parseFloator parseInt,我只是利用 JavaScript 的类型强制。

​演示 :http: //jsfiddle.net/zeByX/30/

于 2012-12-27T23:36:22.887 回答
2

尽管错误是由于使用parseInt()where you should have used引起的parseFloat(),但您的代码还有很多错误

  • eval()是邪恶的,并且您在甚至不需要它的地方使用它,或者可以轻松地用更好的解决方案替换它。
    • eval(to)是不必要的,因为to已经是一个数字。
    • 在其他情况下,eval用于使用字符串来访问全局变量。这是一个非常糟糕的主意,将您的单位/值映射存储在对象文字中更为合适,例如var units = { gram: 1000, kilogram: 1, ... },您可以通过简单地使用字符串作为索引来访问该值,例如unit["milligram"].
  • 当您已经有一个数字时,您不需要parseFloat(),例如 withunit / fromstandard * to)
  • 函数中的所有变量声明( from 除外from)都是全局的,因为您缺少var前面的关键字。

这是一个有点“固定”的小提琴

于 2012-12-27T23:38:11.453 回答
0

将更改代码放在 try 块中并捕获异常以查看问题所在。

您可以使用选择列表上的值选项来存储来自通用转换单位的转换单位。

于 2012-12-27T23:20:29.513 回答
0

实际上没有抛出错误..


您描述的具体问题发生是因为您这样做

unit = parseInt($('#weight_value').val());

因此,如果一个值介于 0 和 1 之间,它将变为 0。将其更改为

unit = parseFloat($('#weight_value').val());

除此之外,还有无效的 html(如自闭合select标签和公开离开label),您正在使用eval您确实不应该使用的 html(如评论中解释/强调的那样

于 2012-12-27T23:20:49.027 回答