2

問題:

部分的に機能する関数があり、何らかの理由で値 100 でスタックします。他のすべての値は問題なく機能します。この関数は、入力フィールドの値を JSON 配列内の対応する値と比較します。

シナリオ:

たとえば、3、1、1 の順に選択すると、最終的に値 12 になります。入力フィールドに 100 を入力して先に進むと、addClass() で示されるエラーが表示されます。100 は 12 以上であるため、addClass() でエラーを追加することはできません。ここでエラーはどこにありますか?

HTML コード:

<div id="ref" class="control-group">
    <label class="control-label">Number of references:</label>

    <div class="controls">
        <div class="input-prepend">
            <input class="input-small" id="references" name="references" type="text">
        </div>
    </div>
</div>

配列は PHP によって生成され、次のように json_encode() を介して JavaScript に変換されます。

var numbers = <?php echo json_encode($numbers); ?>;

配列:

{
    "1":{
        "1":{
            "1":"36",
            "2":"63"
        },
        "2":{
            "1":"54",
            "2":"63"
        }
    },
    "2":{
        "1":{
            "1":"60",
            "2":"105"
        },
        "2":{
            "1":"90",
            "2":"105"
        }
    },
    "3":{
        "1":{
            "1":"12",
            "2":"21"
        },
        "2":{
            "1":"18",
            "2":"24"
        }
    }
}

jQuery コード:

<script type="text/javascript">
    $(document).ready(function()
    {           
        $('#references').change(function() 
        {
            var choice1 = $('input[name=level]:checked').val();

            if (choice1 == '1') 
            {
                var choice2 = $('input[name=authors]:checked').val();
            } 
            else 
            {
                var choice2 = $('input[name=credits]:checked').val();
            }

            var number = numbers[3][choice1][choice2];

            if ($(this).val() < number) 
            {
                $('#ref').addClass('error');
            } 
            else 
            {
                $('#ref').removeClass('error');
            }
        });
    });
</script>
4

2 に答える 2

5

そこで文字列比較を行っています。文字列比較"100" < "12" = trueで . 以下のように数値比較をしてみてください。

if (parseInt($(this).val(), 10) < parseInt(number, 10))
于 2012-06-01T15:42:13.390 に答える
1

現在、すべての数値は文字列です...そのため、JavaScript エンジンは数値を真の数値として扱っていません。

数値であると予想されるものを parseInt() でラップしてみてください。

<script type="text/javascript">
    $(document).ready(function()
    {           
        $('#references').change(function() 
        {
            var choice1 = $('input[name=level]:checked').val();

            if (choice1 == '1') 
            {
                var choice2 = $('input[name=authors]:checked').val();
            } 
            else 
            {
                var choice2 = $('input[name=credits]:checked').val();
            }

            var number = parseInt( numbers[3][choice1][choice2], 10);

            if (parseInt( $(this).val(), 10) < number) 
            {
                $('#ref').addClass('error');
            } 
            else 
            {
                $('#ref').removeClass('error');
            }
        });
    });
</script>
于 2012-06-01T15:46:50.100 に答える