日期插件

介绍

图片.png

使用

<h1>日期选择器(jQuery)</h1>
<div  id="m-input"></div>

var nowDate = new Date();
var prevDate = new Date(nowDate.getFullYear(),nowDate.getMonth(),nowDate.getDate()-1)
var nextDate = new Date(nowDate.getFullYear(),nowDate.getMonth(),nowDate.getDate())

$('#m-input').szInputDate('init',{
  css:{},
  startDate:prevDate,  // 开始时间
  endDate:nextDate  // 截止时间
 });
// $('#m-input').szInputDate('disabled'); // 禁用
// $('#m-input').szInputDate('unDisabled'); // 启用
// $('#m-input').szInputDate('getDate'); // 获得选择值Date
// $('#m-input').szInputDate('getStringValue  '); // 获得选择值String(2017-02-08)

代码

;(function($) {
    /*
    * input 日期插件
    * config:{
    *
    *   css 样式
    *   disabled 是否禁用 false
    *   defaultDate 默认显示时间 now Date()
    *   startDate 起始时间 null
    *   endDate 截至时间 null
    *
    * }
    *  methods:[
    *
    *   init,    // 初始化
    *   disabled,   // 禁用
    *   unDisabled, // 启用
    *   getDate,    // 获得选择值Date
    *   getStringValue  // 获得选择值String(2017-02-08)
    *
    *  ]
    * */
    $.fn.szInputDate = function(method) {
        var config = {
            css:{
                height:'40px',
                width:'160px',
                lineHeight:'40px',
                borderRadius:'4px'
            },
            disabled:false,
            defaultDate:new Date(),
            startDate:null,
            endDate:null

        };
        var setting;
        var untils = {
            prefixInteger: function(num, n) {
                return (Array(n).join(0) + num).slice(-n);
            }
        };
        var methods = {
            init: function ( options ) {
                setting = $.extend({}, config , options);
                return this.each(function() {
                    var $this = $(this),
                        data = $this.data('init');
                    if (!data) {
                        $(this).data({
                            init: true
                        });
                    }
                    methods['create'].call($(this), setting)
                });
            },
            disabled:function () {
                if(!this.data('init')){
                    $.error('Must fist use method init on jQuery.tooltip');
                    return null;
                };
                this.attr('disabled',true);
                return this;
            },
            unDisabled:function () {
                if(!this.data('init')){
                    $.error('Must fist use method init on jQuery.tooltip');
                    return null;
                };
                this.attr('disabled',false);
                return this;
            },
            getDate: function () {
                if(!this.data('init')){
                    $.error('Must fist use method init on jQuery.tooltip');
                    return null;
                };
                return this.data('selectDate');
            },
            getStringValue: function () {
                if(!this.data('init')){
                    $.error('Must fist use method init on jQuery.tooltip');
                    return null;
                };
                return this.find('.showDate').text();
            },
            /**
             * 更新展示——选择日期
             * @param _updateDate
             */
            updateSelectDisplay:function (_updateDate ) {
                var uYear = _updateDate.getFullYear();  // 刷新年份
                var uMonth = _updateDate.getMonth();  // 月份 0表示1月
                var uMonth_ = uMonth+1;  // 月份 1表示1月
                var uDate = _updateDate.getDate();
                this.find('.showDate').empty().append('<em>'+uYear+'</em><span>-</span>'+
                    '<em>'+untils.prefixInteger(uMonth_,2)+'</em><span>-</span>' +
                    '<em>'+untils.prefixInteger(uDate,2)+'</em>');
            },
            /**
             * 更新展示——展示日期
             * @param _updateDate
             */
            updateShowDisplay:function ( _updateDate ) {
                var uYear = _updateDate.getFullYear();  // 刷新年份
                var uMonth = _updateDate.getMonth();  // 月份 0表示1月
                var uMonth_ = uMonth+1;  // 月份 1表示1月
                var uDate = _updateDate.getDate();

                this.find('.datePanel').empty().append('<div class="datePanel-title">'+
                    '<div class="leftMonth"></div><div class="rightMonth"></div>' +
                    '<div class="showMonth">'+(uYear+'年'+untils.prefixInteger(uMonth_,2)+'月')+'</div></div>'+
                    '<table class="datePanel-table"><thead><tr>'+
                    '<th scope="col"> <span title="Sunday">Su</span> </th>'+
                    '<th scope="col"> <span title="Monday">Mo</span> </th>'+
                    '<th scope="col"> <span title="Tuesday">Tu</span> </th> '+
                    '<th scope="col"> <span title="Wednesday">We</span></th>'+
                    '<th scope="col"> <span title="Thursday">Th</span></th>'+
                    '<th scope="col"> <span title="Friday">Fr</span></th>'+
                    '<th scope="col"> <span title="Saturday">Sa</span></th>'+
                    '</tr> </thead><tbody></tbody></table>');

                var uAllDay = new Date(uYear, uMonth_, 0).getDate();    //  月份总天数
                var uFirstDay = new Date(uYear, uMonth, 1).getDay();     //月份一号星期几 0表示星期日
                var $tbody = this.find('tbody').empty();
                var uArr = [];
                for(var i=0 ; i<uFirstDay ; i++ ){
                    uArr.push('')
                }
                for(var j=0 ; j<uAllDay ; j++ ){
                    uArr.push(j+1)
                }
                var $td;
                for(var z=0 ; z<uArr.length ; z++){
                    if(z % 7 == 0){
                        $tr = $('<tr></tr>');
                        $tr.appendTo($tbody)
                    }
                    if(typeof uArr[z] == "string"){
                        $('<td></td>').appendTo($tr)
                    }else{
                        var $td = $('<td></td>').appendTo($tr).attr({
                            'data-year':uYear,
                            'data-month':uMonth,
                            'data-date':uArr[z],
                        }).append('<a class="allowSelectDate" href="javascript:void(0);">'+uArr[z]+'</a>');
                    }
                }
                var selectDate= this.data('selectDate');
                var sYear = selectDate.getFullYear();
                var sMonth = selectDate.getMonth();
                var sDate = selectDate.getDate();
                if(uMonth == sMonth && uYear == sYear ){
                    this.find('td[data-date='+sDate+']').addClass(' dateSelect')
                }
            },
            clearNoAllowSelectClass:function (setting) {
                var _this = this;
                // 判断startDate/endDate
                if(!!setting.startDate && setting.startDate > _this.data('selectDate')){
                    $.error('create error : 开始时间大于默认时间');
                }
                if(!!setting.endDate && setting.endDate < _this.data('selectDate')){
                    $.error('create error : 截至时间小于默认时间');
                }
                var $tds = _this.find('td[data-date]');

                $tds.each(function (index,value) {
                    var $this = $(value);
                    if((!!setting.startDate && (new Date($this.attr('data-year'),$this.attr('data-month'),$this.attr('data-date')) < setting.startDate))
                    || (!!setting.endDate && (new Date($this.attr('data-year'),$this.attr('data-month'),$this.attr('data-date')) > setting.endDate))){
                        $this.children().removeClass('allowSelectDate')
                    }
                })

            },
            create: function (setting) {
                var _defailtDate = setting.defaultDate;
                var defaultDate = new Date(_defailtDate.getFullYear(),_defailtDate.getMonth(),_defailtDate.getDate());
                var _this = this;
                _this.empty().append('<div class="showDate"></div><div class="datePanel"></div>')
                    .data({defaultDate:defaultDate,selectDate:defaultDate,showDate:defaultDate});
                if(_this.data('init')){
                    // already init
                    // set css
                    _this.addClass('m-inputDate').css(setting.css);
                    _this.find('.datePanel').css({
                        top:this.height()+'px'
                    })
                }else{
                    $.error('Must fist use method init on jQuery.tooltip');
                    return this;
                };


                methods['updateSelectDisplay'].call(this, defaultDate);
                methods['updateShowDisplay'].call(this, defaultDate);
                // 更新allowSelect
                methods['clearNoAllowSelectClass'].call(this,setting);

                if(setting.disabled){
                    this.attr('disabled',true);
                }else{
                    this.attr('disabled',false);
                }
                this.off('click')
                    .on('click','.leftMonth',function () {
                        var showDate = _this.data('showDate');
                        var newShowDate = new Date(showDate.getFullYear() , showDate.getMonth() , 0 )
                        methods['updateShowDisplay'].call(_this, newShowDate);
                        _this.data({
                            showDate:newShowDate
                        })
                        methods['clearNoAllowSelectClass'].call(_this,setting);
                    })
                    .on('click','.rightMonth',function () {
                        var showDate = _this.data('showDate');
                        var newShowDate = new Date(showDate.getFullYear() , showDate.getMonth()+2 , 0 )
                        methods['updateShowDisplay'].call(_this, newShowDate);
                        _this.data({
                            showDate:newShowDate
                        })
                        methods['clearNoAllowSelectClass'].call(_this,setting);
                    })
                    .on('click','td[data-date] a.allowSelectDate',function () {
                        _this.find('td[data-date]').removeClass('dateSelect');
                        var newSelect = $(this).parent().addClass('dateSelect');
                        var newSelectDate = new Date(newSelect.attr('data-year'),newSelect.attr('data-month'),newSelect.attr('data-date'))
                        methods['updateSelectDisplay'].call(_this, newSelectDate);
                        _this.data({
                            selectDate:newSelectDate
                        })
                    });
                return this;
            }
        };
        if (methods[method]) {
            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
        } else if (typeof method === 'object' || !method) {
            return methods.init.apply(this, arguments);
        } else {
            $.error('Method' + method + 'does not exist on jQuery.tooltip');
        }
    };

})(jQuery);

