美文网首页
js实现类似支付密码的功能并进行校验

js实现类似支付密码的功能并进行校验

作者: 晴天小猪L | 来源:发表于2018-02-04 18:09 被阅读0次

最近做项目,写了类似支付密码那样的连续输入框,但是校验的时候遇到了问题,接下来就总结一下。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>多个输入框校验</title>
    <style type="text/css">
      *{
        margin: 0;
        padding: 0;
      }
      #inputBox{
        border: 1px solid #d9d9d9;
        width: 122px;
        font-size: 14px;
        overflow: hidden;
      }
      .num{
        border: none;
        width: 20px;
        padding: 10px;
        float: left;
        border-right: 1px solid #d9d9d9;
        text-align: center;
      }
      .num:last-child{
        border-right: none;
      }
      .error{
        color: red;
        display: none;
      }
    </style>
  </head>
  <body>
    <div id="inputBox" class="box">
      <input type="text" class="one num"/>
      <input type="text" class="two num"/>
      <input type="text" class="three num"/>
    </div>
    <p class="error">不能为空</p>
    <input type="text" class="realInput"/>
  </body>
  <script src="js/jquery.js" charset="utf-8"></script>
  <script type="text/javascript">
    function autoFocus (box) {
      var $inputBox = $('#' + box);
      var $inputs = $inputBox.find('input');
      var inputLength = $inputBox.find('input').length;
      for (var i = 0; i < inputLength; i ++) {
        t = $inputs[i];
        t.index = i;
        $(t).keyup(function (e) {
          var reg = /\d{1}/;
          var val = $(this).val();
          var prev = $(this)[0].index - 1;
          var next = $(this)[0].index + 1;
          if ((e.keyCode === 37 || e.keyCode === 8) && prev >= 0) {
            $inputs[prev].focus();
          }
          if (e.keyCode === 39 && next <= inputLength -1) {
            $inputs[next].focus();
          }
          if (reg.test(val)) {
            if (next > inputLength - 1) {
              return;
            }
            if ($($inputs[next]).val()) {
              return;
            }
            $inputs[next].focus();
          }
        })
      }
    };
    autoFocus('inputBox');
  </script>
</html>

以上这段代码,实现的是输入框,输入一位数字后,下一个输入框自动得焦,方向键和del键也可用。

大家一定发现,上面多出一个输入框,这个输入框,先留着,后面大有用处。

那么接下来就是验证,我这里主要介绍两个方法。第一个就是输入框得焦之后,给父元素添加标记,然后输入框失焦之后进行校验。这个校验是触发输入框得焦失焦之后才进行,这个标记就是为了不在用户首次进入页面之后就进行校验,而是输入框触发得焦失焦之后再校验。

// 父元素添加标记

    $('.num').focus(function () {

      $('#inputBox').attr('data-dirty', 'true');

    });

    $('body').click(function (e) {

      if (!$(e.target).hasClass('box') && !$(e.target).hasClass('num')) {

        var dirty = $('#inputBox').attr('data-dirty');

        var one = $('.one').val();

        var two = $('.two').val();

        var three = $('.three').val();

        if (dirty) {

          if (!one || !two || !three) {

            $('.error').show();

          } else {

            $('.error').hide();

          }

        }

      }

    });

以上这段代码,是在点击页面其他地方进行输入框的校验。

下面介绍第二种方法,这个方法就要用到页面中多出的输入框,把每个小输入框的值都放在这个输入框中,最后一个小输入框失焦之后,大的输入框失焦,此时对大输入框校验。在真正的项目中,这个大输入框type值应该设为hidden,这里为了展示就么有设为hidden。

// 隐藏的input框

    $('.num:last').blur(function () {

      $('.realInput').blur();

    });

    var vals = '';

    $('.num').keyup(function () {

      var val = $(this).val();

      vals += val;

      $('.realInput').val(vals);

    });

    $('.realInput').blur(function () {

      var one = $('.one').val();

      var two = $('.two').val();

      var three = $('.three').val();

      if (!one || !two || !three) {

        $('.error').show();

      } else {

        $('.error').hide();

      }

    });

好了,两种方法介绍到这里,如果还有其他的方法,欢迎大家留言讨论。

相关文章

网友评论

      本文标题:js实现类似支付密码的功能并进行校验

      本文链接:https://www.haomeiwen.com/subject/upamzxtx.html