2010-06-05 95 views
7

我对jQuery和javascript编程非常新颖。我有一个下面的程序检查用户名是否被占用。目前,PHP脚本始终返回。jQuery.validator.addMethod中的.post总是返回false

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

登录函数可以工作,但用户名检查不会。有任何想法吗? 这里是我的所有代码:

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

});

回答

8

您需要使用的$.post()的扩展形式是$.ajax()所以你可以async选项设置为false,像这样:

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

目前您success功能分析验证后的反应情况完成,因为它是一个异步操作。所以目前,在返回值被使用时它不会返回任何东西,并且undefined〜= false,这就是为什么它总是显示为假的原因。通过将async设置为false,您可以让代码在没有回调的情况下执行,因此实际使用上面示例中的返回值。

另一种选择,如果你能调整你的页面的返回结构是使用验证插件的内置remote option,这是只是这样的事情:)

+0

对不起:(它没有工作,返回false我已经改变了成功的回调函数为:如果($( “信息”,XML)的.text()== “Available”)return true; else return false; – 2010-06-06 08:09:55

+1

@abdullah - 这个'return'函数没有什么区别,只是额外的代码......如果你发布的答案有效,但是这个并不是那个php文件你的问题是不准确的,你应该更新它 – 2010-06-06 09:57:43

+0

@Nick:我认为问题是虚拟函数返回“checkAvailability”之后的参数,它是函数(值,元素){} 。实际上,它返回什么〜=假, 对?它只是做了一些ajax函数,它返回了一些值。但是“函数(值,元素)”本身并没有返回任何东西。我是一个初学者,只是我的想法虽然:) – 2010-06-06 21:41:28

11

这是确定的,而现在的工作。这里是代码:

$(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

好吧,这可能不是所有相关的,但我有一个类似的问题。我没有对返回值做任何事情,我只是将它返回。它总是如此。所以,经过一番周折之后,我发现服务器的值显示为验证器的字符串。只要它不是空字符串,它就会返回true。所以解决方案是使用eval();

一个例子:

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

所以如果它返回true ,它的eval将返回布尔值true,如果返回false,则eval将返回布尔值false。对? – 2010-09-05 11:08:27

+0

是的,没错! – Dmitry 2010-09-05 17:30:16