原生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 相关文章推荐
getJSON调用后台json数据时函数被调用两次的原因猜想
Sep 29 Javascript
javascript 通用loading动画效果实例代码
Jan 14 Javascript
js实现数字每三位加逗号的方法
Feb 05 Javascript
js操作css属性实现div层展开关闭效果的方法
May 11 Javascript
JavaScript通过事件代理高亮显示表格行的方法
May 27 Javascript
JavaScript实现移动端滑动选择日期功能
Jun 21 Javascript
JavaScript中递归实现的方法及其区别
Sep 12 Javascript
select获取下拉框的值 下拉框默认选中方法
Feb 28 Javascript
vue短信验证性能优化如何写入localstorage中
Apr 25 Javascript
详解微信小程序文件下载--视频和图片
Apr 24 Javascript
echarts浮动显示单位的实现方法示例
Dec 04 Javascript
NestJs使用Mongoose对MongoDB操作的方法
Feb 22 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
PHP实现多图片上传类实例
2014/07/26 PHP
PHP内核探索之解释器的执行过程
2015/12/22 PHP
Thinkphp3.2.3整合phpqrcode生成带logo的二维码
2016/07/21 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
2020/03/27 PHP
JS 事件绑定函数代码
2010/04/28 Javascript
一个原生的用户等级的进度条
2010/07/03 Javascript
jQuery获取注册信息并提示实现代码
2013/04/21 Javascript
CSS+JS实现点击文字弹出定时自动关闭DIV层菜单的方法
2015/05/12 Javascript
jquery实现图片预加载
2015/12/25 Javascript
基于jPlayer三分屏的制作方法
2016/12/21 Javascript
详解Sea.js中Module.exports和exports的区别
2017/02/12 Javascript
删除table表格行的实例讲解
2017/09/21 Javascript
Nodejs中crypto模块的安全知识讲解
2018/01/03 NodeJs
解决vue-router中的query动态传参问题
2018/03/20 Javascript
详解Ant Design of React的安装和使用方法
2018/12/27 Javascript
js数组去重的方法总结
2019/01/18 Javascript
基于JS实现table导出Excel并保留样式
2020/05/19 Javascript
[02:54]DOTA2英雄基础教程 暗影牧师戴泽
2013/12/05 DOTA
跟老齐学Python之玩转字符串(2)更新篇
2014/09/28 Python
Python中的zipfile模块使用详解
2015/06/25 Python
用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例
2017/12/14 Python
python中sys.argv函数精简概括
2018/07/08 Python
Python爬虫学习之获取指定网页源码
2019/07/30 Python
Python制作词云图代码实例
2019/09/09 Python
Python3.x+pyqtgraph实现数据可视化教程
2020/03/14 Python
Django2.1.7 查询数据返回json格式的实现
2020/12/29 Python
python实现图片转字符画
2021/02/19 Python
聊聊python在linux下与windows下导入模块的区别说明
2021/03/03 Python
波兰家具和室内装饰品购物网站:Vivre
2018/04/10 全球购物
Qoo10台湾站:亚洲领先的在线市场
2018/05/15 全球购物
什么是数组名
2012/05/10 面试题
应届生妇产科护士求职信
2013/10/27 职场文书
店长助理岗位职责
2013/12/13 职场文书
老师对学生的评语
2014/04/18 职场文书
普希金诗歌赏析(6首)
2019/08/22 职场文书
使用Python的开发框架Brownie部署以太坊智能合约
2021/05/28 Python