使用jQuery向服务器发送AJAX请求

时间:2011-11-22 08:16:32

标签: javascript jquery ajax django

我想使用AJAX向同一个网址发送一个非常基本的帖子请求。它应该使用用户名并针对数据库进行检查,以查看是否已存在具有该名称的用户,并返回该字符串。发送请求的javascript函数有问题:

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被忽略?萤火虫一无所获。

3 个答案:

答案 0 :(得分:5)

Ajax的意思是“异步JavaScript和XML”,因此它不会等待$ .post完成,而只是在你的代码中继续。

要解决此问题,您必须使用回调函数:

http://api.jquery.com/jQuery.post/

  

jQuery.post(url [,data] [,success(data,textStatus,jqXHR)] [,   dataType])

     

url包含发送请求的URL的字符串。

     

data使用请求发送到服务器的映射或字符串。

     

success(data,textStatus,jqXHR)执行的回调函数   如果请求成功。

     

dataType服务器所需的数据类型。默认:   智能猜测(xml,json,script或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")
});

答案 1 :(得分:3)

首先,您的视图中存在一些问题。您需要检查POST是来自AJAX还是标准POST;否则,您将无法在以后实际添加用户。 (实际上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

答案 2 :(得分:-2)

编辑:确保响应发送回STRING true或STRING false

编辑:响应正在发送回STRING true或A STRING 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;
         }
    });