原文地址为: JavaScript blog式日历控件

近来要做一个记事本系统,想找一个合适的日历控件,但网上的都是那种日历选择控件。
于是到qq的记事本系统找了一个,但里面的算法有点落后,所以用了它的样式自己写了个。

效果:

<<
>>

年 月

程序说明

【Date】

这个日历控件运用了很多Date相关操作和方法。

先说说Date对象几个有用的属性:
getFullYear:返回年份值
getMonth:返回月份值
getDate:返回一个月中的日期值
getDay:返回一周中的日期值

其中对getDay可能比较陌生,下面列出值对应的星期:
值 星期
0 星期天
1 星期一
2 星期二
3 星期三
4 星期四
5 星期五
6 星期六

这几个属性都是根据本地时间获取的,还有getUTCFullYear、getUTCMonth、getUTCDate、getUTCDay这几个属性是全球标准时间对应的值。

下面说说获取日期对象,获取当前日期很简单:

new  Date()

获取指定日期:

new  Date( this .options.SelectDay)

获取指定年月日的日期:

new  Date( this .Year,  this .Month  -   1 , d)

下面是几个比较有技巧的地方:

首先,做日历控件时需要知道该月第一天离星期天的天数,参照getDay对应值,发现这刚好等于该月第一天的getDay值,所以可以这样获得:

new  Date( this .Year,  this .Month  -   1 ,  1 ).getDay()

还有是获取该月的天数,这里比较精妙,通过获取该月最后一天的getDate值就可以得到该月的天数,但没有办法直接获取该月最后一天。
这里有一个方法,当获取指定年月日的日期时,设置日参数为0,就可以获取上一个月的最后一天,所以可以这样获取:

new  Date( this .Year,  this .Month,  0 ).getDate()

这个方法是很久以前在别人代码中发现的。

使用说明:

首先是实例化一个Calendar,并设置参数。
参数说明:
Year:要显示的年份
Month:要显示的月份
SelectDay:选择日期
onSelectDay:在选择日期触发
onToday:在当天日期触发
onFinish:日历画完后触发

一般SelectDay设置成选择了的日期,并在onSelectDay中设置一个函数用来设置这个日期的样式,
例如实例里SelectDay设置成今个月10号并在那天样式设为onSelect:

SelectDay:  new  Date().setDate( 10 ),
onSelectDay:  function (o){ o.className  =   " onSelect " ; },

而onToday就用来设置今日日期的样式,
例如实例里面把今天的日期的样式设为onToday:

onToday:  function (o){ o.className  =   " onToday " ; },

在onFinish中可以放需要设置日历的程序。
可以通过this.Year和this.Month获取当前日历显示的年份和月份。
对有数据的日期的也在这里设置,例如实例中是有一个当前月份的有数据的日期列表,然后根据这个列表对相应的日期进行设置:

Code
var flag = [10,15,20];
for(var i = 0, len = flag.length; i < len; i++){
    this.Days[flag[i]].innerHTML = "<a href='javascript:void(0);' οnclick=\"alert('日期是:"+this.Year+"/"+this.Month+"/"+flag[i]+"');return false;\">" + flag[i] + "</a>";
}

实例中是固定了这个日期列表,实际应用中可以根据年份月份获取对应的日期列表,
个人推荐用年份月份通过ajax获取。

程序还有下面这几个方法:
NowMonth:显示当前月
PreMonth:显示上一月
NextMonth:显示下一月
PreYear:显示上一年
NextYear:显示下一年
PreDraw:根据日期参数画日历

程序代码:

Code
var $ = function (id) {
    return "string" == typeof id ? document.getElementById(id) : id;
};

var Class = {
  create: function() {
    return function() {
      this.initialize.apply(this, arguments);
    }
  }
}

var Extend = function(destination, source) {
    for (var property in source) {
        destination[property] = source[property];
    }
    return destination;
}

