0

我有一个函数可以检查用户是否在输入框中写了一个数字:

var letters = 'ABCÇDEFGHIJKLMNÑOPQRSTUVWXYZabcçdefghijklmnñopqrstuvwxyzàáÀÁéèÈÉíìÍÌïÏóòÓÒúùÚÙüÜ';
var numbers = '1234567890';
var signs = ',.:;@-\'';
var mathsigns = '+-=()*/';
var custom = '<>#$%&?¿';


function alpha(event) {
    var k;
    k = document.all ? parseInt(event.keyCode) : parseInt(event.which);
    return (numbers.indexOf(String.fromCharCode(k)) != -1);
}

此函数与以下函数一起使用,该函数获取数字并将其发送到控制器,控制器将数字保存在数据库中。但只有当数字与原始数字不同时,那是首先在输入框中。它还会更新另一个输入框,其中包含与触发事件的输入框具有相同 row_id 属性的所有特定输入的总和:

function initializeUpdateNumberProcentMatrix() {

    $(".numberfield").live('keypress', alpha);

    //$(".numberfield").live('keypress', alpha(numbers));


        $('.numberfield').live('focus', function () {
            $(this).attr('oldvalue', $(this).val());
        });

        $('.numberfield').live('blur', function () {

            // Dette er den nuværende værdi i tekstboksen
            var value = $(this).val();
            var oldvalue = $(this).attr('oldvalue');

            // Reference til tekstboksen
            var obj = $(this);

            // Hvis værdien ikke har ændret sig, skal der ikke foretages noget (hvis man tabulerer)
            if (value == $(this).attr('oldvalue')) {
                return;
            }

            else {

                var dif = value - $(this).attr('oldvalue');
                var newval;


                $('.procentsumfield').each(function (index) {
                    if ($(this).attr('row-id') == obj.attr('row-id')) {

                        newval = (parseInt($(this).val()) + parseInt(dif));

                        // Hvis summen overstige 100, skal der ikke foretages nogle ændringer - Textboksens værdi skal tilbagestilles, og sumfeltet skal ikke odateres                
                        if (newval > 100) {
                            obj.val(oldvalue);
                            alert("Summen for det pågældende år må ikke overstige 100%");
                            return;
                        }
                        else {
                            $(this).val(newval);
                            return false;
                        }
                    }
                });

                var number = { Column_ID: $(this).attr('column-id'),
                    Row_ID: $(this).attr('row-id'),
                    Question_ID: $(this).attr('question-id'),
                    Value: $(this).val(),
                    Type: "Procent"
                };

                // Hvis den nye værdi overstiger 100, skal det ikke gemmes
                if (newval <= 100) {
                    saveNumberMatrix($(this), number, "/SaveSurveyAnswers/SaveProcentMatrix");
                }
            }
        });
    }

问题是,有时 IE 7 在“procentsumfield”输入框中给了我一个 NaN,它不会保存新值,因为它不是数字。

什么可能导致这种情况发生?

谢谢

4

2 回答 2

2

NaN是病毒/毒药。如果一个值NaN(几乎)是计算中的任何其他值,则可能是原因。在这种情况下:

  • parseInt($(this).val())可能会回来NaN
  • parseInt(dif)可能会返回NaN,可能是由
    • value存在NaN,或
    • $(this).attr('oldvalue')返回不能被强制转换为数字的东西
  • 等等

(旁注:你为什么parseInt()ing dif?它已经是一个数字,或者NaN。此外,即使它是一个字符串,它parseInt()在循环内部也是愚蠢的。)

于 2012-05-15T16:49:59.067 回答
0
var dif = value - $(this).attr('oldvalue');

value和都是$(this).attr('oldvalue')字符串。 -仅适用于整数string-stringNaN .

你需要parseInt在这些上使用。

var value = parseInt($(this).val(), 10);
var oldvalue = parseInt($(this).attr('oldvalue'), 10);

请注意,10,这确保值是“base 10”。

编辑:如评论中所述,NaN来自$(this).val()空('')。您可以像这样检查:

if($.trim($(this).val()) === '')

或者:

var value = parseInt($(this).val(), 10);
if(isNaN(value))

您设置oldvalue但从不使用它,您应该使用它而不是每次都获取属性。

var dif = value - oldvalue;

还要将此行更改newval = (parseInt($(this).val()) + parseInt(dif));为:

newval = parseInt($(this).val(), 10) + dif;

dif已经是 int,不需要parseInt.

另一个注意事项:在 jQuery event.which被规范化(并且应该是一个 int),所以你不需要“检查”它。

function alpha(event) {
    return (numbers.indexOf(String.fromCharCode(event.which)) != -1);
}
于 2012-05-15T16:59:07.610 回答