首页 > 代码库 > 基于jqeury/zepto的年/月/日 时:分:秒 时间快捷控件(支持键盘操作)

基于jqeury/zepto的年/月/日 时:分:秒 时间快捷控件(支持键盘操作)

     最近在项目中屡次遇到时分秒格式的时间输入需求, 还老被吐槽说这个时间输入贼蛋疼,一不小心就输错,而且花费的时间不少.为了堵住悠悠用户之口,也为了今后有需求能直接拿来使用~~so整了这个简易的小控件.支持根据默认时间格式自动生成对应格式控件,支持键盘上下按键调整时间(长按连续调整), 支持键盘左右按键切换时间输入位置,当然...时间控件的位置完全可以自行定义

     

     HTML和CSS狠简单:  

<style>    form, p, span, div, ul, li, input, dl, dt, dd, h1, h2, h3, h4, h5, h6, fieldset{margin:0;padding:0;color:#333;font-size:12px;}    input{outline:none;height:30px;line-height:30px;}    .timefield{display:inline-block;width: auto;margin-left: 0;}    .dot{border:0;background:transparent;width:6px;}    .Y,.M,.D,.HH,.MM,.SS{border:0;background:transparent;width:18px;padding:0 2px;text-align:center;}    .Y{width:30px;}    .timer{display:block;width:auto;border:1px solid #ccc;margin:0px 5px 0 0;line-height:22px;padding:0 10px;}</style><p>    <span>时间:</span>    <input type="text" name="time1" class="timefield" value="2014-09-04 00:05:00"><br><br>    <span>时间:</span>    <input type="text" name="time2" class="timefield" value="09-04 00:06:00"></span><br><br>    <span>时间:</span>    <input type="text" name="time3" class="timefield" value="09/04 00:06:00"></span><br><br>    <span>时间:</span>    <input type="text" name="time4" class="timefield" value="00:06:00"></span><br></p>

 

      JS其实更简单:

  1 /*  2 timefield version 1.0  3 Copyright 2014  4 Dual licensed under the MIT or GPL Version 2 licenses.  5 author "冷月(kentpan)"  6 http://code.google.com/p/kentpan/  7 http://www.cnblogs.com/kentpan/  8 */  9 (function (global, factory) { 10   if (typeof exports === "object" && exports) { 11     factory(exports); // CommonJS 12   } else if (typeof define === "function" && define.amd) { 13     define([‘exports‘], factory); // AMD 14   } else { 15     factory(global.MKT = {}); // <script> 16   } 17 }(this, function (exports) { 18  19     var TimeFields = function(root){ 20         this.data =http://www.mamicode.com/ { 21             expr: /(\-|\:|\s|\/|年|月|日|时|分|秒)/ig, 22             timer: { 23                 Y: 9999, 24                 M: 12, 25                 D: function(year,month){ 26                     var count=0 27                     switch(parseInt(month)){ 28                         case 1: 29                         case 3: 30                         case 5: 31                         case 7: 32                         case 8: 33                         case 10: 34                         case 12: 35                             count=31; 36                             break; 37                         case 4: 38                         case 6: 39                         case 9: 40                         case 11: 41                             count=30; 42                             break; 43                         case 2: 44                             count= (year%4==0) ? 29 : 28; 45                             ((year%100==0)&(year%400!=0)) && (count=28); 46                             break; 47                     } 48                     return count; 49                 }, 50                 HH: 23, 51                 MM: 59, 52                 SS: 59 53             } 54         }; 55         this.setTimer(root); 56     }; 57     TimeFields.prototype = { 58         setRealTimer: function(oTimer,oInput){ 59             var oEl   = oTimer.find(‘input‘); 60             var _this = this; 61             var val   = ‘‘; 62             var _time = []; 63             $.each(oEl,function(){ 64                 var me = $(this); 65                 if(me.is(‘.timeitems‘)){ 66                     var max = _this.data.timer[this.className.replace(/(\s+)?timeitems(\s+)?/i,‘‘)]; 67                     if(typeof max === ‘function‘){ 68                         max = max(oEl.filter(‘.Y‘).val(),oEl.filter(‘.M‘).val()); 69                     } 70                     if(!!max){ 71                         var min = me.is(‘.Y,.M,.D‘) ? 1 : 0; 72                         val = _this.parseTimer(this.value,max,min); 73                         $(this).val(val); 74                     } 75                 }else{ 76                     val = this.value; 77                 } 78                 !!val && _time.push(val); 79             }); 80             _time.length && oInput.prop(‘value‘,_time.join(‘‘)); 81         }, 82         parseTimer: function(val,max,min){ 83             var _min = typeof min !== ‘undefined‘ ? min : 0; 84             if(val < 10){ 85                 val = (val - 0 < _min) ? max : ‘0‘ + parseInt(val); 86             }else if(val > max){ 87                 val = ‘0‘ + min; 88             } 89             return val; 90         }, 91         TimerChange: function(oEl,key,max){ 92             (this.data.delayTimer && !!this.data.delayTimer) && clearTimeout(this.data.delayTimer); 93             var val  = oEl.val() - 0; 94             val = key == 38 ? ++val : --val; 95             var min = oEl.is(‘.Y,.M,.D‘) ? 1 : 0; 96             val = this.parseTimer(val,max,min); 97             oEl.val(val); 98             this.data.delayTimer = setTimeout(function(){ 99                 TimeFields.TimerChange(oEl,key,max);100             },300);101         },102         TimerKeyup: function(oTimer,oInput){103             (!!this.data.delayTimer) && clearTimeout(this.data.delayTimer);104         },105         TimerKeydown: function(oEl,key){106             switch(key){107                 case 37: //108                     var oPrev  = oEl.prevAll(‘:not([readonly])‘);109                     oPrev.length && oPrev[0].focus();110                     break;111                 case 39: //112                     var oNext  = oEl.nextAll(‘:not([readonly])‘);113                     oNext.length && oNext[0].focus();114                     break;115                 case 38: //116                 case 40: //117                     var max = this.data.timer[oEl.attr(‘class‘).replace(/(\s+)?timeitems(\s+)?/i,‘‘)];118                     if(typeof max === ‘function‘){119                         max = max(oEl.siblings(‘.Y‘).val(),oEl.siblings(‘.M‘).val());120                     }121                     this.TimerChange(oEl,key,max);122                     break;123             }124         },125         checkTimer: function(oEl,oTimer,oInput){126             var val  = $.trim(oEl.val());127             var name = oEl.attr(‘class‘);128             if(val < 10 && val.length < 2){129                 val = ‘0‘ + val;130             }else if(val > this.data.timer[name]){131                 val = this.data.timer[name];132             }133             oEl.val(val);134         },135         transferDate: function(data){136             var expr  = this.data.expr;137             var time  = data.replace(expr,‘@$1@‘);138             var times = time.split(‘@‘);139             var pattern = [‘SS‘,‘MM‘,‘HH‘,‘D‘,‘M‘,‘Y‘];140             data =http://www.mamicode.com/ {};141             var j = 0;142             for(var i=times.length - 1;i>=0;i--){143                 var key = pattern[j];144                 if(expr.test(times[i])){145                     key = ‘dot‘;146                 }else{147                     j++;148                 }149                 data[i] = {key:key,val:times[i]};150             }151             return data;152         },153         createTPL: function(data){154             var _this = this;155             var tpl   = [];156             tpl.push(‘<span class="timer">‘);157             $.each(data,function(i,v){158                 var key = v.key;159                 var val = v.val;160                 if(_this.data.expr.test(val)){161                     tpl.push(‘<input type="text" class="‘+key+‘" readOnly=true  value="http://www.mamicode.com/‘+val+‘" tabIndex="-1"/>‘);162                 }else{163                     tpl.push(‘<input type="text" maxlength="‘+val.length+‘" class="timeitems ‘+key+‘" value="http://www.mamicode.com/‘+val+‘" autocomplete="off"/>‘);164                 }165             });166             tpl.push(‘</span>‘);167             return tpl.join(‘‘);168         },169         createTimerField: function(oTimer,option){170             var val   = $.trim(oTimer.val());171             var _this = this;172             var data = http://www.mamicode.com/this.transferDate(val);173             var tpl = $(this.createTPL(data));174             var event    = ‘keydown keyup focus blur‘;175             var selector = ‘.timeitems‘;176             tpl.off(event,selector).on(event,selector,function(e){177                 var me   = $(this);178                 var type = e.type;179                 (!!_this.data.delayTimer) && clearTimeout(_this.data.delayTimer);180                 switch(type){181                     case ‘keydown‘:182                         var key = e.keyCode || e.witch;183                         _this.TimerKeydown(me,key);184                         break;185                     case ‘keyup‘:186                         _this.TimerKeyup();187                         break;188                     case ‘focus‘:189                     case ‘focusin‘:190                         me.css(‘background‘,‘#7FFFD4‘);191                         _this.data.delayTimer = setTimeout(function(){192                             me[0].select();193                         },200);194                         break;195                     case ‘blur‘:196                     case ‘focusout‘:197                         me.css(‘background‘,‘‘);198                         _this.setRealTimer(me.parent(‘.timer‘),oTimer);199                         break;200                 }201             });202             if(oTimer.is(‘[type="text"]‘)){203                 var Time = oTimer.clone(true);204                 Time.attr(‘type‘,‘hidden‘);205                 var oField = $(‘<span class="timefield"></span>‘);206                 oField.append(Time).append(tpl);207                 oTimer.replaceWith(oField);208                 oTimer = Time;209             }else{210                 oTimer.after(tpl);211             }212         },213         setTimer: function(root,option){214             if(!root) return;215             root = $(root);216             if(!root.is(‘input‘)) return;217             var _this = this;218             root.each(function(){219                 var me  = $(this);220                 _this.createTimerField($(this),option);221             });222         }223     };224     return window.TimeFields = window.TimeFields || TimeFields;225 }));226 227 $(function(){228     new TimeFields(‘.timefield‘);229 });

 

 

       因为时间关系,没来得兼容AMD规范~~~有空了再整改吧.以上

 

     ===================== PS: 趁着还没下班~~赶紧加上AMD规范支持~~~~ ^_^ ==============================

 

基于jqeury/zepto的年/月/日 时:分:秒 时间快捷控件(支持键盘操作)