基于jQuery的日历插件

上个星期看到同事做一个有关日历提醒功能的需求,为了找个插件也是费了不少心思,然后刚好有时间就试着写了一个简单demo

来看下最终效果图吧:

是长得丑了一点,不要吐槽我-。-

首先来说说这个日历主要的制作逻辑吧:

·一个月份最多有31天,需要一个7X6的表格去装载

·如果知道了某个月份1号是星期几,这个月份有多少天,一个循环就可以显示某个月的日历了吧(眼睛都放光了*.*)

·加上一些控件让用户可以方便操作吧(比如可以输入年份、月份,可以点击选择年份、月份)

新建一个html文件,html结构:

<div class="container">
    <input type="text" value="" id="cal-input"/>
    <div class="cal-box">
        <table>
            <thead>
                <tr>
                    <td class="sun">日</td>
                    <td>一</td>
                    <td>二</td>
                    <td>三</td>
                    <td>四</td>
                    <td>五</td>
                    <td class="sta">六</td>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                </tr>
            </tbody>
        </table>
    </div>
</div>

再加点样式进去,打开浏览器看看效果:

 thead td,tbody td{
            width: 20px;
            height: 20px;        text-align: center;
        }
        thead td.sun,thead td.sta{
            color: #eec877;
        }
        tbody td{
            border: 1px solid #eee;
        }

看起来还不错,但是这是一个插件,要写这么多html的代码是不合理的,应该是在这个插件内部动态插入的,这样写也是为了直观演示。

要开始写JS代码了,现在要得知某月的1号是星期几,方便去遍历显示某月的日历出来,这里用到了蔡勒公式

PS:简单解释一下,蔡勒公式:var week = y + parseInt(y/4) + parseInt(c/4) - 2*c + parseInt(26*(m+1)/10) + d - 1;

  c是年份的前两位,y是年份的后两份(2016年,c是20,y就是16),m是月份,d是日期,把week%7后得出的结果就是星期几

但是1,2月要当成上一年的13,14月进行计算,比如2016.2.3,就要换算成2015.14.3来使用蔡勒公式

week是正数和负数时求模是不一样的,负数时要 (week%7+7)%7,正数时直接求模 week%7,

还有得知道这个月份有多少天,1、3、5、7、8、10、12月是31天,4、6、9、11月是30天,2月分闰年和平年,平年是28天,闰年是29天,闰年是能被4整除但不能被100整除的,好了有了些前提下,还是能很快写出JS的

$(function(){
        var $td = $(‘tbody‘).find(‘td‘);

        var date = new Date(),
                year = date.getFullYear(),
                month = date.getMonth() + 1,
                day = date.getDate(),days;

        function initCal(yy,mm,dd){
            if(mm ==2 && yy%4 == 0 && yy%100 !==0 ){
                days = 28;
            }else if(mm == 1 || mm == 3 || mm == 5 || mm == 7 || mm == 8 || mm == 10 || mm == 12){
                days = 31;
            }else if(mm==4 || mm==6 || mm==9 || mm==11 ){
                days = 30;
            }else{
                days = 29;
            }

            var m = mm < 3 ? (mm == 1 ? 13 : 14): mm;
            yy = m > 12 ? yy - 1 : yy;
            var c = Number(yy.toString().substring(0,2)),
                    y = Number(yy.toString().substring(2,4)),
                    d = 1;
            //蔡勒公式
            var week = y + parseInt(y/4) + parseInt(c/4) - 2*c + parseInt(26*(m+1)/10) + d - 1;

            week = week < 0 ? (week%7+7)%7 : week%7;

            for(var i=0 ;i<42;i++){
                $td.eq(i).text(‘‘);    //清空原来的text文本
            }

            for(var i = 0;i < days; i++){
                $td.eq( week % 7 +i).text(i+1);    
            }
        }

        initCal(year,month,day);
    })

  再打开浏览器看看,现在的日历是长这样

打开手机日历看一看,现在是16年3月,嗯,长得一毛一样(得意脸)

现在要添加一些控件进去,两个输入框和四个按键,按键是使用了iconfont,html代码如下:

<div class="container">
    <input type="text" value="" id="cal-input"/>
    <div class="cal-box">
        <div class="cal-control-box">
            <div class="wif iw-bofangqixiayiqu left"></div>
            <div class="wif iw-iconfont-bofang left"></div>
            <input type="" value=""/>
            <span>年</span>
            <input type="" value=""/>
            <div class="wif iw-iconfont-bofang right"></div>
            <div class="wif iw-bofangqixiayiqu right"></div>
        </div>
        <table>
            <thead>
                <tr>
                    <td class="sun">日</td>
                    <td>一</td>
                    <td>二</td>
                    <td>三</td>
                    <td>四</td>
                    <td>五</td>
                    <td class="sta">六</td>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                </tr>
            </tbody>
        </table>
    </div>
</div>

现在的日历是长这样子了

  

现在来给按键们都绑上点击事件,输入框绑上change事件

