Javascript 使用jQuery向服务器发送AJAX请求
我想使用AJAX向同一url发送一个非常基本的post请求。它应该使用用户名,并对照数据库进行检查,以查看具有该名称的用户是否已经存在,并返回相应的字符串。发送请求的javascript函数有问题:Javascript 使用jQuery向服务器发送AJAX请求,javascript,jquery,ajax,django,Javascript,Jquery,Ajax,Django,我想使用AJAX向同一url发送一个非常基本的post请求。它应该使用用户名,并对照数据库进行检查,以查看具有该名称的用户是否已经存在,并返回相应的字符串。发送请求的javascript函数有问题: function usernameCheck(){ $.post("http://omnicloud.me/signup", {username: $("#username").value}, function(response){ if(response=="true"){
function usernameCheck(){
$.post("http://omnicloud.me/signup",
{username: $("#username").value},
function(response){
if(response=="true"){
$('#passAlert').innerHTML("Sorry, that username is already taken")
}
});
return !($('#passAlert').value == "Sorry, that username is already taken")
}
如果此人正在加载注册视图,则返回该页面,否则,将调用该页面以检查是否存在用户:
def signup(request):
if request.method == 'GET':
return render_to_response('signup.html', context_instance=RequestContext(request))
else:
#query db for user with username provided in POST, return if it exists
user = User.objects.get(username=request.POST["username"])
if user is not None:
return HttpResponse("true")
else:
return HttpResponse("false")
关于JS被忽略的原因,你能看到什么吗?萤火虫什么也没找到 Ajax的意思是“异步JavaScript和XML”,因此它不会等待$.post完成,而是在代码中继续
要解决此问题,必须使用回调函数:
jQuery.post(url[,data][,success(data,textStatus,jqXHR)][,,
数据类型])
url包含请求发送到的url的字符串
数据随请求一起发送到服务器的映射或字符串
success(data、textStatus、jqXHR)执行的回调函数
如果请求成功。
dataType预期来自服务器的数据类型。违约:
智能猜测(xml、json、脚本或html)
样本:
function usernameCheck(){
$.post("http://omnicloud.me/signup",
{username: $("#username").val()},
function(response){
if(response=="true"){
$('#passAlert').html("Sorry, that username is already taken")
}
});
}
您还可以传递匿名回调:
function usernameCheck(successCallback){
$.post("http://omnicloud.me/signup",
{username: $("#username").val()},
function(response){
if(response=="true") successCallback();
});
}
// Somewhere else in your code:
usernameCheck(function(){
$('#passAlert').html("Sorry, that username is already taken")
});
编辑:确保响应发回字符串true或字符串false 编辑:响应将返回字符串true或字符串false
function usernameCheck(){
var exists;
$.post("http://omnicloud.me/signup", { username: $("#username").val() },
function(response){
exists = (response == 'true');
if(exists){
$('#passAlert').innHTML = "Sorry, that username is already taken";
return false;
} else {
return true;
}
});
首先,你的观点有一些问题。您需要检查帖子是来自AJAX还是标准帖子;否则,您以后将无法实际添加用户。(实际上,AJAX部分应该是它自己的视图,因为它本身并不是注册过程的一部分,而是一个验证检查。稍后,您可能真的希望通过AJAX创建一个用户,但您无法这样做,因为视图无法区分两个不同的AJAX请求) 接下来,当对象不存在时,
get
不返回None
;它会引发一个ObjectDoesNotExist
异常。因此,您的if
语句在那里不起作用;您必须改用try
块
我已相应地更新了您的以下视图:
def signup(request):
if request.method == 'GET':
return render_to_response('signup.html', context_instance=RequestContext(request))
elif request.is_ajax():
# query db for user with username provided in POST, return if it exists
try:
user = User.objects.get(username=request.POST["username"])
except User.DoesNotExist:
return HttpResponse("false")
else:
return HttpResponse("true")
else:
# Normal post, add new user
可能与以下内容重复:
$(“用户名”).value
?应该类似于$('#username').val()
或$('.username').val()
等。Chris,基本上有两个错误:关闭$.post语句有点太快,必须将响应与“true”进行比较。检查下面我的答案。这就是全部!因此,为了保存响应,我将在帖子上方定义var exists
,然后放置一个简单的函数,只将值分配给exists?在旁注上,JQuery选择器和方法似乎也有问题。我猜它应该是$(“#username”).val()
如果(存在){
在ajax请求发出之前执行complete@Ghommy如何确保它等待响应?我会将其余代码抛出回调函数,但它只会从该函数返回,而不是checkUsername()。我用您的建议更新了代码。您可以使查询同步,以便它们等待返回-但是异步的东西要好得多。这里:方法usernameCheck不会返回true/false该答案没有任何帮助,因为显然,提出问题的人和给出此答案的人都需要更好地理解异步啊,我有一个adduser视图来处理用户创建,但我想这会更好!我不必使用AJAX创建它们,因为它们无论如何都必须重定向到它们的配置文件,但我会记住这一点!谢谢!