Jquery和ajax,我的用户名检查功能?

时间:2011-09-19 12:37:07

标签: php jquery ajax

我已经写了这个用户名检查的ajax请求......

function check_username() {
    var username = $("#username").val();
    $('.loading').fadeIn().delay(100);
    $.post("ajax.php", {
        username: $('#username').val(),
    }, function (response) {
        $('.error, .success').hide();
        setTimeout(function () {
            $('.loading').hide();
            finishAjax('username', response);
        }, 1000);
    });
    return false;
}

function finishAjax(id, response) {
    $('#' + id).after(response).fadeIn(1000);
}

这一切都可以解决几个问题,

  1. 这段代码能否以任何方式得到改进,这是我写的第一篇,所以我不知道。

  2. 有没有办法让这个函数成为我所有的ajax请求,而不仅仅是用户名检查,所以它也可以用于电子邮件检查等等。我不确定如何创建这样的函数我是否必须在附加到我的表单的onblur事件上传递变量,在它看起来像这样。

  3. 有没有办法阻止ajax运行如果前面有相同的错误,即字符串长度应该超过3,所以有人输入AJ,错误信息'必须超过3个字符'然后,用户再次使用AJ或CG的值触发onb​​lur事件,然后出现相同的错误,触发无用且使用内存的脚本。

  4. 有没有办法用用户输入的每个字符发出ajax请求?

  5. 我的ajax php如下......

    <?php
    
    require('dbc.php');
    
    if (isset($_REQUEST['username'])) {
    
      $q = $dbc -> prepare("SELECT username FROM accounts WHERE username = ?");
      $q -> execute(array($_REQUEST['username']));
    
      if (strlen($_REQUEST['username']) < 3) {
        echo '<div class="error">Has to be at least 3 characters</div>';
      } 
      elseif ($q -> rowCount() > 0) {
        echo '<div class="error">Username already taken</div>';
      } 
      else {
        echo '<div class="success">Username available</div>';
      }
    }
    
    ?>
    

1 个答案:

答案 0 :(得分:1)

回答1&amp;我会把它变成一个插件并按照这些方式做点什么。

$.fn.checkValid = function(options)
{
    var response = function(response) {
        var setClass = '';
        var $span = $(this).data('checkValidTip');
        if ($span)
        {
            $span.remove();
        }

        if (response === undefined) return;

        setClass = (response.valid ? 'valid' : 'invalid');

        var $span = $('<span>' + response.msg + '</span>');
        $(this)
            .data('checkValidTip', $span)
            .after($span);

        $span.hide()
             .fadeIn(1000)[0]
             .className = setClass;
    };


    var ajaxOptions = {
        type: 'GET',
        url: 'ajax.php',
        success: response,
        dataType: 'json'
    };

    this.each(function() {

        var that = this;
        var ajaxRequest = ajaxOptions;
        ajaxRequest.data = {};
        ajaxRequest.data[options.key] = this.value;
        ajaxRequest.context = that

        $.ajax(ajaxRequest);
    });
};

用法

$('#username, #email').blur(function() {
    $(this).checkValid({ key: this.id });
});

PHP更改

你应该让你的PHP函数返回一个JSON,而不是HTML,即

<?php
   // Do your sql statements here, decide if input is valid or not

   $arr = array('valid' => $is_valid,
                'msg'   => $error_or_good_msg
               );

  echo json_encode($arr);

 /* For example will output:
   {
      "valid": "false",
      "msg": "<b>Error: Must be at least 2 characters</b>"
    }
  Which can be read directly as response.valid
  or response.msg from within response() function
 */

回答问题3:简答回答是否定的。为此,您应该在JS中进行基本验证。最好的选择是使用一个使用对象作为验证参数的插件,这样您就可以使用json_encode从PHP内部动态地输出验证要求,即输出格式为:

var validations = {
    username: {
      min_chars: 4,
      max_chars: 10,
      valid_chars: 'qwertyuiopasdfghjklzxcvbnm_-'
    },

    email: {
       regex: /./ //your magic regex here
  }
};

的jsfiddle

http://jsfiddle.net/sqZfp/2/

要回答4,只需将上述事件从.blur更改为.keyup即可。