2010-06-05 14 views
7

Jestem bardzo nowy w programowaniu jQuery i javascript. Mam poniżej program, który sprawdza, czy nazwa użytkownika jest zajęta czy nie. Na razie skrypt PHP zawsze zwraca wartość . Funkcja logowania działa, ale sprawdzanie nazwy użytkownika nie działa. Jakieś pomysły? Oto cały mój kod:.post wewnątrz jQuery.validator.addMethod zawsze zwraca wartość false

$(document).ready(function() { 
jQuery.validator.addMethod("checkAvailability",function(value,element){ 
    $.post("login.php" , {username:"test", checking:"yes"}, function(xml){ 
     if($("message", xml).text() == "Available") return true; 
     else return false; 
    }); 
},"Sorry, this user name is not available"); 
$("#loginForm").validate({ 
    rules: { 
     username: { 
      required: true, 
      minlength: 4, 
      checkAvailability: true 
     }, 
     password:{ 
      required: true, 
      minlength: 5 
     } 
    }, 
    messages: { 
     username:{ 
      required: "You need to enter a username." , 
      minlength: jQuery.format("Your username should be at least {0} characters long.") 
     } 
    }, 
    highlight: function(element, errorClass) { 
       $(element).fadeOut("fast",function() { 
       $(element).fadeIn("slow"); 
       }) 
    }, 
    success: function(x){ 
     x.text("OK!") 
    }, 
    submitHandler: function(form){send()} 
}); 
function send(){ 
    $("#message").hide("fast"); 
    $.post("login.php" , {username:$("#username").val(), password:$("#password").val()}, function(xml){ 
     $("#message").html($("message", xml).text()); 
     if($("message", xml).text() == "You are successfully logged in.") 
     { 
      $("#message").css({ "color": "green" }); 
      $("#message").fadeIn("slow", function(){location.reload(true);}); 
     } 
     else 
     { 
      $("#message").css({ "color": "red" }); 
      $("#message").fadeIn("slow"); 
     } 
    }); 
} 
$("#newUser").click(function(){ 

    return false; 
}); 

});

Odpowiedz

8

Trzeba użyć rozszerzonej formie od $.post() który jest $.ajax() więc można ustawić opcję async false, tak:

jQuery.validator.addMethod("checkAvailability",function(value,element){ 
    $.ajax({ 
     url: "login.php", 
     type: 'POST', 
     async: false, 
     data: {username:"test", checking:"yes"}, 
     success: function(xml) { 
     return $("message", xml).text() == "Available"; 
     } 
    }); 
},"Sorry, this user name is not available"); 

Obecnie swoją funkcję success który analizuje odpowiedź dzieje po walidacją kończy się, ponieważ jest to operacja asynchroniczna. W tej chwili nie zwraca niczego w momencie użycia wartości zwracanej i dlatego jest zawsze fałszywa. Ustawienie async na false powoduje, że kod jest wykonywany w kolejności bez wywołania zwrotnego, więc zwrot w powyższym przykładzie jest faktycznie używany.

Inną alternatywą, jeśli można dostosować strukturę przywrócić strona jest w użyciu plugin sprawdzania poprawności wbudowanej remote option, który jest tylko dla tego rodzaju rzeczy :)

+0

przykro :(to nie działa, zwraca false Zmieniłem funkcję zwrotną do sukcesu. If ($ ("message", xml) .text() == "Dostępny") return true; else return false; –

+1

@abdullah - Nie ma różnicy w tej funkcji 'return', tylko dodatkowy kod ... jeśli odpowiedź, którą wysłałeś działa, ale ta nie zawiera pliku php twoje pytanie nie jest dokładne i powinieneś je zaktualizować –

+0

@Nick: Myślę, że problem polegał na zwrocie funkcji fikcyjnej w parametrze po "checkAvailability", która jest funkcją (value, element) {} . nic ~ = false, dobrze? To po prostu zrobiło jakąś funkcję ajax, która zwróciła jakąś wartość. Ale "funkcja (wartość, element)" nic nie zwróciła. Jestem początkującym, tylko moje przemyślenia :) –

11

jest OK, a teraz pracuje. Oto kod:

$(document).ready(function() { 
jQuery.validator.addMethod("checkAvailability",function(value,element){ 
var x= $.ajax({ 
    url: "login.php", 
    type: 'POST', 
    async: false, 
    data: "username=" + value + "&checking=true", 
}).responseText; 
if($("message", x).text()=="true") return true; 
else return false; 
},"Sorry, this user name is not available"); 
$("#loginForm").validate({ 
    rules: { 
     username: { 
      required: true, 
      minlength: 4, 
      checkAvailability: true 
     }, 
     password:{ 
      required: true, 
      minlength: 5 
     } 
    }, 
    messages: { 
     username:{ 
      required: "You need to enter a username." , 
      minlength: jQuery.format("Your username should be at least {0} characters long.") 
     } 
    }, 
    highlight: function(element, errorClass) { 
       $(element).fadeOut("fast",function() { 
       $(element).fadeIn("slow"); 
       }) 
    }, 
    success: function(x){ 
     x.text("OK!") 
    }, 
    submitHandler: function(form){send()} 
}); 
function send(){ 
    $("#message").hide("fast"); 
    $.post("login.php" , {username:$("#username").val(), password:$("#password").val()}, function(xml){ 
     $("#message").html($("message", xml).text()); 
     if($("message", xml).text() == "You are successfully logged in.") 
     { 
      $("#message").css({ "color": "green" }); 
      $("#message").fadeIn("slow", function(){location.reload(true);}); 
     } 
     else 
     { 
      $("#message").css({ "color": "red" }); 
      $("#message").fadeIn("slow"); 
     } 
    }); 
} 
$("#newUser").click(function(){ 

    return false; 
}); 
}); 
2

OK, może to nie być wszystko istotne, ale miałem podobny problem. Nie zrobiłem nic z wartością zwracaną, właśnie ją zwróciłem. I zawsze było prawdą. Po pewnym pokręceniu zorientowałem się, że wartość z serwera pojawiła się jako ciąg do walidatora. Dopóki nie był to pusty ciąg, zwracałby on prawdę. Tak więc rozwiązaniem było użycie eval();

Przykład:

jQuery.validator.addMethod("checkAvailability",function(value,element){ 
return eval($.ajax({ 
    url: "/check", 
    async: false, 
    data: { 
     field: $('#element').attr('name'), 
     val: value 
    } 
}).responseText); 
}, "error"); 
+0

, więc jeśli zwraca true , eval zwróci wartość logiczną true, a jeśli zwróci false, eval zwróci wartość logiczną false. dobrze? –

+0

tak, to prawda! – Dmitry

Powiązane problemy