var Calendar = Class.create();
Calendar.prototype = {
  initialize: function(container, options) {
    this.Container = $(container);//容器(table结构)
    this.Days = [];//日期对象列表
    
    this.SetOptions(options);
    
    this.Year = this.options.Year || new Date().getFullYear();
    this.Month = this.options.Month || new Date().getMonth() + 1;
    this.SelectDay = this.options.SelectDay ? new Date(this.options.SelectDay) : null;
    this.onSelectDay = this.options.onSelectDay;
    this.onToday = this.options.onToday;
    this.onFinish = this.options.onFinish;    
    
    this.Draw();
  },
  //设置默认属性
  SetOptions: function(options) {
    this.options = {//默认值
        Year:            0,//显示年
        Month:            0,//显示月
        SelectDay:        null,//选择日期
        onSelectDay:    function(){},//在选择日期触发
        onToday:        function(){},//在当天日期触发
        onFinish:        function(){}//日历画完后触发
    };
    Extend(this.options, options || {});
  },
  //当前月
  NowMonth: function() {
    this.PreDraw(new Date());
  },
  //上一月
  PreMonth: function() {
    this.PreDraw(new Date(this.Year, this.Month - 2, 1));
  },
  //下一月
  NextMonth: function() {
    this.PreDraw(new Date(this.Year, this.Month, 1));
  },
  //上一年
  PreYear: function() {
    this.PreDraw(new Date(this.Year - 1, this.Month - 1, 1));
  },
  //下一年
  NextYear: function() {
    this.PreDraw(new Date(this.Year + 1, this.Month - 1, 1));
  },
  //根据日期画日历
  PreDraw: function(date) {
    //再设置属性
    this.Year = date.getFullYear(); this.Month = date.getMonth() + 1;
    //重新画日历
    this.Draw();
  },
  //画日历
  Draw: function() {
    //用来保存日期列表
    var arr = [];
    //用当月第一天在一周中的日期值作为当月离第一天的天数
    for(var i = 1, firstDay = new Date(this.Year, this.Month - 1, 1).getDay(); i <= firstDay; i++){ arr.push(0); }
    //用当月最后一天在一个月中的日期值作为当月的天数
    for(var i = 1, monthDay = new Date(this.Year, this.Month, 0).getDate(); i <= monthDay; i++){ arr.push(i); }
    //清空原来的日期对象列表
    this.Days = [];
    //插入日期
    var frag = document.createDocumentFragment();
    while(arr.length){
        //每个星期插入一个tr
        var row = document.createElement("tr");
        //每个星期有7天
        for(var i = 1; i <= 7; i++){
            var cell = document.createElement("td"); cell.innerHTML = "&nbsp;";
            if(arr.length){
                var d = arr.shift();
                if(d){
                    cell.innerHTML = d;
                    this.Days[d] = cell;
                    var on = new Date(this.Year, this.Month - 1, d);
                    //判断是否今日
                    this.IsSame(on, new Date()) && this.onToday(cell);
                    //判断是否选择日期
                    this.SelectDay && this.IsSame(on, this.SelectDay) && this.onSelectDay(cell);
                }
            }
            row.appendChild(cell);
        }
        frag.appendChild(row);
    }
    //先清空内容再插入(ie的table不能用innerHTML)
    while(this.Container.hasChildNodes()){ this.Container.removeChild(this.Container.firstChild); }
    this.Container.appendChild(frag);
    //附加程序
    this.onFinish();
  },
  //判断是否同一日
  IsSame: function(d1, d2) {
    return (d1.getFullYear() == d2.getFullYear() && d1.getMonth() == d2.getMonth() && d1.getDate() == d2.getDate());
  } 
}

测试代码:

Code
var cale = new Calendar("idCalendar", {
    SelectDay: new Date().setDate(10),
    onSelectDay: function(o){ o.className = "onSelect"; },
    onToday: function(o){ o.className = "onToday"; },
    onFinish: function(){
        $("idCalendarYear").innerHTML = this.Year; $("idCalendarMonth").innerHTML = this.Month;
        var flag = [10,15,20];
        for(var i = 0, len = flag.length; i < len; i++){
            this.Days[flag[i]].innerHTML = "<a href='javascript:void(0);' οnclick=\"alert('日期是:"+this.Year+"/"+this.Month+"/"+flag[i]+"');return false;\">" + flag[i] + "</a>";
        }
    }
});

$("idCalendarPre").onclick = function(){ cale.PreMonth(); }
$("idCalendarNext").onclick = function(){ cale.NextMonth(); }

$("idCalendarPreYear").onclick = function(){ cale.PreYear(); }
$("idCalendarNextYear").onclick = function(){ cale.NextYear(); }

$("idCalendarNow").onclick = function(){ cale.NowMonth(); }

完整实例下载

转载请注明本文地址: JavaScript blog式日历控件

