原生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 相关文章推荐
表单的一些基本用法与技巧
Jul 15 Javascript
JavaScript的目的分析
Jan 05 Javascript
Table冻结表头示例代码
Aug 20 Javascript
JavaScript instanceof 的使用方法示例介绍
Oct 23 Javascript
使用Promise解决多层异步调用的简单学习心得
May 17 Javascript
微信小程序 animation API详解及实例代码
Oct 08 Javascript
Angular 2 利用Router事件和Title实现动态页面标题的方法
Aug 23 Javascript
bootstrap下拉框动态赋值方法
Aug 10 Javascript
微信小程序下拉菜单效果的实例代码
May 14 Javascript
微信小程序在线客服自动回复功能(基于node)
Jul 03 Javascript
使用 js 简单的实现 bind、call 、aplly代码实例
Sep 07 Javascript
创建与框架无关的JavaScript插件
Dec 01 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堆栈与列队的学习
2013/06/21 PHP
ThinkPHP3.1的Widget新用法
2014/06/19 PHP
浅谈php和js中json的编码和解码
2016/10/24 PHP
PHP面相对象中的重载与重写
2017/02/13 PHP
浅谈PHP中如何实现Hook机制
2017/11/14 PHP
php校验公钥是否可用的实例方法
2019/09/17 PHP
Javascript 判断 object 的特定类转载
2007/02/01 Javascript
JavaScript中的数值范围介绍
2014/12/29 Javascript
怎么通过onclick事件获取js函数返回值(代码少)
2015/07/28 Javascript
cocos2dx骨骼动画Armature源码剖析(三)
2015/09/08 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【二】
2016/05/10 Javascript
AngularJS基础 ng-keydown 指令简单示例
2016/08/02 Javascript
js基于FileSaver.js 浏览器导出Excel文件的示例
2017/08/15 Javascript
Typescript 中的 interface 和 type 到底有什么区别详解
2019/06/18 Javascript
对vue中的事件穿透与禁止穿透实例详解
2019/10/28 Javascript
[53:20]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 VG vs OG
2018/04/03 DOTA
用Python登录Gmail并发送Gmail邮件的教程
2015/04/17 Python
详解Python的单元测试
2015/04/28 Python
Python中正则表达式的详细教程
2015/04/30 Python
python脚本实现xls(xlsx)转成csv
2016/04/10 Python
python3 实现的人人影视网站自动签到
2016/06/19 Python
Python 读写文件和file对象的方法(推荐)
2016/09/12 Python
Python 实现链表实例代码
2017/04/07 Python
django使用html模板减少代码代码解析
2017/12/12 Python
python如何在循环引用中管理内存
2018/03/20 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
2019/11/19 Python
Python对称的二叉树多种思路实现方法
2020/02/28 Python
使用darknet框架的imagenet数据分类预训练操作
2020/07/07 Python
解决tensorflow模型压缩的问题_踩坑无数,总算搞定
2021/03/02 Python
个性发展自我评价
2014/02/11 职场文书
2015年元旦活动总结
2014/05/09 职场文书
实习护士自荐信
2014/06/21 职场文书
给校长的一封检讨书
2014/09/20 职场文书
2014党委书记四风对照检查材料思想汇报
2014/09/21 职场文书
付款委托书范本
2014/10/05 职场文书
Python字符串的转义字符
2022/04/07 Python