【问题标题】:Callback (success?) function for AJAXAJAX 的回调(成功?)函数
【发布时间】:2011-12-06 19:03:57
【问题描述】:

当用户在注册页面输入他们的信息并点击“提交”时,usernameCheck() 被调用。理论上,它应该向服务器发送一个 AJAX 请求,服务器会检查用户名是否被占用。如果是,则向用户发出警报,并且不会发生其他任何事情。否则,它会检查密码是否有效。在上一个问题中,有人告诉我,我需要一个回调函数来阻止表单在 AJAX 异步返回之前提交。相反,我将表单提交放在 AJAX 请求的 success: 部分,因此只有在用户名唯一且密码有效的情况下才会调用它。

但是,它似乎从未进入密码检查阶段,或显示任何警报...

function usernameCheck(){ //returns true if username is free
    var ajaxHeaders = {}; //create header object
    ajaxHeaders["X-CSRFToken"] = getCookie('csrftoken'); //add csrftoken from cookies for authentication server-side
    $.ajax({
        type:'POST',
        url:"http://omnicloud.me/signup", 
      data:{username: $("#username").val()}, 
      success:function(response){
        if(response=="true"){
           $('#passAlert').innerHTML("Sorry, that username is already taken") 
           //passalert is where all of the errors (username taken, invalid password) show up
        } else {
            if (passwordCheck()){
                $('#signup_form').submit();
            }
        }
        },
    headers: ajaxHeaders //settings for ajax request
    });

    return !($('#passAlert').value == "Sorry, that username is already taken")
}

function passwordCheck(){
    var pattern =  /[a-z,A-Z,0-9,$,#,@,!,&,%,+,_,-,?]{10,}/  //regexp for valid charachers
    var text = document.getElementById('password').value;
    var msg = document.getElementById('passAlert');
    if(text.length < 10){
        msg.innerHTML = "Passwords need to be at least 10 characters long :(";
        return false;
    } else if (!text.match(pattern)){
        msg.innerHTML = "You have entered an invalid digit (sorry)";
        return false;
    } else if (unacceptable(text)){
        msg.innerHTML = "You can be more creative than that...";
        return false;
    } else if(text != document.getElementById('pass_repeat').value){
        msg.innerHTML = "Your passwords do not match.";
        return false;
    }
    return true;
}

function unacceptable(pwd){ //joins the array, if it matches any one of them 
                                                        //(g means at any point, i means case insensitive) password rejected
    var re = new RegExp(unforgivable.join("|"),"gi");
    return (pwd.toString().match(re) != null);
}

Django 注册视图:

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 via ajax, return if it exists
    try:    
        user = User.objects.get(username=request.POST.get("username")) 
    except User.DoesNotExist:
        return HttpResponse("false",context_instance=RequestContext(request))
    else:
        return HttpResponse("true", context_instance=RequestContext(request))

【问题讨论】:

  • 打开浏览器工具 (F12) 并检查是否发送了任何内容。
  • 尝试警报(响应);在成功函数内部并检查其值
  • @mithunsatheesh 哦,没有警报出现。您是否看到任何会导致无法编译的内容?我还包括了 Django 视图,尽管它看起来很简单,不会失败。

标签: javascript ajax django callback


【解决方案1】:

您提到了完整的合格域名;

http://omnicloud.me/signup

建议您从与您加载页面的位置不同的域调用服务器,并且您遇到跨域名浏览器限制。跨域是可能的,但需要更多设置——首先尝试使用与加载页面相同的域来使其工作,

即使用

   /signup

在同一台服务器上而不是使用http://omni.... 部分。

【讨论】:

  • 哦不,注册页面的 url 是这样的,所以如果是 get,Django 会渲染并返回注册页面。如果是 AJAX 请求,那么它会处理所有的数据库内容
  • 我添加了特定于注册的 Django 视图。你是这个意思吗?
  • 我所说的跨域的意思是,您的 HTML 和 Jquery JS 是从一个域名发布的,并且 AJAX 调用正在访问不同域(例如omnicloud.me)上的注册页面 - - 现代浏览器默认阻止 Ajax 请求转到与 HTML 来源不同的服务器。
猜你喜欢
  • 1970-01-01
  • 2015-10-30
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2013-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多