.post внутри jQuery.validator.addMethod всегда возвращает false - PullRequest
7 голосов
/ 06 июня 2010

Я очень новичок в программировании на 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;
});

});

Ответы [ 3 ]

11 голосов
/ 06 июня 2010

Все нормально, и работает сейчас. Вот код:

$(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;
});
});
8 голосов
/ 06 июня 2010

Вам необходимо использовать расширенную форму $.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 плагина проверки , которая предназначена именно для такого рода вещей:)

2 голосов
/ 04 сентября 2010

ОК, это может быть не так уж важно, но у меня была похожая проблема. Я ничего не делал с возвращаемым значением, я просто вернул его. И это всегда было правдой. Итак, после некоторого возни я понял, что значение с сервера отображается как строка для валидатора. Пока это не пустая строка, она вернет 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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...