/*
input date 插件样式
*/
:root{
    --mInputDateHeight : 30px;
    --mInputDateWidth : 140px;
}
.m-inputDate{
    display: inline-block;
    position: relative;
    width: var(--mInputDateWidth);
    min-width: 120px;
    height: var(--mInputDateHeight);
    line-height: calc( var(--mInputDateHeight) - 2px );
    vertical-align: middle;
    border: 1px solid #a1a1a1;
    color: #333;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;;
}
/*showDate*/
.m-inputDate .showDate{
    display: block;
    position: relative;
    width: 100%;
    height: 100%;
    padding-right: 15px;
    text-align: center;
    cursor: pointer;
}
.m-inputDate:hover  .showDate{
    outline: 1px solid rgba(0,160,220,1);
}
.m-inputDate .showDate:after{
    content: '';
    position: absolute;
    top: calc( 50% - 3px );
    right: 5px;
    border-top: 6px solid #333;
    border-left: 4px solid transparent;
    border-right: 4px solid transparent;
}
.m-inputDate .showDate em{
    padding-left: 3px;
    padding-right: 3px;
}
/*datePanel*/
.m-inputDate .datePanel{
    display: none;
    position: absolute;
    top: calc( var(--mInputDateHeight) - 1px );
    left: -1px/*calc( (var(--mInputDateWidth) - 200px )/2 )*/;
    width: 290px;
    padding: 5px;
    border:1px solid #dfdfdf;
    border-radius: 2px;
    background-color: #FFFFFF;
    z-index: 200;
}
.m-inputDate:hover  .datePanel{
    display: block;
}
/*datePanel-title*/
.m-inputDate .leftMonth,.m-inputDate .rightMonth{
    width: 30px;
    height: 30px;
    cursor: pointer;
    position: relative;
}
.m-inputDate .leftMonth{
    float: left;
}
.m-inputDate .leftMonth:after{
    content: '';
    position: absolute;
    top: 5px;
    left: 5px;
    border-top: 9px solid transparent;
    border-bottom: 9px solid transparent;
    border-right: 18px solid #dfdfdf;
}
.m-inputDate .rightMonth{
    float: right;

}
.m-inputDate .rightMonth:after{
    content: '';
    position: absolute;
    top: 5px;
    left: 5px;
    border-top: 9px solid transparent;
    border-bottom: 9px solid transparent;
    border-left: 18px solid #dfdfdf;
}
.m-inputDate .leftMonth:hover,.m-inputDate .rightMonth:hover{
    border: 1px solid #dfdfdf;
    border-radius: 3px;
}
.m-inputDate .showMonth{
    text-align: center;
}
/*datePanel-table*/
.m-inputDate .datePanel-table th{
    text-align: center;
    font-weight: bold;
    font-family: Arial,Helvetica,sans-serif;
    width: 40px;
    height: 30px;
}
.m-inputDate .datePanel-table td{
    text-align: center;
    font-family: Arial,Helvetica,sans-serif;
    padding: 2px;
}

