原生js实现日期联动


Posted in Javascript onJanuary 12, 2015

月份的判定,由于涉及到过多了判定条件,如果用if else会大大降低性能,建议用switch 语法

代码如下:

 getDays:function(year,month){

         // var aDay = [31,28|29,31,30,31,30,31,31,30,31,30,31];

        // 二月份的天数数据处理

        var FedDays = year%4==0?29:28,

            returnDays = '';

        var month = month<10?month = '0'+month:month.toString();

        switch(month){

            case '01':

            case '03':

            case '05':

            case '07':

            case '08':

            case '10':

            case '12': returnDays = 31;break;

            case '04':

            case '06':

            case '09':

            case '11': returnDays = 30;break;

            case '02': returnDays = FedDays;break;

        }

        return returnDays;

    }

完整的源代码:

/*  author:laoguoyong

------------------------------

日期三级联动,范围选择

------------------------------

参数

* [String] targets:'#year,#month,#day' ;年,月,日的id

* [String] range:'2013-02-03,2019-09-21';范围,正确格式为xxxx-xx-xx

----为了节省代码,请传入正确的日期范围参数

----错误示范:

  (1)range:'2013-02-03,2019-9-21' 是不对的,注意日期格式

  (2)range:'2013-02-03' 是不对的,请输入完整的范围之值

  (3)range:'2013-02-03,2016-02-30' 是不对的,2月没有30天

  (3)range:'2013-02-03,2011-02-30' 是不对的,范围错误了

*

*/

function GySetDate(opt){

    //elem

    var targets = opt.targets.split(',');

    this.eYear = this.getId(targets[0].slice(1));

    this.eMonth = this.getId(targets[1].slice(1));

    this.eDay = this.getId(targets[2].slice(1));

    if(!this.eYear||!this.eMonth||!this.eDay) return;

    //范围值

    var r = opt.range.indexOf(','),

        aStarts = opt.range.slice(0,r).split('-'), // 转为:['2013','05','20']

        aEnds = opt.range.slice(r+1,opt.range.length).split('-'); // 转为:['2018','08','20']

    //Number类型

    this.startYear = parseInt(aStarts[0],10);

    this.startMonth = parseInt(aStarts[1],10);

    this.startDay = parseInt(aStarts[2],10);

    this.endYear = parseInt(aEnds[0],10);

    this.endMonth = parseInt(aEnds[1],10);

    this.endDay = parseInt(aEnds[2],10);
    this.init();

}

GySetDate.prototype = {

    init:function(){

        var _that = this;

        // 初始化日期

        this.setYears({'start':this.startYear,'end':this.endYear});

        this.setMonths({'start':this.startMonth});

        this.setDays({'year':this.startYear,'month':this.startMonth,'start':this.startDay});

        // 年选择

        this.eYear.onchange = function(){

            var year = parseInt(this.value);

            switch(true){

                case (year == _that.startYear):{

                    _that.setMonths({'start':_that.startMonth});

                    _that.setDays({'year':_that.startYear,'month':_that.startMonth,'start':_that.startDay});

                };break;

                case (year == _that.endYear):{

                    _that.setMonths({'start':1,'end':_that.endMonth});

                    if(_that.endMonth>1){

                        _that.setDays({'year':_that.endYear,'month':1,'start':1});    

                    }else{

                        _that.setDays({'year':_that.endYear,'month':1,'start':1,'end':_that.endDay});

                    }

                };break;

                default:{

                    _that.setMonths({'start':1});

                    _that.setDays({'start':1,'year':year,'month':1});

                }

            }

            

        }

        // 月选择

        this.eMonth.onchange = function(){

            var year = parseInt(_that.eYear.options[_that.eYear.selectedIndex].value),

                month = parseInt(this.value);

            switch(true){

                case (year==_that.endYear&&month==_that.endMonth):{

                    _that.setDays({'start':1,'year':year,'month':month,'end':_that.endDay});

                };break;

                case (year==_that.startYear&&month==_that.startMonth):{

                    _that.setDays({'year':_that.startYear,'month':_that.startMonth,'start':_that.startDay});

                };break;

                default:{

                    _that.setDays({'start':1,'year':year,'month':month});

                }

            }    

            

        }

    },

    /*设置年,月,日

    ----------------------------------

    参数值都为Number类型

    */

    // 参数 {'start':xx,'end':xxx}

    setYears:function(opt){

        this.eYear.innerHTML = '';

         for(var n=opt.start;n<=opt.end;n++){

            this.eYear.add(new Option(n,n));

        }

    },

    // 参数 {'start':xx,'end':xxx}

    // 参数 'end' 为可选,忽略,则开始到12月

    setMonths:function(opt){

        this.eMonth.innerHTML = '';

        var months = opt.end || 12;

        for(var n=opt.start;n<=months;n++){

            if(n<10) n = '0'+n;

           this.eMonth.add(new Option(n,n));

        }

    },

    // 参数 {'start':xx,'year':xxx,'month':xx,'star':xx,'end':xxx}

    // 参数 'end' 为可选,忽略,则开始到本月底(根据月份判断的)

    setDays:function(opt){

         this.eDay.innerHTML = '';

         var days = opt.end || this.getDays(opt.year,opt.month);

         for(var n=opt.start;n<=days;n++){

            if(n<10) n = '0'+n;

            this.eDay.add(new Option(n,n));

         }

    },

    /* 根据 年,月,返回正确的天数,如 2016-2,返回是29天(润年)

    --------------------------------------------------------------

    参数值都为Number类型

    */

    getDays:function(year,month){

         // var aDay = [31,28|29,31,30,31,30,31,31,30,31,30,31];

        // 二月份的天数数据处理

        var FedDays = year%4==0?29:28,

            returnDays = '';

        var month = month<10?month = '0'+month:month.toString();

        switch(month){

            case '01':

            case '03':

            case '05':

            case '07':

            case '08':

            case '10':

            case '12': returnDays = 31;break;

            case '04':

            case '06':

            case '09':

            case '11': returnDays = 30;break;

            case '02': returnDays = FedDays;break;

        }

        return returnDays;

    },

    /*工具辅助函数

    ----------------------------------

    */

    getId:function(id){

        return document.getElementById(id);

    }

}

