基于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 = {
 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,‘@[email protected]‘);
138             var times = time.split(‘@‘);
139             var pattern = [‘SS‘,‘MM‘,‘HH‘,‘D‘,‘M‘,‘Y‘];
140             data = {};
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="‘+val+‘" tabIndex="-1"/>‘);
162                 }else{
163                     tpl.push(‘<input type="text" maxlength="‘+val.length+‘" class="timeitems ‘+key+‘" value="‘+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 = 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规范支持~~~~ ^_^ ==============================

时间: 2024-08-26 06:47:42

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

JavaScript基础 Date(年,月,日,时,分,秒,毫秒) 多个整型赋值

镇场诗: 清心感悟智慧语,不着世间名与利.学水处下纳百川,舍尽贡高我慢意. 学有小成返哺根,愿铸一良心博客.诚心于此写经验,愿见文者得启发.------------------------------------------ code: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=ut

ASP.NET 日期 时间 年 月 日 时 分 秒 格式及转换

在平时编码中,经常要把日期转换成各种各样的形式输出或保持,今天专门做了个测试,发现DateTime的ToString()方法居然有这么多的表现形式,和大家一起分享. DateTime time=DateTime.Now;   //2010-5-28  11:22:02.4552691 星期五               ime.To("y")                         "2010年5月"               time.To("

Java 获取年 月 日 时 分 秒

/** * 英文简写(默认)如:2010-12-01 */ public static String FORMAT_SHORT = "yyyy-MM-dd"; /** * 英文全称 如:2010-12-01 23:15:06 */ public static String FORMAT_LONG = "yyyy-MM-dd HH:mm:ss"; /** * 精确到毫秒的完整时间 如:yyyy-MM-dd HH:mm:ss.S */ public static Str

获取当前时间(年/月/日/时/分/秒)

struct tm* GetCurTime(time_t inTime) { struct tm* curTime = localtime(&inTime); curTime->tm_year += 1900; curTime->tm_mon += 1; return curTime; }

js将当前时间格式化为年-月-日 时:分:秒

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Time</title> </head> <body> <script type="text/javascript"> var d=new Date(); var year=d.getFullYear(

mysql 获取系统时间的下一天 年-月-日 时:分:秒

select (NOW() + INTERVAL 1 DAY) as date 原文地址:https://www.cnblogs.com/shikaijie/p/9932433.html

WeUI移动页面实现时间选择器(年-月-日-时-分)

在做微信公众号的时候,使用的WeUI样式,有一个需求是用户选择一个预约时间,需要年月日并精确到小时和分钟. 但是WeUI的picker组件不支持直接显示5列,根据WeUI.js作者的建议,是将日期和时间选择作为两个选择器来实现. 所以我的实现思路是先选择日期,然后自动跳出时间选择,来模仿一个时间选择器.日期属于datepicker,时间属于普通的picker. 效果图: 点击期望时间跳出datepicker: 在选择时间并确定后跳出时间选择,这是一个普通picker: 之后就可以对选择的时间做处

JS实现倒计时(天数,时,分,秒)

<!DOCTYPE html> <html> <head> <meta charset="utf-8" > <title>JS实现倒计时(天数,时,分,秒)</title> <link rel="stylesheet" type="text/css" href="../css/reset.css"> <link rel="sty

WPF加载Winform窗体时 报错:子控件不能为顶级窗体

一.wpf项目中引用WindowsFormsIntegration和System.Windows.Forms 二.Form1.Designer.cs 的 partial class Form1 设置为:public partial class Form1 三.代码如下: XXXX.Form1 Zhuwindow = new XXXX.Form1(); Zhuwindow.TopLevel = false; Zhuwindow.FormBorderStyle = System.Windows.Fo