一个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 相关文章推荐
JS option location 页面跳转实现代码
Dec 27 Javascript
js AspxButton的客户端操作
Jun 26 Javascript
基于jQuery的倒计时插件代码
May 07 Javascript
AngularJS内置指令
Feb 04 Javascript
javascript事件冒泡简单示例
Jun 20 Javascript
Node.js的基本知识简单汇总
Sep 19 Javascript
js中string和number类型互转换技巧(分享)
Nov 28 Javascript
Angular2自定义分页组件
Apr 19 Javascript
JS实现带动画的回到顶部效果
Dec 28 Javascript
Vue.js实现的购物车功能详解
Jan 27 Javascript
Vue中Table组件Select的勾选和取消勾选事件详解
Mar 19 Javascript
微信小程序实现折线图的示例代码
Jun 07 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程序员最常犯的11个MySQL错误小结
2010/11/20 PHP
PHP命名空间(Namespace)简明教程
2014/06/11 PHP
php简单实现多语言切换的方法
2016/05/09 PHP
鼠标放在图片上显示大图的JS代码
2013/03/26 Javascript
js 固定悬浮效果实现思路代码
2013/08/02 Javascript
将中国标准时间转换成标准格式的代码
2014/03/20 Javascript
使用jQuery重置(reset)表单的方法
2014/05/05 Javascript
微信JS接口汇总及使用详解
2015/01/09 Javascript
Node.js+Express配置入门教程详解
2016/05/19 Javascript
客户端验证用户名和密码的方法详解
2016/06/16 Javascript
基于JavaScript实现移动端无限加载分页
2017/03/27 Javascript
用vue构建多页面应用的示例代码
2017/09/20 Javascript
微信小程序搭建自己的Https服务器
2019/05/02 Javascript
微信小程序判断页面是否从其他页面返回的实例代码
2019/07/03 Javascript
javascript实现简单打字游戏
2019/10/29 Javascript
js生成1到100的随机数最简单的实现方法
2020/02/07 Javascript
es6函数之箭头函数用法实例详解
2020/04/25 Javascript
Openlayers+EasyUI Tree动态实现图层控制
2020/09/28 Javascript
javascript canvas封装动态时钟
2020/09/30 Javascript
基于elementUI竖向表格、和并列的案例
2020/10/26 Javascript
vue使用require.context实现动态注册路由
2020/12/25 Vue.js
Python中分数的相关使用教程
2015/03/30 Python
在java中如何定义一个抽象属性示例详解
2017/08/18 Python
Python操作MySQL数据库的方法
2018/06/20 Python
python 实现一个反向单位矩阵示例
2019/11/29 Python
Python如何在单元测试中给对象打补丁
2020/08/03 Python
屈臣氏乌克兰:Watsons UA
2019/10/29 全球购物
韩语专业本科生求职信
2013/10/01 职场文书
岗位职责定义及内容
2013/11/08 职场文书
党的群众教育实践活动实施方案
2014/06/12 职场文书
党员群众路线教育实践活动学习笔记
2014/11/05 职场文书
建议书范文
2015/02/05 职场文书
大学感恩节活动总结
2015/05/05 职场文书
高中生军训感言
2015/08/01 职场文书
Nginx开启Brotli压缩算法实现过程详解
2021/03/31 Servers
HTML5页面音频自动播放的实现方式
2021/06/21 HTML / CSS