JavaScript blog式日历控件相关推荐

  1. JavaScript blog式日历控件javascript

    javascript blog式日历控件 近来要做一个记事本系统,想找一个合适的日历控件,但网上的都是那种日历选择控件. 于是到qq的记事本系统找了一个,但里面的算法有点落后,所以用了它的样式自己写了 ...

  2. bootstrap中使用日历控件

    在bootstrap中使用日历控件可以参照以下资料: http://www.bootcss.com/p/bootstrap-datetimepicker/index.htm 以下是参照此资料自己做的一 ...

  3. PHP+JavaScript+HTML实现注册界面表单及日历控件

    本文主要是介绍我做PHP网站时的一个HTML的简单静态界面,它的主要功能是用户注册界面,并且参照了网上的例子使用JavaScript判断和My97DatePicker的日历控件.界面效果如下图所示: ...

  4. [20081226更新(加了日文版本支持)]一个JavaScript WEB日历控件,支持IE6,FireFox,可支持不同语言版本,目前支持中文简繁,英,日语

    已经在google code上建立了项目,欢迎下载: http://code.google.com/p/kimsoft-jscalendar/downloads/list 如果有bug,欢迎大家到go ...

  5. ASP.net 日历控件

    日历控件是我们经常使用的,本文把常用的几款日历总结如下. 1.下拉日历梅花雨版第1款 点评:最经典的几乎完美了. 代码: <%...%> <html  > <head r ...

  6. asp.net日历控件

    日历控件是我们经常使用的,本文把常用的几款日历总结如下. 1.下拉日历梅花雨版第1款 点评:最经典的几乎完美了. 代码: <%...@ Page Language="C#"A ...

  7. 一个适用于visual studio 2005的一个js日历控件--zhuan

    最近要用到日历控件刚开始是使用梅花雨3.0不过发现了一些弹出的快慢还有定位的问题.总是有点麻烦.另外我是处于一个隐藏层内所以会有很多问题. 这个时候研究了下discuznt.net看到他们投票里面有一 ...

  8. 第一次使用梅花雨日历控件

    今天是第一天去这个新单位报到.虽然没给安排什么工作.但是听新同事们在聊天时谈的东西.感觉自己差的不是一点半点啊.在看他们的一个项目页面时发现有一 个日历控件.这个自己以前只是听说过.但是从来没有用过. ...

  9. 可编辑的日历控件_选择正确的WordPress编辑日历插件

    可编辑的日历控件 什么是编辑日历? (What is an Editorial Calendar?) An editorial calendar is the foundation of strate ...

  10. 带你开发一个日历控件

    首发我的博客 - https://blog.cdswyda.com/post/2017121010 日历控件多的不胜枚举,为什么我们还要再造一个轮子呢? 因为大多数日历控件都是用于选择日期的,有种需求 ...

最新文章

  1. Redis启动服务器端和客户端的命令(redis-server、redis-cli、--help、kill、ping、切换数据库)
  2. php文章远程图片,php保存远程图片到本地 php正则匹配文章中的远程图片地址
  3. Go基础编程:命名、变量、常量
  4. python定时发送邮件
  5. BZOJ1856:[SCOI2010]字符串
  6. Android框架式编程之BufferKnife
  7. 垂直电商独立站,到底有何优势?
  8. C#利用WCF改进文件流传输的三种方式
  9. ssr怎么编辑服务器ip_“阴阳师”IP影响力有多大?网易用它做了一款弹珠游戏,TapTap评分高达9.8分...
  10. 2022价值3888开源企业发卡网源码/全网对接/全新UI风格/完美运营
  11. 惠普台式机电源风扇不转
  12. 乘风破浪潮头立,扬帆起航正当时——韩国5G商用情况解析
  13. 信息收集之--- 主动收集
  14. 内存管理 —— 虚拟存储的基本概念
  15. 东北大学计算机学院生产实习,东北大学生产实习报告.doc
  16. y700支持m2硬盘_别再浪费电脑的潜力,这些笔记本电脑都能升级NVMe固态硬盘
  17. 作业11 最优前缀编码
  18. OpenCV计算机视觉编程Python版
  19. C#接入PLC(FX2N(C))全过程(二)
  20. 海康威视推出业界首款Android系统的网络键盘:Android键盘与传统键盘对比

热门文章

  1. Anaconda基本教程及常用命令(介绍、安装、基本操作、管理环境、管理包、conda和pip以及借助pqi换源)
  2. xpath之根据节点获取兄弟节点
  3. Rdt2.1 和 Rdt2.2的详细解释
  4. Shallow Heap 和 Retained Heap的区别
  5. 【Unity】小地图制作
  6. baep matlab,matlab实验指导书全文(简化).doc
  7. FlinkX数据同步
  8. Mysql索引:图文并茂,深入探究索引的原理和使用
  9. prophet outliers异常值
  10. proxy 配置报错 Error occured while trying to proxy to: