jQuery Validation插件

时间:2010-08-26 17:06:01

标签: php jquery jquery-validate

我真的试图避免问这个问题。关于这个插件,我已经看过很多关于SO的帖子,但他们仍然没有得到它。现在我有一个新的帐户注册表单,我正在尝试编写一个自定义方法来验证唯一的用户名。我想以下应该有效:

$.validator.addMethod(
        "uniqueUsername", 
        function(value, element) {
            $.post(
                "http://" + location.host + "/scripts/ajax/check_username.php",
                {
                    username: value
                },
                function(response) {
                    if(response == 'true') {
                        return true;
                    } else {
                        return false;
                    }
                }
            );
        },
        "This username is already taken."
    );

不幸的是,无论回调函数如何,插件都会继续运行。我发现有人建议做类似以下的事情:

var result = false;
    $.validator.addMethod(
        "uniqueUsername", 
        function(value, element) {
            $.post(
                "http://" + location.host + "/scripts/ajax/check_username.php",
                {
                    username: value
                },
                function(response) {
                    if(response == 'true') {
                        result = true;
                    } else {
                        result = false;
                    }
                }
            );
            return result;
        },
        "This username is already taken."
    );

但它似乎有一个延迟,因为它存储了值,然后在下一个事件将设置任何值。你们推荐什么?

2 个答案:

答案 0 :(得分:2)

由于这是一个异步检查,它周围需要更多(你不能从这样的函数返回一个值,在你的情况下它总是假的)。内置方法是remote,使用方式如下:

$("form").validate({
  rules: {
    username: {
      remote: {
        url: "http://" + location.host + "/scripts/ajax/check_username.php",
        type: "post"
      }
    }
  }  
});

这将POST username: valueofElement,因为规则是针对名为username的元素。如果验证通过,您的服务器端脚本应返回true,否则false如果用户名已被false,则返回{{1}}。

You can read more about the remote option here,包括如何在需要时传递其他数据参数。

答案 1 :(得分:-1)

js code

username: {
        required: true,
        minlength: 5,
        remote: '/userExists'
       },

用于检查是否存在的Php代码并返回消息

public function userExists()
{
    $user = User::all()->lists('username');
    if (in_array(Input::get('username'), $user)) {
        return Response::json(Input::get('username').' is already taken');
    } else {
        return Response::json(Input::get('username').' Username is available');
    }
}