2

这是我的代码

var jsonpath;

function loginFromDef() {

    var a = grantAccess($('#login :input').serialize());
    if (a.Msg) {
        $('#msg').html(a.Msg).attr('class', 'error');
    }
    else if (a.done) {
        var returnUrl = getQueryString('ReturnURL');
        if (returnUrl)
            window.location = returnUrl;
        else
            window.location = 'Home.aspx';
    }


    return false;
}

function grantAccess(dataToPost) {

    $.ajax({
        type: "POST",
        url: jsonpath + 'Json.ashx?method=GrantAccess',
        async: false,
        data: dataToPost,
        success: function (data) {
            return data;
        }
    });
}

function getQueryString(name) {
    var match = RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search);
    return match && decodeURIComponent(match[1].replace(/\+/g, ' '));
}

var jsonPath正在 Default.aspx 页面中定义,我在提交按钮loginFromDef()的事件中调用函数。onclick

我收到错误TypeError: a is undefined 不要担心我的.ashx处理程序。它工作正常。我会测试它。

我认为var a功能loginFromDef没有被初始化。因为may be jQuery is making asynchronous call. Even I have set async:false在选项中。

我怎么了。。??请提出解决方案。

4

3 回答 3

6

您在grantAccess. 回调中的 return 语句没有任何效果(因为它是由$.ajax内部调用的)。

Ajax 调用同步的,但您不会从grantAccess.

你可以这样做:

return $.ajax({
    type: "POST",
    url: jsonpath + 'Json.ashx?method=GrantAccess',
    async: false,
    data: dataToPost,
}).responseText;

也许您必须$.parseJSON在返回该值之前使用。

$.ajax返回一个jqXHR对象,您可以在文档中找到更多信息。

但是,我强烈建议不要使用同步 Ajax 调用,而且我看不出有什么理由需要在这里使用。在收到响应之前,同步请求可能会阻塞浏览器(包括其 UI),使浏览器无响应,从而导致糟糕的使用体验。

更改您的代码,以便您可以使用回调来处理响应。例如:

function loginFromDef() {

    grantAccess($('#login :input').serialize()).done(function(a) {
        if (a.Msg) {
            $('#msg').html(a.Msg).attr('class', 'error');
        }
        else if (a.done) {
            var returnUrl = getQueryString('ReturnURL');
            if (returnUrl)
                window.location = returnUrl;
            else
                window.location = 'Home.aspx';
        }
    });

    return false;
}

wheregrantAccess简单地返回jqXHR由返回的对象$.ajax

function grantAccess(dataToPost) {
    return $.ajax({
        type: "POST",
        url: jsonpath + 'Json.ashx?method=GrantAccess',
        data: dataToPost
    });
}
于 2012-08-21T08:48:20.483 回答
2

在进行 AJAX 调用后,您的grantAccess函数将返回。由于您没有为grantAccess函数指定返回值,因此它隐式返回undefined.

然后,您的success函数将data变量返回给它的caller,它位于 jQuery 代码中的某个位置。

于 2012-08-21T08:46:05.577 回答
1

问题在于success您的 Ajax 调用的功能。

function grantAccess(dataToPost) {
    $.ajax({
        type: "POST",
        url: jsonpath + 'Json.ashx?method=GrantAccess',
        async: false,
        data: dataToPost,
        success: function (data) {
            return data;
        }
    });
}

成功函数不同于 GrantAccess 函数。GrantAccess 不返回值,因此以下行:

var a = grantAccess($('#login :input').serialize());

总会导致存在。_anull

你应该做的是以下几点:

function loginFromDef() {

    grantAccess($('#login :input').serialize());
}

function grantAccess(dataToPost) {

    $.ajax({
        type: "POST",
        url: jsonpath + 'Json.ashx?method=GrantAccess',
        async: false,
        data: dataToPost,
        success: TheFollowUpFunction(data)
    });
}

    //NEWLY ADDED:

    function TheFollowUpFunction(a) {

        if (a.Msg) {
            $('#msg').html(a.Msg).attr('class', 'error');
     }
    else if (a.done) {
         var returnUrl = getQueryString('ReturnURL');
          if (returnUrl)
            window.location = returnUrl;
          else
            window.location = 'Home.aspx';
    }

    }
于 2012-08-21T08:53:10.320 回答