首页 > 网站 > WEB开发 > 正文

一个简单的日期输入格式化控件。

2024-04-27 14:12:10
字体:
来源:转载
供稿:网友
一个简单的日期输入格式化控件。

js代码有一百多行。

先上效果图

html代码

日期: <input type="text" id="dateInputer" class="hhm-dateInputer" placeholder="请输入日期">

设置input元素类名为 hhm-dateInputer,通过这个类来绑定这个日期输入控件。

js代码

这里应用了jQuery的库, 主要用于选择元素和绑定事件。

<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>

因为有大量的获取和设置光标位置操作,用到了上一篇博客介绍的几个工具函数。

 1 //获取光标位置  2 function getCursor(elem) { 3      //IE 9 ,10,其他浏览器 4      if (elem.selectionStart !== undefined) { 5          return elem.selectionStart; 6      } else { //IE 6,7,8 7          var range = document.selection.createRange(); 8          range.moveStart("character", -elem.value.length); 9          var len = range.text.length;10          return len;11      }12  }13 //设置光标位置14  function setCursor(elem, index) {15      //IE 9 ,10,其他浏览器16      if (elem.selectionStart !== undefined) {17          elem.selectionStart = index;18          elem.selectionEnd = index;19      } else { //IE 6,7,820          var range = elem.createTextRange();21          range.moveStart("character", -elem.value.length); //左边界移动到起点22          range.move("character", index); //光标放到index位置23          range.select();24      }25  }26 //获取选中文字27  function getSelection(elem) {28      //IE 9 ,10,其他浏览器29      if (elem.selectionStart !== undefined) {30          return elem.value.substring(elem.selectionStart, elem.selectionEnd);31      } else { //IE 6,7,832          var range = document.selection.createRange();33          return range.text;34      }35  }36 //设置选中范围37  function setSelection(elem, leftIndex, rightIndex) {38      if (elem.selectionStart !== undefined) { //IE 9 ,10,其他浏览器39          elem.selectionStart = leftIndex;40          elem.selectionEnd = rightIndex;41      } else { //IE 6,7,842          var range = elem.createTextRange();43          range.move("character", -elem.value.length); //光标移到0位置。44          //这里一定是先moveEnd再moveStart45          //因为如果设置了左边界大于了右边界,那么浏览器会自动让右边界等于左边界。46          range.moveEnd("character", rightIndex);47          range.moveStart("character", leftIndex);48          range.select();49      }50  }

------------------------- Boom! -----------------------

先讲讲主要的思路。 其实是可以画个图这里的,不过我都不晓得该怎么画,大家提提意见。

首先找到类名为hhm-dateInputer的元素。

给它绑定两个事件处理函数。 keydown、focus 、blur

  focus

    判断如果input元素内容为空,那么设置其初始值为"____-__-__"

  blur (感谢下面评论里小伙伴的建议,加上这个事件更加完美)

    判断如果input元素内容为初始值"____-__-__",将其值置为空""

keydown

    为什么不是keyup,而是keydown: 我们知道,keydown事件发生时,键盘上的字符还没有输入到输入框中,这很重要。如果需要,我们在程序中就可以阻止不合适的字符输入。

    1.首先从事件对象event中取得keyCode值,判断为数字时,将数字后面的下划线删除一位。

    2.keyCode值代表删除键时,删除数字,添加一位下划线。

    3.keyCode的其他情况返回false,阻止字符的输入。

    上面一二步会用到setTimeout函数,在其中执行某些操作。 使用这个函数是因为keyup事件中按键字符实际还没有作用到文本框中,setTimeout中的操作可以解决这个问题。

  

另外代码中还有一个很重要的方法 resetCursor,程序中多次调用这个方法来把光标设置到合适的输入位置。

 //设置光标到正确的位置 function resetCursor(elem) {     var value = elem.value;     var index = value.length;     //当用户通过选中部分文字并删除时,此时只能将内容置为初始格式洛。     if (elem.value.length !== dateStr.length) {         elem.value = dateStr;     }     //把光标放到第一个_下划线的前面     //没找到下划线就放到末尾     var temp = value.search(/_/);     index = temp > -1 ? temp : index;     setCursor(elem, index); }

