2010-06-05 49 views
7

Tôi rất mới để lập trình jQuery và javascript. Tôi có một chương trình dưới đây kiểm tra xem tên người dùng có được thực hiện hay không. Hiện tại, tập lệnh PHP luôn trả về.post bên trong jQuery.validator.addMethod luôn trả về false

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

Chức năng đăng nhập hoạt động nhưng kiểm tra tên người dùng thì không. Bất kỳ ý tưởng? Đây là tất cả mã của tôi:

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

});

Trả lời

8

Bạn cần phải sử dụng các hình thức mở rộng của $.post() đó là $.ajax() để bạn có thể thiết lập các tùy chọn async false, như thế này:

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

Hiện nay chức năng success của bạn để phân tích các phản ứng xảy ra sau xác nhận kết thúc, bởi vì nó là một hoạt động không đồng bộ. Vì vậy, hiện tại, nó không trả lại bất cứ điều gì tại thời điểm giá trị trả về được sử dụng và undefined ~ = false, đó là lý do tại sao nó luôn xuất hiện sai. Bằng cách đặt async thành false, bạn cho phép mã thực thi theo thứ tự mà không cần gọi lại, do đó, lợi tức trong ví dụ trên thực sự được sử dụng.

Một lựa chọn khác, nếu bạn có thể điều chỉnh cơ cấu lợi nhuận của trang của bạn là sử dụng các plugin xác nhận tích hợp trong remote option, đó là chỉ các loại điều này :)

+0

xin lỗi :(nó không hiệu quả, trả về false Tôi đã thay đổi chức năng gọi lại thành công vào:. If ($ ("thông báo", xml) .text() == "Có sẵn") trả về true, khác trả về false; –

+1

@abdullah - Không có sự khác biệt trong hàm 'return' đó, chỉ cần thêm mã ... nếu câu trả lời bạn đã đăng hoạt động nhưng cái này không phải là tệp php trong Câu hỏi của bạn không chính xác và bạn nên cập nhật câu hỏi –

+0

@Nick: Tôi nghĩ rằng sự cố là sự trở lại của hàm giả trong tham số sau "checkAvailability", là hàm (giá trị, phần tử) {} . không có gì ~ = sai, đúng? Nó chỉ làm một số hàm ajax trả về một số giá trị. Nhưng "hàm (giá trị, phần tử)" không trả lại bất kỳ thứ gì. Tôi là một người mới bắt đầu, chỉ là suy nghĩ của tôi mặc dù :) –

11

Đó là OK, và làm việc ngay bây giờ. Đây là mã:

$(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, điều này có thể không liên quan đến vấn đề tương tự nhưng tôi gặp phải vấn đề tương tự. Tôi đã không làm bất cứ điều gì với giá trị trả lại, tôi chỉ trả lại nó. Và điều đó luôn đúng. Vì vậy, sau khi một số poking xung quanh tôi figured rằng giá trị từ máy chủ xuất hiện như là một String để validator. Vì vậy, miễn là nó không phải là một chuỗi rỗng nó sẽ trở lại đúng sự thật. Vì vậy, giải pháp là sử dụng eval();

Một ví dụ:

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

vì vậy nếu nó trả về true , nó eval sẽ trả về boolean true, và nếu nó trả về false, eval sẽ trả về boolean false. đúng? –

+0

vâng, đúng vậy! – Dmitry

Các vấn đề liên quan