Terugbelfunctie (succes?) Voor AJAX

Wanneer een gebruiker zijn of haar info invoert in de aanmeldingspagina en op "submit" klikt, wordt gebruikersnaamCheck() aangeroepen. In theorie zou het een AJAX-verzoek moeten sturen naar de server, die controleert of de gebruikersnaam is ingevoerd. Als dat zo is, wordt de gebruiker gewaarschuwd en gebeurt er niets anders. Anders controleert het of het wachtwoord geldig is. Bij een vorige vraag kreeg ik te horen dat ik een callback-functie nodig had om te voorkomen dat het formulier werd ingediend voordat AJAX asynchroon retourneerde. In plaats daarvan plaats ik het formulier submit in het succes: deel van de AJAX-aanvraag, dus het moet alleen worden opgeroepen als de gebruikersnaam uniek is en het wachtwoord geldig is.

Het lijkt echter nooit in de fase voor wachtwoordcontrole te komen of een waarschuwing weer te geven ...

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-aanmeldingsweergave:

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))
1
@mithunsatheesh uh oh, er verschijnt geen melding. Zie je iets dat ervoor zorgt dat dit niet compileert? Ik heb ook de Django-weergave opgenomen, hoewel het eenvoudig genoeg lijkt om niet te falen.
toegevoegd de auteur Chris, de bron
open uw browsertools (F12) en controleer of er iets is verzonden.
toegevoegd de auteur Jan Højriis Dragsbaek, de bron
probeer alert (antwoord); in de succesfunctie en controleer de waarde ervan
toegevoegd de auteur mithunsatheesh, de bron

1 antwoord

Het feit dat u de volledige gekwalificeerde domeinnaam vermeldt;

http://omnicloud.me/signup

stel me voor dat u een server oproept van een domein dat verschilt van waar u de pagina laadt en dat u tegen browserniveau's voor cross-domeinnamen aanloopt. Domeinoverschrijdend domein is mogelijk, maar vereist meer instellingen - probeer het eerst te laten werken met dezelfde domian als waar u de pagina laadt,

d.w.z. gebruik de

   /signup

op dezelfde server in plaats van het gedeelte http://omni .... te gebruiken.

1
toegevoegd
Oh nee, de URL van de aanmeldingspagina is dat, dus als het een get is, geeft Django de aanmeldingspagina weer en retourneert deze. Als het een AJAX-aanvraag is, dan doet het alle dingen in de database
toegevoegd de auteur Chris, de bron
Ik heb de Django-weergave toegevoegd die specifiek is voor aanmelding. Is dat wat je bedoelde?
toegevoegd de auteur Chris, de bron
Wat ik bedoelde met een cross-domein was, dat uw HTML & jQuery JS wordt gepost van de ene domeinnaam, en dat de AJAX-oproep de aanmeldingspagina op een ander domein benadert (bijv. Omnicloud.me) - moderne browsers voorkomen standaard Ajax-verzoeken om naar een andere server te gaan dan waar de HTML vandaan kwam.
toegevoegd de auteur Soren, de bron