轻量级的日期插件--datebox

jquery的日期插件有好几款,H5中的input也可以自带日期选择。但为什么要再写一个,有两个理由,一个是引用的文件太大,而有时候只需要很简单的功能,二个是想加一些自定义的效果不好改。

我写的这个功能比较简单,可以换月,有预约效果,可以设定预约日期范围,压缩后1.4kb,先上个图,再慢慢解释:

js代码:

$.fn.datebox = function (options) {
    var config = {
        $valueEle: $("#outputTime"),
        $prev: $(".datetitle #up"),
        $next: $(".datetitle #down"),
        minDate:null,
        maxDate:null,
    }
    config = $.extend(config, options);
    Date.prototype.format = function (format) {
        var o = {
            "M+": this.getMonth() + 1, //month
            "d+": this.getDate(), //day
            "h+": this.getHours(), //hour
            "m+": this.getMinutes(), //minute
            "s+": this.getSeconds(), //second
            "q+": Math.floor((this.getMonth() + 3) / 3), //quarter
            "S": this.getMilliseconds() //millisecond
        }
        if (/(y+)/.test(format))
            format = format.replace(RegExp.$1,
                (this.getFullYear() + "").substr(4 - RegExp.$1.length));
        for (var k in o)
            if (new RegExp("(" + k + ")").test(format))
                format = format.replace(RegExp.$1,
                    RegExp.$1.length == 1 ? o[k] :
                        ("00" + o[k]).substr(("" + o[k]).length));
        return format;
    };
    var self = this;
    var $ele = $(this);

    var maxdate,mindate;
    var nstr = new Date();
    var ynow = nstr.getFullYear();
    var mnow = nstr.getMonth();
    var dnow = nstr.getDate();
     if(!config.minDate){
           mindate=nstr;
     }else{
       mindate=new Date(config.mindate)
     }
     if(config.maxDate){
        maxdate=new Date(config.maxDate)
     }

    self.isLeap = function (year) {
        return (year % 100 == 0 ? res = (year % 400 == 0 ? 1 : 0) : res = (year % 4 == 0 ? 1 : 0));
    }
     console.log("最小日期是:",mindate.format("yyyy-MM-dd"))
     console.log("最大日期是:",maxdate.format("yyyy-MM-dd"))
     console.log("当前日期:",currentDate())
    pain();
    function pain() {
        var n1str = new Date(ynow, mnow, 1); //当月第一天
        var firstday = n1str.getDay(); //当月第一天星期几
        var m_days = new Array(31, 28 + self.isLeap(ynow), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); //各月份的总天数
        var tr_str = Math.ceil((m_days[mnow] + firstday) / 7); //表格所需要行数

        //打印表格第一行(有星期标志)
        $("#datetb").remove();
        var str = "<table id=‘datetb‘ cellspacing=‘0‘><tr><td>周日</td><td>周一</td><td>周二</td><td>周三</td><td>周四</td><td>周五</td><td>周六</td></tr>";
        for (i = 0; i < tr_str; i++) { //表格的行
            str += "<tr>";
            for (k = 0; k < 7; k++) { //表格每行的单元格
                idx = i * 7 + k; //单元格自然序列号
                date_str = idx - firstday + 1; //计算日期
                (date_str <= 0 || date_str > m_days[mnow]) ? date_str = "&nbsp;" : date_str = idx - firstday + 1; //过滤无效日期(小于等于零的、大于月总天数的)
                //打印日期:今天底色样式
                date_str == dnow ? str += "<td class=‘selected‘ data-day=" + date_str + ">" + "<div>" + date_str + "</div>" + "<div class=‘subscribe‘>预约</div>" + "</td>" : str += "<td  data-day=" + date_str + ">" + date_str + "</td>";
            }
            str += "</tr>"; //表格的行结束
        }
        str += "<tfoot><tr><td colspan=‘7‘>" + ynow + "年" + (mnow + 1) + "月</td></tr></tfoot>";
        str += "</table>"; //表格结束
        $ele.html(str);
        setDate(ynow, mnow, dnow);
    }

    function setDate(y, m, d) {
        var current = (new Date(y, m, d, 10, 0, 0)).format("yyyy-MM-dd");
        console.log(y, m, d, current);
        config.$valueEle.val(current);
    }
    function currentDate(){
        return (new Date(ynow, mnow, dnow, 10, 0, 0)).format("yyyy-MM-dd");
    }
    self.prev=function(){
       var temp = mnow - 1;
        if (temp < 0) {
            mnow = 11;
            ynow--;
        } else {
             var prevdate=new Date(ynow, mnow-1, 31, 10, 0, 0);
            if (prevdate <mindate) {
                console.log("超过最小可预约日期",prevdate.format("yyyy-MM-dd"))
                return;
            }
            mnow--;
        }
         if(ynow==mindate.getFullYear()&&mnow==mindate.getMonth()){
                 var _mday=mindate.getDate();
                if(dnow<_mday) dnow=_mday;
            }
        pain();
    }
    self.next=function(){
           var nextdate=new Date(ynow, mnow+1, 1, 10, 0, 0);
            if (nextdate>maxdate) {
                console.log("超过最大可预约日期",nextdate.format("yyyy-MM-dd"))
                return ;
            }
          var temp = mnow + 1;
        if (temp > 11) {
            mnow = 0;
            ynow++;
        } else {
            mnow++;
        }
          if(ynow==maxdate.getFullYear()&&mnow==maxdate.getMonth()){
                var _mday=maxdate.getDate();
                if(dnow>_mday) dnow=_mday;
            }
        pain();
    }
    self.seleted=function($td){
       if (!$td.hasClass(‘selected‘)) {
            var day = $td.data("day");
             var selectedDate=new Date(ynow, mnow, day, 1, 0, 0);
            if (selectedDate<mindate||selectedDate>maxdate) {
                 console.log("该日期不能预约");
                return;
            }
            $(".datebox table td").removeClass(‘selected‘).children(‘.subscribe‘).remove();
           $td.addClass(‘selected‘);
           $td.html(‘<div>‘ + $td.html() + ‘</div><div class="subscribe">预约</div>‘);
           dnow=day;
            setDate(ynow, mnow, day);
        }
    }
    self.getDate=function(){
       return currentDate();
    }

    $ele.on("click", "table td", function () {
      self.seleted($(this));
    });
    config.$prev.click(function () {
     self.prev();
    });
   config.$next.click(function () {
      self.next();
    });
    return self;
}

