Я очень новичок в программировании jQuery и javascript. У меня есть программа ниже, которая проверяет, берется ли имя пользователя или нет. Пока что PHP-скрипт всегда возвращается
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; });
});
Вам нужно использовать расширенную форму $.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
параметр плагина проверки, который для такого рода вещей 🙂
Все нормально, и сейчас работаем. Вот код:
$(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; }); });
Хорошо, это может быть не все, что уместно, но у меня была аналогичная проблема. Я ничего не делал с возвращаемым значением, я только что вернул его. И это всегда было правдой. Итак, после некоторого тряски я понял, что значение с сервера появилось как строка для проверки. Если бы это была не пустая строка, она вернулась бы. Таким образом, решение было использовать eval ();
Пример:
jQuery.validator.addMethod("checkAvailability",function(value,element){ return eval($.ajax({ url: "/check", async: false, data: { field: $('#element').attr('name'), val: value } }).responseText); }, "error");