完整的js代码贴在下面咯。

  

  1      $(function(){  2          var inputs = $(".hhm-dateInputer");  3          var dateStr = "____-__-__";  4          inputs.each(function(index,elem){  5              var input = $(this);  6              input.on("keydown",function(event){  7                  var that = this;   //当前触发事件的输入框。  8                  var key = event.keyCode;  9                  var cursorIndex = getCursor(that); 10  11                  //输入数字 12                  if(key >= 48 && key <= 57){ 13                      //光标在日期末尾或光标的下一个字符是"-",返回false,阻止字符显示。 14                      if(cursorIndex == dateStr.length || that.value.charAt(cursorIndex) === "-") {return false;} 15                      //字符串中无下划线时,返回false 16                      if(that.value.search(/_/) === -1){return false;} 17  18                      var fron = that.value.substring(0,cursorIndex); //光标之前的文本 19                      var reg = /(/d)_/; 20                      setTimeout(function(){ //setTimeout后字符已经输入到文本中 21                          //光标之后的文本 22                          var end = that.value.substring(cursorIndex,that.value.length); 23                          //去掉新插入数字后面的下划线_ 24                          that.value = fron + end.replace(reg,"$1"); 25                          //寻找合适的位置插入光标。 26                          resetCursor(that); 27                      },1); 28                      return true; 29                      //"Backspace" 删除键 30                  }else if( key == 8){ 31  32                      //光标在最前面时不能删除。  但是考虑全部文本被选中下的删除情况 33                      if(!cursorIndex && !getSelection(that).length){ return false;} 34                      //删除时遇到中划线的处理 35                      if(that.value.charAt(cursorIndex -1 ) == "-"){ 36                          var ar = that.value.split(""); 37                          ar.splice(cursorIndex-2,1,"_"); 38                          that.value = ar.join(""); 39                          resetCursor(that); 40                          return false; 41                      } 42                      setTimeout(function(){ 43                          //值为空时重置 44                          if(that.value === "") { 45                              that.value = "____-__-__"; 46                              resetCursor(that); 47                          } 48                          //删除的位置加上下划线 49                          var cursor = getCursor(that); 50                          var ar = that.value.split(""); 51                          ar.splice(cursor,0,"_"); 52                          that.value = ar.join(""); 53                          resetCursor(that); 54                      },1); 55  56                      return true; 57                  } 58                  return false; 59  60              }); 61              input.on("focus",function(){ 62                  if(!this.value){ 63                      this.value = "____-__-__"; 64                  } 65                  resetCursor(this); 66              }); 67              input.on("blur",function(){ 68                  if(this.value === "____-__-__"){ 69                      this.value = ""; 70                  } 71              }); 72          }); 73          //设置光标到正确的位置 74          function resetCursor(elem){ 75              var value = elem.value; 76              var index = value.length; 77              //当用户通过选中部分文字并删除时,此时只能将内容置为初始格式洛。 78  79              if(elem.value.length !== dateStr.length){ 80                  elem.value = dateStr; 81              } 82              var temp = value.search(/_/); 83              index =  temp> -1? temp: index; 84              setCursor(elem,index); 85              //把光标放到第一个_下划线的前面 86              //没找到下划线就放到末尾 87          } 88      }); 89  90      function getCursor(elem){ 91          //IE 9 ,10,其他浏览器 92          if(elem.selectionStart !== undefined){ 93              return elem.selectionStart; 94          } else{ //IE 6,7,8 95              var range = document.selection.createRange(); 96              range.moveStart("character",-elem.value.length); 97              var len = range.text.length; 98              return len; 99          }100      }101      function setCursor(elem,index){102          //IE 9 ,10,其他浏览器103          if(elem.selectionStart !== undefined){104              elem.selectionStart = index;105              elem.selectionEnd = index;106          } else{//IE 6,7,8107              var range = elem.createTextRange();108              range.moveStart("character",-elem.value.length); //左边界移动到起点109              range.move("character",index); //光标放到index位置110              range.select();111          }112      }113      function getSelection(elem){114          //IE 9 ,10,其他浏览器115          if(elem.selectionStart !== unde
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表