css:随便玩了。

body {
    font-family: Helvetica,Microsoft JhengHei;
    font-size:1.5rem;
}
*{ padding:0; margin:0;}
.content {
    padding-top: 11%;
    font-family: hyxmtj,Microsoft JhengHei;
    text-shadow: 0.5px 1px 1px #e3eab7;
}
.datetitle {
    width: 100%;
    background: #fed700;
    text-align: center;
    line-height: 3rem;
    -moz-border-radius: 1.7rem;
    -webkit-border-radius: 1.7rem;
    border-radius: 1.7rem;
    border-bottom: 0.25rem solid #d1a802;
    color: black;
    text-shadow: 1px 1px 1px #d1a802;
    position: relative;
}
.datetitle:before {
    content: "";
    position: absolute;
    width: 62%;
    border-left: 0.5rem solid #d1a802;
    border-right: 0.5rem solid #d1a802;
    height: 1.5rem;
    bottom: -1.5rem;
    left: 0;
    margin-left: 17%;

}
.datebox{ border:1px solid #d1a802;margin: 0 auto; margin-top: 1.2rem; width:68%; -moz-border-radius:1.5rem; -webkit-border-radius:1.5rem; border-radius:1.5rem; padding:0 1rem;  font-size:0.7rem; background:white; text-shadow:none;}
.datebox table{width:100%; border:none;}
.datebox table td{ width: 2rem;height: 2rem;text-align: center;border: 1px solid transparent;}
.datebox table td div{ font-size: small; }
.datebox table td.selected{border:1px solid #deaa5d; color:#deaa5d; }
.datebox table td.selected .subscribe{display:block;}
.datebox table td .subscribe{display:none;}
.datebox table tfoot td{ font-weight: bold;}
.databox #up  ,.databox #down {
    cursor: pointer;
}
.datetitle #down {
    float: right;
    margin-right:2rem;
}
.datetitle #up {
    float: left;
    margin-left:2rem;
}
.datetitle #up:hover ,.datetitle #down:hover {
    color: green;
}

公布了isLeap,next,prev,getdate,seleted 五个方法(看名字就不需要解释了吧)。默认今天是最小的预约时间。

可以这样设定最大的可预约时间:

 var date = $(".datebox").datebox({maxDate:"2016-12-20"});

换月的时候日期会自动切换到可预约的日期。

demo下载:http://files.cnblogs.com/files/stoneniqiu/datebox.zip   样式不喜欢的可以自己去改动。功能上要增增渐渐也很方便。

时间: 2024-08-07 23:31:26