效果展示图:

原生js实现日期联动

效果还不错吧,小伙伴们自己美化下,使用到自己的项目中去吧。

Javascript 相关文章推荐
Extjs中常用表单介绍与应用
Jun 07 Javascript
JavaScript事件学习小结(五)js中事件类型之鼠标事件
Jun 09 Javascript
jQuery筛选数组之grep、each、inArray、map的用法及遍历json对象
Jun 20 Javascript
使用contextMenu插件实现Bootstrap table弹出右键菜单
Feb 20 Javascript
详解webpack编译多页面vue项目的配置问题
Dec 11 Javascript
解决包含在label标签下的checkbox在ie8及以下版本点击事件无效果兼容的问题
Oct 27 Javascript
js实现打字小游戏
Dec 17 Javascript
js实现带箭头的进度流程
Mar 26 Javascript
Vue 封装防刷新考试倒计时组件的实现
Jun 05 Javascript
JavaScript 闭包的使用场景
Sep 17 Javascript
通过实例解析javascript Date对象属性及方法
Nov 04 Javascript
vantUI 获得piker选中值的自定义ID操作
Nov 04 Javascript
Javascript中innerHTML用法实例分析
Jan 12 #Javascript
js实现从数组里随机获取元素
Jan 12 #Javascript
javascript的tab切换原理与效果实现方法
Jan 10 #Javascript
js中的事件捕捉模型与冒泡模型实例分析
Jan 10 #Javascript
js中键盘事件实例简析
Jan 10 #Javascript
js中this的用法实例分析
Jan 10 #Javascript
js创建对象的方式总结
Jan 10 #Javascript
You might like
php5.4以下版本json不支持不转义内容中文的解决方法
2015/01/13 PHP
PHP实现指定字段的多维数组排序函数分享
2015/03/09 PHP
php根据一个给定范围和步进生成数组的方法
2015/06/19 PHP
深入剖析PHP中printf()函数格式化使用
2016/05/23 PHP
注意!PHP 7中不要做的10件事
2016/09/18 PHP
PHP中的函数声明与使用详解
2017/05/27 PHP
基于JQuery的浮动DIV显示提示信息并自动隐藏
2011/02/11 Javascript
javascript实现window.print()去除页眉页脚
2014/12/30 Javascript
JS实现仿google、百度搜索框输入信息智能提示的实现方法
2015/04/20 Javascript
javascript的replace方法结合正则使用实例总结
2016/06/16 Javascript
Javascript中常见的逻辑题和解决方法
2016/09/17 Javascript
getElementById().innerHTML与getElementById().value的区别
2016/10/27 Javascript
推荐三款日期选择插件(My97DatePicker、jquery.datepicker、Mobiscroll)
2017/04/21 jQuery
在vue中获取token,并将token写进header的方法
2018/09/26 Javascript
JS中的算法与数据结构之常见排序(Sort)算法详解
2019/08/16 Javascript
node.js中 redis 的安装和基本操作示例
2020/02/10 Javascript
如何在vue-cli中使用css-loader实现css module
2021/01/07 Vue.js
[02:12]探秘2016国际邀请赛中国区预选赛选手房间
2016/06/25 DOTA
Fiddler如何抓取手机APP数据包
2016/01/22 Python
总结python实现父类调用两种方法的不同
2017/01/15 Python
Python标准库sched模块使用指南
2017/07/06 Python
python3解析库lxml的安装与基本使用
2018/06/27 Python
Python列表切片常用操作实例解析
2019/12/16 Python
如何通过python计算圆周率PI
2020/11/11 Python
python-jwt用户认证食用教学的实现方法
2021/01/19 Python
django inspectdb 操作已有数据库数据的使用步骤
2021/02/07 Python
TripAdvisor斯洛伐克:阅读评论、比较价格和酒店预订
2018/04/25 全球购物
大学生涯自我鉴定
2014/01/16 职场文书
社区庆中秋节活动方案
2014/02/07 职场文书
蛋糕店创业计划书范文
2014/09/21 职场文书
老兵退伍标语
2014/10/07 职场文书
工程部岗位职责
2015/02/10 职场文书
立项申请报告范本
2015/05/15 职场文书
2019新员工试用期转正申请书3篇
2019/08/13 职场文书
一文搞清楚MySQL count(*)、count(1)、count(col)区别
2022/03/03 MySQL
Java无向树分析 实现最小高度树
2022/04/09 Javascript