资讯专栏INFORMATION COLUMN

js插件讲解_javascript原生日历插件讲解

AlphaWatch / 3459人阅读

摘要:效果图如下代码日第一个参数代表是否是今天的日历,如果第一个参数为,还需要传递俩个参数,年和月。如何制作控制月份的控件方法如下得到页面上的对象控件。

效果图如下:

html代码

-

2017/12

+
123456

css代码

table{
    width: 300px;
    border-collapse:collapse;
}
th{
    border-bottom: 2px solid springgreen;
}
td{
    text-align: center;
    color: #999;
}
.this-month{
    color: #333;
}
.today{
    color: crimson;
}
.date-control{
    width: 300px;
    height: 20px;
    background: silver;
    position: relative;
}
.date-control p{
    text-align: center;
    line-height: 20px;
    color: #fff;
}
#pre-month,#next-mont{
    display: block;
    height: 20px;
    width: 20px;
    color: #fff;
    position: absolute;
    top: 0;
    text-align: center;
    background: #01cd78;
    cursor: pointer;
    user-select: none;
}
#pre-month{
    left: 0;
}
#next-mont{
    right: 0;
}

js代码

function Calendar() {
    this.today = new Date();
    this.table = document.getElementById("date-table").getElementsByTagName("tbody")[0];
    this.preMontBtn = document.getElementById("pre-month");
    this.nextMontBtn = document.getElementById("next-mont");
    this.yearText = document.getElementById("table-year");
    this.monthText = document.getElementById("table-month");
}
Calendar.prototype={
    constructor:Calendar,
    calendarInit:function (_isToday,_y,_m) {
        if(_isToday){
            this.drawTable(this.today.getFullYear(),this.today.getMonth());
            this.titleInit(this.today.getFullYear(),this.today.getMonth()+1);
        }else {
            this.drawTable(_y,_m-1);
            this.titleInit(_y,_m)
        }
        this.btnListener();
    },
    getMontInfo:function (_year,_month) {
        var firstDate = new Date(_year,_month,1);
        var lastDate = new Date(_year,_month+1,0);
        return {
            firstDay:firstDate.getDay()===0?7:firstDate.getDay(),
            lastDay:lastDate.getDay()===0?7:lastDate.getDay(),
            days:lastDate.getDate()
        }
    },
    drawTable:function (_year,_month) {
        this.table.innerHTML = "";
        var allDayNum = this.getDateNum(_year,_month);
        var rows = allDayNum.length/7;
        var index = 0;
        for(var i=0;i

知识点:

1、获得今天的日期对象:var today = new Date();

2、获得某一月第一天和最后一天的日期对象:
var firstDate = new Date(_year,_month,1);//指定(年)月,第一天的日期对象
var lastDate = new Date(_year,_month+1,0);//指定(年)月,最后一天的日期对象

3、查看日期对象的相关信息:
假设d是一个日期对象(如:var d = new Date(),或,var d=new Date(2017,12,17))
d.getFullYear();//获得d对应的年
d.getMonth();//获得d对应的月
d.getDate();//获得d对应的星期

4、查看日期对象的信息:
d.toLocaleString()//打印结果为:2017/12/16 上午9:55:26

思路概要:(逆向)
结果为:绘制日历
绘制table头部,星期123457
绘制日期数字
得到日期数字数组
知道这个月有几天,第一天星期几,最后一天星期几(从而,得到日期数组)。

方法解析:

1、如何知道某个月有多少天,第一天星期几,最后一天星期几?

方法如下:

function getThisMontInfo(_year,_month) {
    var firstDate = new Date(_year,_month,1);//当前月第一天
    var lastDate = new Date(_year,_month+1,0);//当前月最后一天
    return {//返回一个对象
        firstDay:firstDate.getDay()===0?7:firstDate.getDay();//当前月第一天的星期(星期日为0,如果其为零,让其变为7)、
        lastDay:lastDate.getDay()===0?7:lastDate.getDay(),//当前月最后一天的星期
        days:lastDate.getDate()//当前月有多少天,即最后一天的日期。
    }
}

2、如何获得日期数组?

方法如下:

//前提知道年和月,即y和m
//利用了上面的方法
thisMonthInfo = getThisMontInfo(y,m);//当前月相关信息
preMontInfo = getThisMontInfo(y,m-1);//上个月的相关信息
var allDayNum = [];
//向数组中添加当前月日期。
for(i=0;i

如何绘制table?

步骤为:
1、计算需要绘制多少行tr
2、绘制对应行数的tr
3、在每行tr中绘制7个td
4、在td中添加数字
5、用css区分这个月的日期数字和上个月或下个月的日期数字。
方法如下:

function drawTable(_year,_month) {
    table.innerHTML = "";
    var allDayNum = getDateNum(_year,_month);//通过上面的方法获得了日期数组
    var rows = allDayNum.length/7;//计算需要绘制多少行tr
    var index = 0;//日期数组的坐标
    for(var i=0;i

如何制作控制月份的控件?

方法如下:

//得到页面上的对象控件。
var preMontBtn = document.getElementById("pre-month");
var nextMontBtn = document.getElementById("next-mont");
//为控件添加监听事件
preMontBtn.addEventListener("click",function () {
//获得页面上显示的年月
    var dateInfo = {
        year:document.getElementById("table-year").innerText*1,
        month:document.getElementById("table-month").innerText*1
    };
//计算上个月的年和月
    var newDateInfo = {
        year:dateInfo.month-1===0?dateInfo.year-1:dateInfo.year,
        month:dateInfo.month-1===0?12:dateInfo.month-1
    };
//修改页面上的年月信息
    document.getElementById("table-year").innerText = newDateInfo.year;
    document.getElementById("table-month").innerText = newDateInfo.month;
//重新绘制表格,利用的是上文的方法
    drawTable(newDateInfo.year,newDateInfo.month-1);
});
//对下个月按钮的监听
nextMontBtn.addEventListener("click",function () {
    var dateInfo = {
        year:document.getElementById("table-year").innerText*1,
        month:document.getElementById("table-month").innerText*1
    };
    var newDateInfo = {
        year:dateInfo.month+1===13?dateInfo.year+1:dateInfo.year,
        month:dateInfo.month+1===13?1:dateInfo.month+1
    };
    document.getElementById("table-year").innerText = newDateInfo.year;
    document.getElementById("table-month").innerText = newDateInfo.month;
    drawTable(newDateInfo.year,newDateInfo.month-1);
});

完整代码在开篇。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/112889.html

相关文章

  • js插件讲解_javascript原生日历插件讲解

    摘要:效果图如下代码日第一个参数代表是否是今天的日历,如果第一个参数为,还需要传递俩个参数,年和月。如何制作控制月份的控件方法如下得到页面上的对象控件。 效果图如下:showImg(https://segmentfault.com/img/bV0rKL?w=379&h=221); html代码 - 2017/12 + 1234...

    canger 评论0 收藏0
  • js插件讲解_javascript原生日历插件讲解

    摘要:效果图如下代码日第一个参数代表是否是今天的日历,如果第一个参数为,还需要传递俩个参数,年和月。如何制作控制月份的控件方法如下得到页面上的对象控件。 效果图如下:showImg(https://segmentfault.com/img/bV0rKL?w=379&h=221); html代码 - 2017/12 + 1234...

    qpal 评论0 收藏0
  • 你的心事我全知晓——心情日记小程序丨实战

    摘要:闲暇之余,听媳妇嘀咕说要给她做一个能表达她每日心情的小程序,只能她在上面发东西。既然媳妇发话了,就花点心思做一个吧,因为没有图,所有布局全靠自己瞎编,下面结合图片和代码跟大家讲解下实现过程,内容略长,感兴趣的可以一览。 闲暇之余,听媳妇嘀咕说要给她做一个能表达她每日心情的小程序,只能她在上面发东西。既然媳妇发话了,就花点心思做一个吧,因为没有UI图,所有布局全靠自己瞎编,下面结合图片和...

    lylwyy2016 评论0 收藏0
  • 学习实践 - 收藏集 - 掘金

    摘要:官网地址聊天机器人插件开发实例教程一创建插件在系统技巧使你的更加专业前端掘金一个帮你提升技巧的收藏集。我会简单基于的简洁视频播放器组件前端掘金使用和实现购物车场景前端掘金本文是上篇文章的序章,一直想有机会再次实践下。 2道面试题:输入URL按回车&HTTP2 - 掘金通过几轮面试,我发现真正那种问答的技术面,写一堆项目真不如去刷技术文章作用大,因此刷了一段时间的博客和掘金,整理下曾经被...

    mikyou 评论0 收藏0
  • 库&插件&框架&工具

    摘要:一些有用的一些有用的,包括转换小箭头三角形媒体查询等中文指南是当下最热门的前端资源模块化管理和打包工具。 nodejs 入门 nodejs 入门教程,大家可以在 github 上提交错误 2016 年最好用的表单验证库 SMValidator.js 前端表单验证工具分享 浅谈前端线上部署与运维 说到前端部署,可能大多数前端工程师在工作中都是使用的公司现成的部署系统,与SRE对接、一起完...

    Codeing_ls 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<