轻量级的日期插件--datebox的相关文章

(转)jQuery Mobile 移动开发中的日期插件Mobiscroll 2.3 使用说明

(原)http://www.cnblogs.com/hxling/archive/2012/12/12/2814207.html jQuery Mobile 移动开发中的日期插件Mobiscroll 2.3 使用说明 近期在移动方面的开发,使用jQuery Mobile ,移动方面的插件不如Web 方面的插件多,选择的更少,有一些需要自己去封装,但功力尚不足啊. 日期插件JQM也提供了内置的,但样式方面不好看,只好百度.Google啦,找到了两款 jquery-mobile-datebox 和 

jQuery Mobile 移动开发中的日期插件Mobiscroll使用说明

近期在移动方面的开发,使用jQuery Mobile ,移动方面的插件不如Web 方面的插件多,选择的更少,有一些需要自己去封装,但功力尚不足啊. 日期插件JQM也提供了内置的,但样式方面不好看,只好百度.Google啦,找到了两款 jquery-mobile-datebox 和 mobiscroll-2.3 jqueryMobileDatebox 这个在板上的表现不好,性能方面有点卡 mobiscroll 性能方面比前者要好一些,效果更简洁 ,划动更流畅 放在一起对比下 各位看官,你们觉得哪个

EasyUI的DataGrid日期列(datebox)正确显示json时间格式

问题描述: 前端使用EasyUI,后台使用Spring MVC, 数据库里面存储的时间格式为:2014-06-10,但是后台返回给前台页面的数据是json格式的,类似于:1402367297000的形式,日期列datebox是无法解析的.具体如下图: 自己也是EasyUI小白,网上查查资料,倒腾下总算搞出来了,这里做下记录. 一般情况下我们所需的日期格式都是:2014-02-02或者2014/09/09形式的,因此首先要考虑实现一个添加日期格式化的插件. jQuery日期格式化 在自己的js中添

JQuery日期插件

JQuery是一款非常优秀的脚本框架,其丰富的控件使用起来也非常简单,配置非常灵活.下面做一个使用日期插件datapicker的例子. 1.下载jQuery核心文件就不用说了吧,datepicker是轻量级插件,只需jQuery的min版本就行了,然后到官网http://jqueryui.com/download下载jquery-ui压缩包(可以选择喜欢的theme),里面就包含对datepicker的支持,当然您也可以网站http://marcgrabanski.com/pages/code/

jquery mobile mobiscroll 日期插件使 用mobiscroll

官网网站: http://www.mobiscroll.com/ http://code.google.com/p/mobiscroll/ 1.精简版Demo: 查看Demo » 下载Demo » 2.年月日时分整合版Demo: 预览图: 查看Demo » 下载Demo » 以及的Demo: 1.精简出一个中文版本的Demo: 包括日期和时间共同选择等效果. 查看Demo » 2.修改官方Demo,并加入中文版本的可选项 此demo暂无在线预览,请下载完整包: 下载Demo » 昨天碰到使用日期

js日期插件

推荐一款贤心写的js日期插件,调用非常方便:顺手写了一个demo. 先列举下这款插件的优点:日期范围限制.开始日期设定.自定义日期格式.时间戳转换.当天的前后若干天返回.时分秒选择.智能响应.自动纠错.节日识别.快捷键操作.更换皮肤等. 当然还有很重要的一点是使用简单: 代码如下: <!DOCTYPE html> <html> <head>     <meta charset="UTF-8">     <title>data_

扩展日期插件

1.请扩展日期插件(/date/js/jq.date.js),使其在select后面自动加上“年”. “月”.“日”;并添加一个参数(lang)控制语言选择:当lang为“chs”时如图1效果,当lang为“eng”如图2效果: 图 1 <!doctype html><html><head><meta charset="utf-8"><title>下拉日期插件</title></head><scr

自己编写的轻量级Tabs切换插件

jquery ui 带有Tabs切换插件,但其css样式太难维护,引用的东西太多,因此就自己写了个. 起初我Html代码架子是这样的: <div class="tabs"> <ul> <li class="acss" data-box="#panel-1">标签1</li> <li class="bcss" data-box="#panel-2">

jquery ui bootstrap日期插件

http://blog.csdn.net/php_897721669/article/details/7404527 搜索“jquery ui日期插件怎么显示年份”? $("#datepicker").datepicker({ dateFormat:'yy-mm-dd', //更改时间显示模式 showAnim:"slide", //显示日历的效果slide.fadeIn.show等 changeMonth:true, //是否显示月份的下拉菜单,默认为false