2010-06-05 82 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