-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

parseInt()エラーは、使用すべき場所の使用法が原因で発生しますが、コードにはparseFloat()さらに多くの問題があります。

  • eval()は悪であり、あなたはそれを必要としないか、はるかに優れたソリューションに簡単に置き換えることができる場所でそれを使用しています。
    • eval(to)toすでに数字なので不要です。
    • その他の場合evalは、文字列を使用してグローバル変数にアクセスするために使用されます。これは非常に悪い考えであり、ユニット/値のマッピングを次のようなオブジェクトリテラルに格納する方がはるかに適切var units = { gram: 1000, kilogram: 1, ... }です。次に、のように文字列をインデックスとして使用するだけで値にアクセスできますunit["milligram"]
  • withやparseFloat()などの番号がすでにある場合は必要ありませんunit / fromstandard * to)
  • 前のキーワードfromが欠落しているため、関数内のすべての変数宣言(fromを除く)はグローバルです。var

これはやや「修正された」フィドルです。

于 2012-12-27T23:38:11.453 に答える
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の型強制を利用しているだけです。

デモ : http: //jsfiddle.net/zeByX/30/

于 2012-12-27T23:36:22.887 に答える
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すべきではありません(コメントで説明/強調されているように

于 2012-12-27T23:20:49.027 に答える