给input框绑定input监听事件后,再次调用函数时,函数中给input框绑定的keydown事件与input事件发生冲突了?

发布于 2022-09-05 03:54:56 字数 9677 浏览 12 评论 0

给input框绑定input监听事件后,再次调用函数时,函数中给input框绑定的 keydown事件与input事件发生冲突了?

($(function(){
      //算出最大年份和最小年份

      var i;
      var date =[-1,-1,-1,-1,-1,-1,-1,-1];
      var valReplace;
      var yearStar = 0;
      var yearCount = 4;
      var monthStar = yearCount+yearStar+1;
      var monthCount =2;
      var dayStar = monthCount+monthStar+1;
      var dayCount = 2;
      var nowYear = new Date().getFullYear();
      var nowYearNum = parseInt(nowYear);
      var maxYear = nowYearNum-150;
      var minYear = nowYearNum+120;
      var maxMonth = "12";
      var minMonth = "01";
      var maxDay = "31" ;
      var minDay = "01";
      var pos;
      var adds;
      var gCp;
              // console.log($.type(maxYear))
    //获取光
    $.fn.getCursorPosition = function() {
        var el = $(this).get(0);
        var pos = 0;
        if ('selectionStart' in el) {
            pos = el.selectionStart;
        } else if ('selection' in document) {
            el.focus();
            var Sel = document.selection.createRange();
            var SelLength = document.selection.createRange().text.length;
            Sel.moveStart('character', -el.value.length);
            pos = Sel.text.length - SelLength;
        }
        return pos;
    }


    //鼠标悬浮,改变placeholder的颜色
    $(".m-date").mousemove(function(){
       $(this).attr('placeholder','yyyy年mm月dd日');
       $(this).addClass('m-input');
   }).mouseout(function(){
       $(this).attr('placeholder','出生日期');
       $(this).removeClass('m-input');
   });


    //当鼠标焦点聚集时,增加value值
    $(".m-date").focus(function(){
        $(this).val("yyyy年mm月dd日");
         //当值改变是添加监听事件
         $(".m-date").on('input',function(){
            var inputVal=$(".m-date").val();

               //重新获取value的值
               var addss;
                    var gCp=$(".m-date").getCursorPosition();//获取光标的位置
                    var maxF =parseInt(maxYear.toString().substring(yearStar,gCp))
                    var minF =parseInt(minYear.toString().substring(yearStar,gCp))
                    var maxM =parseInt(maxMonth.substring(0,gCp-5))
                    var minM =parseInt(minMonth.substring(0,gCp-5))
                    var adds = inputVal.split("");

                // 位数分配
                if(yearCount+monthCount+dayCount != date.length){
                    return false;
                }
                //判断光标的下标
                function positionToIndex(){
                    var yearCursor = 0;
                    var monthCursor =6;
                    var dayCursor = 9;
                    if(gCp>yearCursor&&gCp<=yearCursor+yearCount){
                        return gCp-1;

                    }
                    if(gCp>=monthCursor&&gCp<=monthCursor+monthCount){
                        return gCp-2;
                    }
                    if(gCp>=dayCursor&&gCp<=dayCursor+dayCount){
                        return gCp-3;
                    }

                }
                var pos=positionToIndex();
                var addss =adds[gCp-1] ;
                date .splice(pos,1,addss);
                valReplace=inputVal.substring(gCp,gCp+1);

                    //是否可输入年
                    if(gCp>yearStar&&gCp<=yearCount+yearStar){
                       valReplaceS=parseInt(inputVal.substring(yearStar,gCp))
                 //遍历光标前面的值是否为-1
                 for(i=yearStar;i<=pos;i++){
                   if( date[i]==-1){
                       $(".m-date").val("yyyy年mm月dd日");
                       $(".m-date").setCursorPosition(0);
                       return false
                       }
               };
                 //判断值是否符合
                 if( valReplaceS>= maxF && valReplaceS <= minF){
                             adds.splice(gCp,1);
                             // console.log( adds);
                             $(".m-date").val( adds.join(""));
                             if(gCp>=0&&gCp<4){
                               $(".m-date").setCursorPosition(gCp);
                           }else if(gCp==4){

                             $(".m-date").setCursorPosition(gCp+1);
                         }
                     }else{
                         adds.splice(gCp-1,1);
                         $(".m-date").val( adds.join(""));
                         $(".m-date").setCursorPosition(gCp-1);
                     }

                       //按下删除键是触发函数
                       deleTe(gCp,adds,"y");
                     //判断是否可输入月
                 }else if(gCp>=monthStar&&gCp<=monthCount+monthStar){
                    valReplaceS=parseInt(inputVal.substring(monthStar,gCp))
                    console.log(gCp);
                            //遍历光标前面的值是否为-1
                            for(i=monthStar-1;i<=pos;i++){
                               if( date[i]==-1){
                                   $(".m-date").val("yyyy年mm月dd日");
                                   $(".m-date").setCursorPosition(0);
                                   return false
                               }
                           };
                     //判断值是否符合
                     if(valReplaceS>= minM&&valReplaceS<=maxM) {
                       adds.splice(gCp,1);
                             // console.log( adds);
                             $(".m-date").val( adds.join(""));
                            //光标在月的地方,自动跳到下一个位置
                            if(gCp>=0&&gCp<7){
                               $(".m-date").setCursorPosition(gCp);
                           }else if(gCp==7){
                             $(".m-date").setCursorPosition(gCp+1);
                         }
                     }else{
                        adds.splice(gCp-1,1);
                             // console.log( adds);
                             $(".m-date").val( adds.join(""));
                             $(".m-date").setCursorPosition(gCp-1);
                         }

                     //是否可输入日
                 }else if(gCp>=dayStar&&gCp<=dayCount+dayStar){
                    valReplaceS=parseInt(inputVal.substring(dayStar,gCp));
                            //遍历光标前面的值是否为-1
                            for(i=dayStar-2;i<=pos;i++){
                               if( date[i]==-1){
                                   $(".m-date").val("yyyy年mm月dd日");
                                   $(".m-date").setCursorPosition(0);
                                   return false
                               }
                           };
                           var maxD = parseInt(maxDay.substring(0,gCp-8));
                           console.log(maxD);
                           var minD = parseInt(minDay.substring(0,gCp-8));
                     //判断值是否符合
                     if(valReplaceS>=minD&&valReplaceS<=maxD) {
                      adds.splice(gCp,1);
                             // console.log( adds);
                             $(".m-date").val( adds.join(""));
                             if(gCp>=0&&gCp<10){
                               $(".m-date").setCursorPosition(gCp);
                           }else if(gCp==10){
                            $(".m-date").setCursorPosition(gCp+1);
                        }
                    }else{
                     adds.splice(gCp-1,1);
                             // console.log( adds);
                             $(".m-date").val( adds.join(""));
                             $(".m-date").setCursorPosition(gCp-1);
                         }

                     }



        });
    });

function deleTe (gCl,abb,q){
     var flag = true;
 $(".m-date").on("keydown", function keyDown(event) {
        var k = event.keyCode ;
        if(k ==8||k ==46){
           abb.splice(gCl-1,1,q)
           $(".m-date").val( abb.join(""));
           $(".m-date").setCursorPosition(gCl-1);
       }
       if(flag){
          $(".m-date").unbind("keydown");
          flag = false;
       }

   });

}


}));

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>日期插件</title>
    <link rel="stylesheet" type="text/css" href="../../css/date/date.css">
</head>
<body>
<div class="m-box">
    <div class="m-content">
         <input type="text" name="m-date" placeholder="出生日期" id="m-date" class="m-date">
    </div>
</div>
<script src="../../js/commen/jquery-3.2.1.min.js"></script>
<script src="../../plugin/date/dateplug.js"></script>
<script src="../../js/date/date.js"></script>
</body>
</html>

移动光标的插件

 //SET CURSOR POSITION
$.fn.setCursorPosition = function(pos) {
                     this.each(function(index, elem) {
                             if (elem.setSelectionRange) {
                                    elem.setSelectionRange(pos, pos);
                                          } else if (elem.createTextRange) {
                                               var range = elem.createTextRange();
                                               range.collapse(true);
                                               range.moveEnd('character', pos);
                                               range.moveStart('character', pos);
                                               range.select();
                                         }
                                            });
                                            return this; };

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

眼睛会笑 2022-09-12 03:54:56

去多看下文档吧,input事件可以实时监听然后执行回调,与此同时你绑定了keydown,当键盘按键起来的时候,文本域的值发生了变化,不冲突才怪。。。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文