自己写的有比较常用的三种格式的日历插件:YY-MM,YY-MM-DD,hh-mm。
下载地址
https://github.com/luoxiaowei/DateChoose/tree/master
调用方式:
<input type=\'\'text" onClick="DateChoose({type:\'YY-MM\'});" /> <input type="text" onClick="DateChoose({type:\'hh-mm\'});"/> <input type="text" onClick="DateChoose({type:\'YY-MM-DD\'});"/>
js:
;(function($,w,d){ $.fn.DateChoose = function(option){ event.stopPropagation(); function showTbody(init, year, month,day){ init.$ChooseDtbody.find(\'td\').off(\'click\'); init.$ChooseDtbody.empty(); init.currMonthDate = new Date(year+\'-\'+month+\'-\'+1); init.currMonthDateOne = new Date(year,month,0); init.currMonthLength = init.currMonthDateOne.getDate(); var k = 1; for(var tr = 0;tr<6;tr++){ var $tr = $(\'<tr></tr>\').appendTo(init.$ChooseDtbody); for(var td = 0;td<7;td++){ if(tr == 0){ if(td>=init.currMonthDate.getDay()){ k = k >= 1 && k <= 9?"0"+k:k; if(k==day){ $(\'<td class="active">\'+k+\'</td>\').appendTo($tr); }else{ $(\'<td>\'+k+\'</td>\').appendTo($tr); } k++; }else{ $(\'<td></td>\').appendTo($tr); } }else{ var tdk=k>init.currMonthLength?\'\':k; tdk = tdk >= 1 && tdk <= 9?"0"+tdk:tdk; if(tdk==day){ $(\'<td class="active">\'+k+\'</td>\').appendTo($tr); }else{ $(\'<td>\'+tdk+\'</td>\').appendTo($tr); } k++; } } } init.$ChooseDtbody.find(\'td\').on(\'click\',function(){ if($(this).text()==\'\'){ return false; } init.$ChooseDtbody.find(\'td\').removeClass(\'active\'); $(this).addClass(\'active\'); el.val(init.$monthCurr.text()+\'-\'+$(this).text()); init.$box.hide(); }); } function pointerMove(e,Line,Point,Curr,Linelength,LinelengthAvr,_this,i) { console.log(e,Line,Point,Curr,Linelength,LinelengthAvr,_this,i) e.preventDefault(); var x = 0; $(d).bind(\'mousemove\',function(e) { e.preventDefault(); x = e.pageX - Line.offset().left - Point.width()/2; x = x<=0?0:x; x = x>Linelength?Linelength:x; x -= Point.width()/2; $(_this).css(\'left\',x); currDate[i] = parseInt((x+Point.width()/2)/LinelengthAvr)<=9?\'0\'+parseInt((x+Point.width()/2)/LinelengthAvr):parseInt((x+Point.width()/2)/LinelengthAvr); Curr.text(currDate[i]+\':\'); i==0?Curr.text(currDate[i]+\':\'):Curr.text(currDate[i]); }); } var defaults = { type:\'YY-MM\', $error:$(\'.ChooseBox-error\'), $box:$(\'.ChooseBox\'), $yearbox:$(\'.Choose-year\'), $yearPrev:$(\'.Choose-year-prev\'), $yearNext:$(\'.Choose-year-next\'), $yearCurr:$(\'.Choose-year-curr\'), $monthbox:$(\'.Choose-month\'), $ChooseDbox:$(\'.Choose-day-box\'), $ChooseDbar:$(\'.Choose-day-bar\'), $monthPrev:$(\'.Choose-month-prev\'), $monthCurr:$(\'.Choose-month-curr\'), $monthNext:$(\'.Choose-month-next\'), $ChooseDtablebox:$(\'.Choose-day-table\'), $ChooseDtable:$(\'.Choose-day-table>table\'), $ChooseDtbody:$(\'.Choose-day-table>table>tbody\'), $ChooseYDbox:$(\'.Choose-yearmonth-box\'), $Choosehmbox:$(\'.ChooseTimeBox\'), $currTimebox:$(\'.Choose-time\'), $hoursbox:$(\'.Choose-hours\'), $minutesbox:$(\'.Choose-minutes\'), $btnbox:$(\'.ChooseTimeBox-btn-box\'), $hoursPoint:$(\'.Choose-hours-point\'), $hoursLine:$(\'.Choose-hours-line\'), $hoursCurr:$(\'.Choose-curr-hours\'), $minutesPoint:$(\'.Choose-minutes-point\'), $minutesLine:$(\'.Choose-minutes-line\'), $minutesCurr:$(\'.Choose-curr-minutes\'), $btn:$(\'.ChooseTimeBox-btn\'), $currbtn:$(\'.ChooseTimeBox-curr-btn\'), }; var init = $.extend(defaults,option); var el = $(this), elVal = el.val(), BoxL = el.offset().left, BoxT = el.offset().top + el.height(), date = new Date(), year = date.getFullYear(), month = date.getMonth()+1, day = date.getDate(), hours = date.getHours(), minutes = date.getMinutes(), currDate = []; hours = hours >= 0 && hours <= 9?"0" + hours:hours; minutes = minutes >= 0 && minutes <= 9?"0" + minutes:minutes; month = month >= 1 && month <= 9?"0"+month:month; day = day >= 1 && day <= 9?"0"+day:day; switch (init.type){ case \'YY-MM-DD\': init.reg = /^\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$/; if(init.reg.test(el.val())){ currDate = elVal?currDate.concat(elVal.split(\'-\')):currDate } currDate.length<=0?currDate.push(year,month,day):currDate; year = currDate[0]; month = currDate[1]; day = currDate[2]; break; case \'hh-mm\': init.reg = /^([01]\d|2[01234]):([0-5]\d|60)$/; if(init.reg.test(el.val())){ currDate = elVal?currDate.concat(elVal.split(\':\')):currDate } currDate.length<=0?currDate.push(hours,minutes):currDate; hours = currDate[0]; minutes = currDate[1]; break; case \'YY-MM\': default: init.reg = /^\d{4}-(0[1-9]|1[0-2])$/; if(init.reg.test(el.val())){ currDate = elVal?currDate.concat(elVal.split(\'-\')):currDate } currDate.length<=0?currDate.push(year,month):currDate; year = currDate[0]; month = currDate[1]; break; } init.currday = year+\'-\'+month+\'-\'+day; init.currtime = hours +\':\'+ minutes; init.currMonth = year+\'-\'+month; if(init.$box.length == 0){ init.$box = $(\'<div class="ChooseBox"></div>\').css({left:BoxL,top:BoxT}).appendTo($(\'body\')); init.$error = $(\'<span class="ChooseBox-error">格式错误</span>\').appendTo(init.$box); init.$ChooseDbox = $(\'<div class="Choose-day-box"></div>\').appendTo(init.$box); init.$ChooseDbar = $(\'<div class="Choose-day-bar"></div>\').appendTo(init.$ChooseDbox); init.$monthPrev = $(\'<span class="Choose-month-prev"><</span>\').appendTo(init.$ChooseDbar); init.$monthCurr = $(\'<span class="Choose-month-curr">\'+init.currMonth+\'</span>\').appendTo(init.$ChooseDbar); init.$monthNext = $(\'<span class="Choose-month-next">></span>\').appendTo(init.$ChooseDbar); init.$ChooseDtablebox = $(\'<div class="Choose-day-table"></div>\').appendTo(init.$ChooseDbox); init.$ChooseDtable = $(\'<table><thead><tr><th>日</th><th>一</th><th>二</th><th>三</th><th>四</th><th>五</th><th>六</th></tr></thead></table>\').appendTo(init.$ChooseDtablebox); init.$ChooseDtbody = $(\'<tbody></tbody>\').appendTo(init.$ChooseDtable); showTbody(init, year, month, day); init.$ChooseYDbox = $(\'<div class="Choose-yearmonth-box"></div>\').appendTo(init.$box); init.$yearbox = $(\'<div class="Choose-year"></div>\').appendTo(init.$ChooseYDbox); init.$yearPrev = $(\'<span class="Choose-year-prev"><</span>\').appendTo(init.$yearbox); init.$yearCurr = $(\'<span class="Choose-year-curr">\'+currDate[0]+\'</span>\').appendTo(init.$yearbox); init.$yearNext = $(\'<span class="Choose-year-next">></span>\').appendTo(init.$yearbox); init.$monthbox = $(\'<ul class="Choose-month"></ul>\').appendTo(init.$ChooseYDbox); for(var i = 1;i<=12;i++){ var j = i; j = i<=9?\'0\'+i:i; $(\'<li data-month="\'+i+\'">\'+j+\'</li>\').appendTo(init.$monthbox); } init.$monthbox.children().eq(parseInt(month)-1).addClass(\'active\'); init.$Choosehmbox = $(\'<div class="ChooseTimeBox"></div>\').appendTo(init.$box) init.$currTimebox = $(\'<div class="Choose-time"><span class="ChooseTimeBox-name">时间:</span></div>\').appendTo(init.$Choosehmbox); init.$hoursCurr = $(\'<span class="Choose-curr-hours">\'+init.currtime.split(\':\')[0]+\':</span>\').appendTo(init.$currTimebox); init.$minutesCurr = $(\'<span class="Choose-curr-minutes">\'+init.currtime.split(\':\')[1]+\'</span>\').appendTo(init.$currTimebox); init.$hoursbox = $(\'<div class="Choose-hours"><span class="ChooseTimeBox-name">时:</span></div>\').appendTo(init.$Choosehmbox); init.$minutesbox = $(\'<div class="Choose-minutes"><span class="ChooseTimeBox-name">分:</span></div>\').appendTo(init.$Choosehmbox); init.$btnbox = $(\'<div class="ChooseTimeBox-btn-box"></div>\').appendTo(init.$Choosehmbox); init.$hoursLine = $(\'<span class="Choose-hours-line"></span>\').appendTo(init.$hoursbox); init.$minutesLine = $(\'<span class="Choose-minutes-line"></span>\').appendTo(init.$minutesbox); init.$hoursPoint = $(\'<span class="Choose-hours-point"></span>\').appendTo(init.$hoursLine); init.$minutesPoint = $(\'<span class="Choose-minutes-point"></span>\').appendTo(init.$minutesLine); init.$currbtn = $(\'<button class="ChooseTimeBox-curr-btn">当前时间</button>\').appendTo(init.$btnbox); init.$btn = $(\'<button class="ChooseTimeBox-btn">确定</button>\').appendTo(init.$btnbox); init.$box.on(\'click\',function(e){ e.stopPropagation(); }); init.$yearPrev.on(\'click\',function(){ init.$yearCurr.text(parseInt(init.$yearCurr.text())-1) }); init.$yearNext.on(\'click\',function(){ init.$yearCurr.text(parseInt(init.$yearCurr.text())+1) }); init.hoursLinelength = init.$hoursLine.width(); init.hoursLinelengthAvr = init.hoursLinelength/23; init.minutesLinelength = init.$minutesLine.width(); init.minutesLinelengthAvr = init.minutesLinelength/59; init.$hoursPoint.on(\'mousedown\',function(e){ pointerMove(e, init.$hoursLine, init.$hoursPoint, init.$hoursCurr, init.hoursLinelength, init.hoursLinelengthAvr, this, 0) }); init.$minutesPoint.on(\'mousedown\',function(e){ pointerMove(e, init.$minutesLine, init.$minutesPoint, init.$minutesCurr, init.minutesLinelength, init.minutesLinelengthAvr, this, 1) }); $(d).on(\'mouseup\',function(){ $(d).unbind(\'mousemove\'); }); init.$currbtn.on(\'click\',function(){ currDate[0] = new Date().getHours()>= 0 && new Date().getHours() <= 9?"0" + new Date().getHours():new Date().getHours(); currDate[1] = new Date().getMinutes()>= 0 && new Date().getMinutes() <= 9?"0" + new Date().getMinutes():new Date().getMinutes(); init.$hoursPoint.css(\'left\',init.hoursLinelengthAvr*parseInt(currDate[0])-init.$hoursPoint.width()/2); init.$minutesPoint.css(\'left\',init.minutesLinelengthAvr*parseInt(currDate[1])-init.$minutesPoint.width()/2); init.$hoursCurr.text(currDate[0]+\':\'); init.$minutesCurr.text(currDate[1]); }); }else{ init.$box.show().css({left:BoxL,top:BoxT}); switch (init.type){ case \'hh-mm\': init.$hoursCurr.text(currDate[0]+\':\'); init.$minutesCurr.text(currDate[1]); init.hoursLinelength = init.$hoursLine.width(); init.hoursLinelengthAvr = init.hoursLinelength/23; init.minutesLinelength = init.$minutesLine.width(); init.minutesLinelengthAvr = init.minutesLinelength/59; init.$box.show().css({left:BoxL,top:BoxT}); init.$btn.off(\'click\'); break; case \'YY-MM-DD\': init.$monthPrev.off(\'click\'); init.$monthNext.off(\'click\'); init.$monthCurr.off(\'click\'); init.$monthCurr.text(init.currMonth); showTbody(init, year, month, day); case \'YY-MM\': init.$monthbox.children().removeClass(\'active\').eq(parseInt(currDate[1])-1).addClass(\'active\'); init.$monthbox.children().off(\'click\'); init.$yearCurr.text(currDate[0]); break; default: break; } $(d).off(\'click\'); } switch (init.type){ case \'YY-MM-DD\': init.$ChooseDbox.show(); init.$ChooseYDbox.hide(); init.$Choosehmbox.hide(); init.$monthbox.children().on(\'click\',function(){ init.$monthbox.children().removeClass(\'active\'); $(this).addClass(\'active\'); year = init.$yearCurr.text(); month = $(this).text(); init.$ChooseYDbox.hide(); init.$ChooseDbox.show(); init.$monthCurr.text(year+\'-\'+month); showTbody(init, year, month); }); init.$monthPrev.on(\'click\',function(){ var mC = init.$monthCurr.text().split(\'-\'); mC[1] = parseInt(mC[1])-1; if(parseInt(mC[1])<1){ mC[0] = parseInt(mC[0]) - 1; mC[1] = 12; } mC[1] = mC[1]>=1&&mC[1]<=9?\'0\'+mC[1]:mC[1]; init.$monthCurr.text(mC[0]+\'-\'+mC[1]); showTbody(init, mC[0], mC[1],day); }); init.$monthNext.on(\'click\',function(){ var mC = init.$monthCurr.text().split(\'-\'); mC[1] = parseInt(mC[1])+1; if(parseInt(mC[1])>12){ mC[0] = parseInt(mC[0]) + 1; mC[1] = 1; } mC[1] = mC[1]>=1&&mC[1]<=9?\'0\'+mC[1]:mC[1]; init.$monthCurr.text(mC[0]+\'-\'+mC[1]); showTbody(init, mC[0], mC[1],day); }); init.$monthCurr.on(\'click\',function(){ var mC = init.$monthCurr.text().split(\'-\'); month = mC[1]; year = mC[0]; init.$yearCurr.text(year); init.$monthbox.children().removeClass(\'active\').eq(parseInt(month)-1).addClass(\'active\'); init.$ChooseDbox.hide(); init.$ChooseYDbox.show(); }) break; case \'hh-mm\': init.$ChooseDbox.hide(); init.$ChooseYDbox.hide(); init.$Choosehmbox.show(); init.$hoursPoint.css(\'left\',init.hoursLinelengthAvr*parseInt(currDate[0])-init.$hoursPoint.width()/2); init.$minutesPoint.css(\'left\',init.minutesLinelengthAvr*parseInt(currDate[1])-init.$minutesPoint.width()/2); init.$btn.on(\'click\',function(){ $(this).addClass(\'active\'); el.val(init.$hoursCurr.text()+init.$minutesCurr.text()); init.$box.hide(); }); break; case \'YY-MM\': default: init.$ChooseDbox.hide(); init.$ChooseYDbox.show(); init.$Choosehmbox.hide(); init.$monthbox.children().on(\'click\',function(){ init.$monthbox.children().removeClass(\'active\'); $(this).addClass(\'active\'); el.val(init.$yearCurr.text()+ \'-\' +init.$monthbox.children(\'.active\').text()); init.$box.hide(); }); break; } $(d).on(\'click\',function(){ if(el.val() == \'\' || init.reg.test(el.val())){ clearTimeout(this.timer); init.$box.hide(); }else{ init.$error.show(); this.timer = setTimeout(function(){ init.$error.hide(); },500) } }); console.log(init) return init; }; })(jQuery,window,document); function DateChoose(option){ $(event.target).DateChoose(option); }
css:
.ChooseBox{ position:absolute; } .ChooseTimeBox{ position:absolute; width:300px; height:140px; border:1px solid #eee; background:#eee; font: 16px/20px \'Microsoft YaHei\'; } .Choose-yearmonth-box,.Choose-day-box{ width:200px; height:200px; background:#eee; text-align: center; border:1px solid #eee; } .Choose-yearmonth-box{ font: 16px/50px \'Microsoft YaHei\'; } .ChooseBox .Choose-day-box{ font: 16px/18px \'Microsoft YaHei\'; } .ChooseBox .ChooseBox-error,.ChooseTimeBox .ChooseTimeBox-error{ position:absolute; top:50%; left:50%; margin-left:-50px; width:100px; height:34px; background:#fff; color:#e5613c; text-align: center; line-height:34px; display: none; } .ChooseBox .Choose-year .Choose-year-prev,.ChooseBox .Choose-year .Choose-year-next,.ChooseBox .Choose-month-prev,.ChooseBox .Choose-month-next{ float:left; width:50px; font:700 18px/50px \'SimSun\'; cursor: pointer; } .ChooseBox .Choose-month-prev,.ChooseBox .Choose-month-next{ line-height:30px; } .ChooseBox .Choose-year .Choose-year-curr, .ChooseBox .Choose-month-curr{ float:left; width:100px; } .ChooseBox .Choose-month:after,.ChooseBox .Choose-year:after,.ChooseTimeBox .Choose-hours:after,.ChooseTimeBox .Choose-time:after,.ChooseTimeBox .Choose-minutes:after{ content: \'\'; display: block; clear: both; } .ChooseBox .Choose-yearmonth-box .Choose-year{ height:50px; width:100%; background:#e5613c; } .ChooseBox .Choose-yearmonth-box .Choose-month-curr{ cursor: pointer; } .ChooseBox .Choose-yearmonth-box .Choose-month{ height:150px; } .ChooseBox .Choose-yearmonth-box .Choose-month li{ list-style: none; height:50px; width:50px; float: left; cursor: pointer; } .ChooseBox .Choose-yearmonth-box .Choose-month li.active{ border-radius: 25px; background:#e5613c; } .ChooseTimeBox .Choose-time{ text-align:center; height:20px; } .ChooseTimeBox .Choose-hours,.ChooseTimeBox .Choose-minutes{ position:relative; height:40px; line-height:40px; } .ChooseTimeBox .ChooseTimeBox-name{ float: left; width:60px; text-align:right; } .ChooseTimeBox .Choose-minutes-line,.ChooseTimeBox .Choose-hours-line{ position:absolute; left:60px; top:18px; width:180px; height:4px; border:1px solid #e5613c; } .ChooseTimeBox .Choose-minutes-point,.ChooseTimeBox .Choose-hours-point{ position:absolute; left:-5px; top:-3px; height:10px; width:10px; background: #e5613c; border:1px solid #e5613c; cursor: pointer; } .ChooseTimeBox .ChooseTimeBox-btn,.ChooseTimeBox-curr-btn{ height:30px; margin:0 40px; padding:0 10px; } .ChooseBox .Choose-day-box .Choose-day-bar{ height:30px; width:100%; background:#e5613c; line-height:30px; } .ChooseBox .Choose-day-box .Choose-day-table{ height:170px; line-height:20px; } .ChooseBox .Choose-day-box .Choose-day-table table{ width:100%; table-layout: fixed; } .ChooseBox .Choose-day-box .Choose-day-table table td{ cursor: pointer; border-radius: 20px; } .ChooseBox .Choose-day-box .Choose-day-table table td.active{ background: #e5613c; }