JQuery:返回$ .get()回调到外部作用域

时间:2011-06-07 14:35:19

标签: jquery callback get scope

我正在为我的最新项目开发此验证脚本,其中一个要求是它检查用户输入的值是否在数据库中,如果不是,则返回错误。

function validateSteps(){
    var FormErrors = false;
    for(var i = 1; i < fieldsetCount; ++i){
        var error = validateStep(i);
        if(error == -1)
            FormErrors = true;
    }
    $('#formElem').data('errors',FormErrors);   
}

function validateStep(step){
    if(step == fieldsetCount) return;

    var error = 1;
    var hasError = false;
    $('#formElem').children(':nth-child('+ parseInt(step) +')').find(':input:not(button)').each(function(){
        var $this       = $(this);
        var valueLength = jQuery.trim($this.val()).length;
        var inputValue = jQuery.trim($this.val());
        var errorID = $this.attr('name') + "_err";
        var errorPrepend = "<div class='rf_error' id='" + errorID +"'>";
        var errorAppend = "</div>";
        var errorMsg = "";

        /* =================================
         MORE VALIDATION STATEMENTS HERE
         ============================ */

        if($this.is('.rf_GrpCode') && !hasError)
        {
            $.get("inc/scripts/formHandle.php", { GrpCode: inputValue, type: "groupCode" }, function(data) {
                if(!data.GrpCode)
                {
                    hasError = true;
                    errorMsg = "The code you have entered is invalid.";

                }
            }, "json");
        }

        if(hasError)
        {
            $this.css('background-color','#FFEDEF');
            //alert("Has error: " + errorID);
            if(errorMsg)
            {

                if($('#' + errorID).length)
                {
                    $('#' + errorID).html(errorMsg);
                }
                else
                {
                    $this.after(errorPrepend + errorMsg + errorAppend);
                }
            }
        }
        else
        {
            //alert("Has no error: " + errorID);
            $('#' + errorID).remove();
            $this.css('background-color','#FFFFFF');    
        }
    });

   var $link = $('#navigation li:nth-child(' + parseInt(step) + ') a');
    $link.parent().find('.error,.checked').remove();

    var valclass = 'checked';
    if(hasError){
        error = -1;
        valclass = 'error';
    }
    $('<span class="'+valclass+'"></span>').insertAfter($link);

    return error;
}

$('#registerButton').bind('click',function(){
    if($('#formElem').data('errors')){
        $.confirm({
            'title'     : 'Ooops!',
            'message'   : 'It appears some of the information you have entered is invalid. Please go back through the steps a amend the marked fields.',
            'buttons'   : {
                'OK'    : {
                    'class' : 'blue',
                    'action': function(){}
                }
            }
        });
        return false;
    }   
});

$ .get()请求本身工作正常,如果数据库中没有值的实例,将进入if语句。但是,一旦涉及到错误处理部分,它就不会获取我在if语句中设置的变量。

我可以理解它为什么不起作用,因为这些变量是在函数其余部分的范围之外设置的。不幸的是,据我所知,这是如何让这些变量最终被错误处理部分识别出来的。

希望有道理,

非常感谢任何帮助,谢谢,

林登

4 个答案:

答案 0 :(得分:2)

问题是get只是执行AJAX get请求的快捷方式。 AJAX是异步的,因此请在检查变量后返回请求。你有几个选择。通常情况下,我不鼓励阻止ajax呼叫(有点失败的目的),但如果这是在提交时发生,那么它可能是有道理的。

您可以将get更改为ajax并设置async: false。这将等待请求完成后再继续。

如果你需要等待多个这样的调用,你应该看一下http://api.jquery.com/jQuery.when/,这将允许请求并行运行,但仍然等待所有操作完成后再继续。< / p>

答案 1 :(得分:0)

$.get()请求是异步的。在响应进入后,您只需hasError设置,这比您检查时要快很多。

答案 2 :(得分:0)

问题是,你的ajax调用是异步的。因此,在成功处理程序甚至设置if(hasError) {的值之前,将执行条件检查hasError。启动ajax调用后,您无法直接执行代码。取而代之的是成功监听器中的所有其他代码。

if($this.is('.rf_GrpCode') && !hasError)
{
    $.get("inc/scripts/formHandle.php", { GrpCode: inputValue, type: "groupCode" }, function(data) {
        if(!data.GrpCode)
        {
            errorMsg = "The code you have entered is invalid.";


            $this.css('background-color','#FFEDEF');
            //alert("Has error: " + errorID);
            if(errorMsg)
            {

                if($('#' + errorID).length)
                {
                    $('#' + errorID).html(errorMsg);
                }
                else
                {
                    $this.after(errorPrepend + errorMsg + errorAppend);
                }
            }
        }
        else
        {
            //alert("Has no error: " + errorID);
            $('#' + errorID).remove();
            $this.css('background-color','#FFFFFF');    
        }
    }, "json");
}

答案 3 :(得分:0)

get函数是异步的。您可以在答案到达之前处理结果。