这是我的代码
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, ' '));
}
我在Default.aspx页面中定义了 var jsonPath
,我在loginFromDef()
提交按钮事件上调用了函数onclick
。
我收到错误 TypeError: a is undefined
不要担心我的.ashx
处理程序。它工作正常。我试试了。
我认为函数var a
中的loginFromDef
未初始化。因为选项中的 may be jQuery is making asynchronous call. Even I have set async:false
。
我错了.. ??请提出解决方案。
答案 0 :(得分:6)
grantAccess
中没有任何退货声明。回调中的return语句没有任何影响(因为它在内部由$.ajax
调用)。
Ajax调用是同步,但您没有从grantAccess
返回任何数据。
你可以这样做:
return $.ajax({
type: "POST",
url: jsonpath + 'Json.ashx?method=GrantAccess',
async: false,
data: dataToPost,
}).responseText;
也许您必须在返回该值之前使用$.parseJSON
。
$.ajax
会返回jqXHR
个对象,您可以在documentation找到更多相关信息。
但是,我强烈建议不要使用同步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;
}
其中grantAccess
只返回jqXHR
返回的$.ajax
对象:
function grantAccess(dataToPost) {
return $.ajax({
type: "POST",
url: jsonpath + 'Json.ashx?method=GrantAccess',
data: dataToPost
});
}
答案 1 :(得分:2)
在进行AJAX调用之后,您的grantAccess
函数正在返回。由于您没有为grantAccess
函数指定退货,因此它会隐式返回undefined
。
您的success
函数正在将data
变量返回给它的调用者,这是jQuery代码中的某个地方。
答案 2 :(得分:1)
问题出在Ajax调用的success
函数中。
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());
始终会导致a
成为null
。
您应该做的是以下内容:
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';
}
}