【问题标题】:Sending AJAX request to server with jQuery使用 jQuery 向服务器发送 AJAX 请求
【发布时间】:2012-01-03 15:48:26
【问题描述】:

我想使用 AJAX 向同一个 url 发送一个非常基本的发布请求。它应该获取用户名并根据数据库检查它以查看是否已经存在具有该名称的用户,并返回一个字符串。发送请求的 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 被忽略了吗? Firebug 什么也没找到。

【问题讨论】:

  • 此外那是什么:$("username").value?应该是 $('#username').val()$('.username').val() 等。
  • 克里斯,基本上有两个错误:您关闭 $.post 语句有点过早,响应必须与“真”进行比较。在下面检查我的答案。就是这样!

标签: javascript jquery ajax django


【解决方案1】:

首先,您的观点存在一些问题。您需要检查 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

【讨论】:

  • 啊,我有一个 adduser 视图来处理用户创建,但我想这更好!我不必使用 AJAX 创建它们,因为无论如何它们都必须被重定向到他们的个人资料,但我会记住这一点!谢谢!
【解决方案2】:

编辑:确保响应返回一个 STRING true 或一个 STRING 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;
         }
    });

【讨论】:

  • 方法 usernameCheck 不会返回 true/false
  • 那个答案根本没有帮助,因为很明显,提出这个问题的人和给出这个答案的人都需要更好地理解异步性(参见 Ghommey 的回答)。
【解决方案3】:

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

要解决这个问题,你必须使用回调函数:

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

jQuery.post( url [, data] [, success(data, textStatus, jqXHR)] [, 数据类型])

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

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

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")
});

【讨论】:

  • 所以为了保存回复,我会在帖子上方定义var exists,然后放一个简单的函数来将值分配给存在?
  • 在旁注中,看起来 JQuery 选择器和方法也是错误的。我猜应该是$("#username").val()
  • if(exists){ 在 ajax 请求完成之前执行
  • @Ghommy 如何确保它等待响应?我会将其余代码放入回调函数中,但它只会从该函数返回,而不是 checkUsername()。我根据您的建议更新了代码。
  • 您可以使您的查询同步,以便它们等待返回 - 但异步的东西要好得多。这里:stackoverflow.com/questions/133310/…
猜你喜欢
  • 1970-01-01
  • 2019-03-16
  • 2015-09-29
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多