2010-06-05 4 views
7

Je suis très nouveau à la programmation jQuery et javascript. J'ai un programme ci-dessous qui vérifie si le nom d'utilisateur est pris ou non. Pour l'instant, le script PHP retourne toujours.post à l'intérieur jQuery.validator.addMethod retourne toujours faux

if(isset($_POST["username"]))//&& isset($_POST["checking"])) 
    { 
     $xml="<register><message>Available</message></register>"; 
     echo $xml; 
    } 

La fonction de connexion fonctionne, mais pas la vérification du nom d'utilisateur. Des idées? est ici tout mon code:

$(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; 
}); 

});

Répondre

8

Vous devez utiliser la forme élargie de $.post() qui est $.ajax() de sorte que vous pouvez définir l'option async false, comme ceci:

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

Actuellement, votre fonction success qui analyse la réponse se après la validation finit, car c'est une opération asynchrone. Donc actuellement, il ne retourne rien au moment où la valeur de retour est utilisée, et undefined ~ = false, c'est pourquoi il semble toujours faux. En définissant async sur false, vous laissez le code s'exécuter dans l'ordre sans le rappel, de sorte que le retour dans l'exemple ci-dessus est réellement utilisé.

Une autre alternative, si vous pouvez régler votre structure de retour de la page est d'utiliser intégré dans le plugin de validation remote option, ce qui est juste pour ce genre de chose :)

+0

désolé :(il ne fonctionne pas, je retourne faux ai changé la fonction de rappel de succès dans:. If ($ ("message", xml) .text() == "Disponible") return true; else return false; –

+1

@abdullah - Il n'y a pas de différence dans cette fonction 'return', juste du code supplémentaire ... si la réponse que vous avez posté fonctionne mais que celle-ci ne contient pas le fichier php –

+0

@Nick: Je pense que le problème était le retour de la fonction dummy dans le paramètre après "checkAvailability", qui est la fonction (value, element) {} . rien ~ = faux, droite? Il a juste fait une fonction ajax qui a retourné de la valeur. Mais "la fonction (valeur, élément)" n'a rien retourné elle-même. Je suis un débutant, seulement mes pensées :) –

11

Il est OK, et travaille maintenant. Voici le code:

$(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, ce n'est peut-être pas très pertinent mais j'ai eu un problème similaire. Je n'ai rien fait avec la valeur de retour, je viens de le retourner. Et c'était toujours vrai. Donc, après quelques recherches, j'ai pensé que la valeur du serveur apparaissait comme une chaîne pour le validateur. Tant que ce n'était pas une chaîne vide, cela reviendrait vrai. Donc la solution était d'utiliser eval();

Un exemple:

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

donc si elle retourne vrai , eval retournera boolean true, et s'il retourne false, eval retournera boolean false. droite? –

+0

oui, c'est correct! – Dmitry

Questions connexes