jQuery函数导致NaN值

时间:2013-12-31 23:25:02

标签: javascript jquery nan

我有一个错误检查功能,只是在圈子里运行我。

function emailValUReq(v, noRet) {
    var textReg = /[a-zA-Z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?/;
    if (!v.val()) {
        if (noRet == null) {
            v.nextAll('.errText').html('<br>! Required Field');
        }
        return 1;
    } else if (!textReg.test(v.val())) {
        if (noRet == null) {
            v.nextAll('.errText').html('<br>! Invalid Entry');
        }
        return 1;
    } else {
        $data = new Object;
        $data['email'] = v.val();
        $data['id'] = v.data('cur');
        $.ajax({
            type: "POST",
            url: "/modules/data/dup_check.php",
            data: $data,
            success: function (r) {
                if (r == 'ok') {
                    v.nextAll('.errText').empty();
                    return 0;
                } else {
                    if (noRet == null) {
                        v.nextAll('.errText').html('<br>! An account already exists for this email');
                    }
                    return 1;
                }
            }
        });
    }
}

此功能整体运作完美。它在错误时返回1,在值正确格式化且唯一时返回0。当我尝试将多个函数中的错误“加起来”时,问题出现了。

(传递区域和noRet)

var vErr=0;
    area.find('.emailvalureq:visible').each(function () {
        vErr += emailValUReq($(this), noRet);
    });

当输入字段为空或格式不正确时,此操作正常。一旦在验证脚本中触发$ .ajax调用,似乎延迟会使所有内容混乱并且vErr最终成为NaN值。

我尝试过如下操作,结果相同:

var vErr=0;
area.find('.emailvalureq:visible').each(function () {
    var ve1 = emailValUReq($(this), noRet);setTimeout(function(){vErr+=ve1;},1000);
});

我将参加一个家庭婚礼几个小时,所以在今晚晚些时候我将无法回答任何问题/建议 - 但任何帮助都表示赞赏!

1 个答案:

答案 0 :(得分:0)

我尝试使用when / done语句如下:

$.when(emailValUReq($(this),noRet)).done(function(r){vErr+=r;});

但问题是“r”未定义(我希望它会从emailValUReq函数中提取返回值)。

对我来说,解决方法是重新编写emailValUReq函数,直接更新错误变量,如下所示:

function emailValUReq(v, noRet) {
    var textReg = /[a-zA-Z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?/;
    if (!v.val()) {
        if (noRet == null) {
            v.nextAll('.errText').html('<br>! Required Field');
        }
        $err++;
    } else if (!textReg.test(v.val())) {
        if (noRet == null) {
            v.nextAll('.errText').html('<br>! Invalid Entry');
        }
        $err++;
    } else {
        $data = new Object;
        $data['email'] = v.val();
        $data['id'] = v.data('cur');
        $.ajax({
            type: "POST",
            url: "/modules/data/dup_check.php",
            data: $data,
            success: function (r) {
                if (r == 'ok') {
                    v.nextAll('.errText').empty();
                } else {
                    if (noRet == null) {
                        v.nextAll('.errText').html('<br>! An account already exists for this email');
                    }
                    $err++;
                }
            }
        });
    }
}

$err=0;
area.find('.emailvalureq:visible').each(function () {
    emailValUReq($(this), noRet);
});

我需要做的就是延迟检查$ err的值大约1秒,这使得ajax调用有足够的时间来运行并返回响应。

setTimeout(function(){return $err;},1128);

我不确定这是最好的回答,还是最优雅的,但它确实有效!