一个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 相关文章推荐
javascript 硬盘序列号+其它硬件信息
Dec 23 Javascript
原生javascript兼容性测试实例
Jul 01 Javascript
Jquery 跨域访问 Lightswitch OData Service的方法
Sep 11 Javascript
node.js实现博客小爬虫的实例代码
Oct 08 Javascript
js提示框替代系统alert,自动关闭alert对话框的实现方法
Nov 07 Javascript
jQuery DOM节点的遍历方法小结
Aug 15 jQuery
利用angular自动编译andriod APK的绕坑经历分享
Mar 08 Javascript
JavaScript碎片—函数闭包(模拟面向对象)
Mar 13 Javascript
Vue仿微信app页面跳转动画效果
Aug 21 Javascript
对Layer弹窗使用及返回数据接收的实例详解
Sep 26 Javascript
详解Vue的七种传值方式
Feb 08 Vue.js
详解Vue项目的打包方式(生成dist文件)
Jan 18 Vue.js
下载站控制介绍字数显示的脚本 显示全部 隐藏介绍等功能
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中检查PHP文件是否有语法错误的方法
2009/12/23 PHP
PHP判断字符串长度的两种方法很实用
2015/09/22 PHP
php实现的微信红包算法分析(非官方)
2015/09/25 PHP
浅谈php数组array_change_key_case() 函数和array_chunk()函数
2016/10/22 PHP
PHP获取数据库表中的数据插入新的表再原删除数据方法
2018/10/12 PHP
HTML中不支持静态Expando的元素的问题
2007/03/08 Javascript
js innerHTML 的一些问题的解决方法
2008/06/22 Javascript
jquery 表单取值常用代码
2009/12/22 Javascript
xss文件页面内容读取(解决)
2010/11/28 Javascript
Jquery为单选框checkbox绑定单击click事件
2012/12/18 Javascript
js获取客户端外网ip的简单实例
2013/11/21 Javascript
jquery中获取元素里某一特定子元素的代码
2014/12/02 Javascript
JavaScript操作HTML元素和样式的方法详解
2015/10/21 Javascript
RequireJS 依赖关系的实例(推荐)
2017/01/21 Javascript
vue中如何实现变量和字符串拼接
2017/06/19 Javascript
jquery实现掷骰子小游戏
2019/10/24 jQuery
[01:59]游戏“zheng”当时试玩会
2019/08/21 DOTA
Django查找网站项目根目录和对正则表达式的支持
2015/07/15 Python
Python计算字符宽度的方法
2016/06/14 Python
Python类的继承和多态代码详解
2017/12/27 Python
Python实现批量读取图片并存入mongodb数据库的方法示例
2018/04/02 Python
对Python中数组的几种使用方法总结
2018/06/28 Python
virtualenv 指定 python 解释器的版本方法
2018/10/25 Python
Python提取频域特征知识点浅析
2019/03/04 Python
python打开使用的方法
2019/09/30 Python
Jupyter notebook快速入门教程(推荐)
2020/05/18 Python
python中什么是面向对象
2020/06/11 Python
PIP和conda 更换国内安装源的方法步骤
2020/09/21 Python
捷克多品牌在线时尚商店:ANSWEAR.cz
2020/10/03 全球购物
国窖1573广告词
2014/03/21 职场文书
教师党员一句话承诺
2014/03/28 职场文书
个人合作协议书范本
2014/04/18 职场文书
反腐倡廉标语
2014/06/24 职场文书
公司领导九九重阳节发言稿2014
2014/09/25 职场文书
六年级语文教学反思
2016/03/03 职场文书
导游词之阆中古城
2019/12/23 职场文书