一个js写的日历(代码部分网摘)


Posted in Javascript onSeptember 20, 2009

特意贴出这段代码,因为它的代码简洁和清晰,觉得不错,供大家分享。
×××××××函数定义部分

<script type="text/javascript"> 
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 = " "; 
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()); 
} 
} 
</script>

××××××××样式表的定义
<style type="text/css"> 
.Calendar { 
font-family:Verdana; 
font-size:12px; 
background-color:#e0ecf9; 
text-align:center; 
width:400px; 
height:180px; 
padding:10px; 
line-height:1.5em; 
} 
.Calendar a{ 
color:#1e5494; 
} 
.Calendar table{ 
width:100%; 
border:0; 
} 
.Calendar table thead{color:#acacac;} 
.Calendar table td { 
font-size: 11px; 
padding:1px; 
} 
#idCalendarPre{ 
cursor:pointer; 
float:left; 
padding-right:5px; 
} 
#idCalendarNext{ 
cursor:pointer; 
float:right; 
padding-right:5px; 
} 
#idCalendar td.onToday { 
font-weight:bold; 
color:#C60; 
} 
#idCalendar td.onSelect { 
font-weight:bold; 
} 
#buttonposition{ 
margin-left: 10%; 
} 
</style>

***********下面是应用的主体部分
<div class="Calendar"> 
<div id="idCalendarPre"><<</div> 
<div id="idCalendarNext">>></div> 
<span id="idCalendarYear"></span>年 <span id="idCalendarMonth"></span>月 
<table cellspacing="0"> 
<thead> 
<tr> 
<td>日</td> 
<td>一</td> 
<td>二</td> 
<td>三</td> 
<td>四</td> 
<td>五</td> 
<td>六</td> 
</tr> 
</thead> 
<tbody id="idCalendar"> 
</tbody> 
</table> 
</div> 
<div id="buttonposition" ><!-- 通过id获取样式 --> 
<input id="idCalendarPreYear" type="button" class="bt" value="上一年" /> 
<input id="idCalendarNow" type="button" class="bt" value="当前月" /> 
<input id="idCalendarNextYear" type="button" class="bt" value="下一年" /> 
</div> 
<script language="JavaScript"> 
var cale = new Calendar("idCalendar", { 
onToday: function(o){ o.className = "onToday"; }, 
onFinish: function(){ 
$("idCalendarYear").innerHTML = this.Year; $("idCalendarMonth").innerHTML = this.Month; 
} 
}); 
$("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(); } 
</script> 
</div>
Javascript 相关文章推荐
childNodes.length与children.length的区别
May 14 Javascript
JS 密码强度验证(兼容IE,火狐,谷歌)
Mar 15 Javascript
js 小数取整的函数
May 10 Javascript
jcrop基本参数一览
Jul 16 Javascript
JavaScript中实现Map的示例代码
Sep 09 Javascript
JavaScript数组去重的五种方法
Nov 05 Javascript
AngularJS模块详解及示例代码
Aug 17 Javascript
Jquery调用iframe父页面中的元素及方法
Aug 23 Javascript
JavaScript实现数值自动增加动画
Dec 28 Javascript
js装饰设计模式学习心得
Feb 17 Javascript
Vuex模块化应用实践示例
Feb 03 Javascript
javascript实现计算器功能
Mar 30 Javascript
下载站控制介绍字数显示的脚本 显示全部 隐藏介绍等功能
Sep 19 #Javascript
js表格分页实现代码
Sep 18 #Javascript
ext 同步和异步示例代码
Sep 18 #Javascript
JQuery的ajax基础上的超强GridView展示
Sep 18 #Javascript
jQuery 事件队列调整方法
Sep 18 #Javascript
javascript 面向对象编程  function是方法(函数)
Sep 17 #Javascript
javascript 面向对象编程 聊聊对象的事
Sep 17 #Javascript
You might like
选择PHP作为网站开发语言的原因分享
2012/01/03 PHP
ThinkPHP模板判断输出Present标签用法详解
2014/06/30 PHP
PHP制作百度词典查词采集器
2015/01/29 PHP
php中使用gd库实现下载网页中所有图片
2015/05/12 PHP
php实现登录tplink WR882N获取IP和重启的方法
2016/07/20 PHP
PHP封装的多文件上传类实例与用法详解
2017/02/07 PHP
PHP常见数组排序方法小结
2018/08/20 PHP
php如何实现数据库的备份和恢复
2020/11/30 PHP
使用 JScript 创建 .exe 或 .dll 文件的方法
2011/07/13 Javascript
轻松创建nodejs服务器(10):处理POST请求
2014/12/18 NodeJs
文字垂直滚动之javascript代码
2015/07/29 Javascript
innerHTML中标签可以换行的方法汇总
2015/08/14 Javascript
值得分享和收藏的Bootstrap学习教程
2016/05/12 Javascript
最简单纯JavaScript实现Tab标签页切换的方式(推荐)
2016/07/25 Javascript
文件上传的几个示例分享【推荐】
2016/12/16 Javascript
Bootstrap fileinput组件封装及使用详解
2017/03/10 Javascript
js处理包含中文的字符串实例
2017/10/11 Javascript
vue按需加载组件webpack require.ensure的方法
2017/12/13 Javascript
Vue.js实现可排序的表格组件功能示例
2019/02/19 Javascript
JavaScript实现字符串与HTML格式相互转换
2020/03/17 Javascript
vue.js实现h5机器人聊天(测试版)
2020/07/16 Javascript
[18:32]DOTA2 HEROS教学视频教你分分钟做大人-谜团
2014/06/12 DOTA
Python文件读取的3种方法及路径转义
2015/06/21 Python
python 网络编程常用代码段
2016/08/28 Python
Django密码系统实现过程详解
2019/07/19 Python
matplotlib quiver箭图绘制案例
2020/04/17 Python
利用css3如何设置没有上下边的列表间隔线
2017/07/03 HTML / CSS
西部世纪.net笔试题面试题
2014/04/03 面试题
竞选部长演讲稿
2014/04/26 职场文书
安全伴我行演讲稿
2014/09/04 职场文书
党组织领导班子整改方案
2014/10/25 职场文书
教育教学读书笔记
2015/07/02 职场文书
《索溪峪的野》教学反思
2016/02/19 职场文书
2016年法制宣传月活动总结
2016/04/01 职场文书
导游词之安徽巢湖
2019/12/26 职场文书
Mysql事务索引知识汇总
2022/03/17 MySQL