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 が "procentumfield" 入力ボックスに NaN を表示することがあり、数値ではないため新しい値が保存されないことです。

これが起こる原因は何ですか?

ありがとう

4

2 に答える 2

2

NaNウイルス/毒です。値がNaN(ほとんど) である場合、その計算に使用された他の値が原因である可能性があります。この場合:

  • parseInt($(this).val())戻ってくるかもしれませんNaN
  • parseInt(dif)が戻ってきているNaN可能 性があります。
    • valueNaNまたは
    • $(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')も文字列です。 -int でのみ機能しstring-stringますNaN

これらで使用する必要があります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 に答える