//更改月份按钮
        $(document).on("click",".iw-iconfont-bofang",function(){
            if($(this).hasClass("left")){
                //判断加还是减
                if(month == 1 ){
                    month = 12;
                    year--;
                }else{
                    month--;
                }
            }else{
                if(month == 12){
                    month = 1;
                    year ++;
                }else{
                    month ++;
                }
            }
            initCal(year,month,day);
        })

        //更改年份
        $(document).on("click",".iw-bofangqixiayiqu",function(){
            if($(this).hasClass("left")){
                year--;
            }else{
                year++;
            }
            initCal(year,month,day);
        })
        //年份输入
        $(document).on("change","input.cal-year",function(){
            year = $(this).val();
            initCal(year,month,day);
        })

        //月份输入
        $(document).on("change","input.cal-month",function(){
            month = $(this).val();
            initCal(year,month,day);
        })

  

顺便在initCal()函数里面要把年份和月份的值用JQ的val()方法,放进input框里面就ok啦

结束语:这里呢并没有写成一个插件的形式,但是把这个日历的实现主要思路写好了,最近也是忙着写毕业论文,还有挺多东西想写下来分享的,总是感觉时间不够用,下次写一下怎么将这个日历写成一个chrome插件,就是下面这个

日历插件放到我的github上了,传送门:https://github.com/weapon-xx

文中如有错误,欢迎大家指正:)

  

时间: 2024-12-03 13:13:53

基于jQuery的日历插件的相关文章

基于jQuery的滚动条插件-jquery.jscrollbar

jquery.jscrollbar 是一个基于jQuery的滚动条插件,支持水平滚动条和垂直滚动条,支持鼠标键盘事件 主要功能 支持水平滚动条 支持垂直滚动条 自动判断水平滚动条和垂直滚动条是否显示 支持外部调用来滚动内容 支持滚动条部分样式自定义 支持键盘方向键控制 支持鼠标滚动(需要mousewheel插件) 支持滚动条显示位置设置(外部|悬浮) 支持手动更新界面 依赖的库 jQuery (http://jquery.com/) jquery.jqdrag (https://github.c

基于jquery下拉列表树插件代码

分享一款基于jquery下拉列表树插件代码.这是一款实用的jquery 树形下拉框 下拉树代码下载.效果图如下: 在线预览   源码下载 实现的代码. html代码: <table width="100%" align="center" cellpadding="0" cellspacing="0"> <tr> <td colspan="1" bgcolor="#FF

基于jQuery的tooltips插件--poshytip

摘要: 分享一款在项目中使用的tooltips插件--poshytip,这是一款基于jQuery的插件,其特点是简单易用,支持浏览器:IE6+, FF 2+, Opera 9+, Safari 3+, Chrome,并且带有六种皮肤的提示框 Install: 下载poshytip插件,解压之后将文件夹src拷贝到项目中,然后引入js和css文件. 1 <link rel="stylesheet" href="../src/tip-yellow/tip-yellow.cs

一款基于jQuery的分页插件

特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/mao2080/ 1.效果示例 2.代码样式 /* * 基于jquery 分页插件 * by [email protected] */ $(function (){ window.pageUtil = { /** * 构建分页 * @param {Object} divId 要绑定的容器 * @pa

jQuery简单日历插件版

先来看demo:http://codepen.io/jonechen/pen/xOgZMz 插件代码: ; (function($) { var Calendar = function(ele, options) { this.ele = ele; this.opt = options; this.defaults = { color: 'blue', fontsize: '14px', } this.obj = $.extend({}, this.defaults, this.opt); };

基于jquery的放大镜插件

<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title></head><script src="../jquery-1.8.3.min.js" type="text/javascript"></script>

两款基于Jquery的图表插件

一.EasyPieChart 页面加载时,运行initPieChart()函数,调用easyPieChart()函数,显示出图表. 代码: var initPieChart = function() { $('.percentage').easyPieChart({ animate: 1000 }); $('.percentage-light').easyPieChart({ barColor: function(percent) { percent /= 100; return "rgb(&q

jquery日历插件FullCalendar使用技巧

原文链接:http://blog.csdn.net/u013493957/article/details/44920341 FullCalendar是一款基于jquery的日历控件,它有着很强大的功能,下面我来给大家介绍一下FullCalendar使用技巧吧,希望此方法对各位有帮助呀. 简介 官方网站:http://arshaw.com/fullcalendar/英文文档:http://arshaw.com/fullcalendar/docs/ 使用方法 1. 下载压缩包fullcalendar

Jquery日历插件e-calendar升级版

jQuery事件日历插件e-calendar,支持针对指定日期自定义日程安排(无条数限制),设置过日程的日期会高亮显示,兼容IE7+主流浏览器. 原版使用方法及演示地址:e-calendar原版 (鼠标移动到天显示当天的日程安排) 升级版介绍: 1.同一天可存在多个事件交集2.点击天在日历下方出现日程列表3.点击日程列表可添加其事件 .4.添加item-grid的显示和隐藏5.Events中数组集合可添加id,type等元素(区分日程类型:任务类型或日程类型) 6.增加年份选择,月份选择7.样式