.m-inputDate .datePanel-table  td > a{
    display: block;
    width: 36px;
    height: 26px;
    line-height: 24px;
    padding-right: 5px;
    text-align: right;
    text-decoration: none;
    box-sizing: border-box;
    font-size: 14px;
    border: 1px solid #dfdfdf;
    color: #dfdfdf;
    background-color: transparent;
    cursor: default;
}
.m-inputDate .datePanel-table  td > a.allowSelectDate{
    color: #333;
    background-color: #F6F6F6;
    border: 1px solid #dfdfdf;
    cursor: pointer;
}
.m-inputDate .datePanel-table td.dateSelect a{
    border:1px solid rgba(0,160,220,1);
    color:rgba(0,160,220,1);
    background-color: transparent;
}
.m-inputDate .datePanel-table td.closeDay a{
    border:1px solid #dfdfdf;
    color:#dfdfdf;
    background-color: transparent;
}
.m-inputDate .datePanel-table  td > a:hover{
    background-color: rgba(0,160,220,0.2);
}
.m-inputDate .datePanel-table  td.closeDay > a:hover{
    background-color: transparent;
    cursor: default;
}
/*.m-inputDate disabled*/
.m-inputDate[disabled="disabled"]{
    background-color: #dfdfdf;
}
.m-inputDate[disabled="disabled"] .showDate:after{
    content: '';
    position: absolute;
    top: calc( 50% - 3px );
    right: 5px;
    border-top: 6px solid #a1a1a1;
    border-left: 4px solid transparent;
    border-right: 4px solid transparent;
}
.m-inputDate[disabled="disabled"] .showDate{
    cursor: default;
    outline: none;
}
.m-inputDate[disabled="disabled"]:hover  .datePanel{
    display: none;
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351

推荐阅读更多精彩内容