luoxiaowei

自己写的有比较常用的三种格式的日历插件: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;
}

 

分类:

技术点:

相关文章: