近來(lái)要做一個(gè)記事本系統,想找一個(gè)合適的日歷控件,但網(wǎng)上的都是那種日歷選擇控件。
于是到qq的記事本系統找了一個(gè),但里面的算法有點(diǎn)落后,所以用了它的樣式自己寫(xiě)了個(gè)。
效果:
<<
>>
2008年
11月
| 日 |
一 |
二 |
三 |
四 |
五 |
六 |
| |
|
|
|
|
|
1 |
| 2 |
3 |
4 |
5 |
6 |
7 |
8 |
| 9 |
10 |
11 |
12 |
13 |
14 |
15 |
| 16 |
17 |
18 |
19 |
20 |
21 |
22 |
| 23 |
24 |
25 |
26 |
27 |
28 |
29 |
| 30 |
|
|
|
|
|
|
程序說(shuō)明
【Date】
這個(gè)日歷控件運用了很多Date相關(guān)操作和方法。
先說(shuō)說(shuō)Date對象幾個(gè)有用的屬性:
getFullYear:返回年份值
getMonth:返回月份值
getDate:返回一個(gè)月中的日期值
getDay:返回一周中的日期值
其中對getDay可能比較陌生,下面列出值對應的星期:
值 星期
0 星期天
1 星期一
2 星期二
3 星期三
4 星期四
5 星期五
6 星期六
這幾個(gè)屬性都是根據本地時(shí)間獲取的,還有g(shù)etUTCFullYear、getUTCMonth、getUTCDate、getUTCDay這幾個(gè)屬性是全球標準時(shí)間對應的值。
下面說(shuō)說(shuō)獲取日期對象,獲取當前日期很簡(jiǎn)單:
new Date()
獲取指定日期:
new Date(this.options.SelectDay)
獲取指定年月日的日期:
new Date(this.Year, this.Month - 1, d)
下面是幾個(gè)比較有技巧的地方:
首先,做日歷控件時(shí)需要知道該月第一天離星期天的天數,參照getDay對應值,發(fā)現這剛好等于該月第一天的getDay值,所以可以這樣獲得:
new Date(this.Year, this.Month - 1, 1).getDay()
還有是獲取該月的天數,這里比較精妙,通過(guò)獲取該月最后一天的getDate值就可以得到該月的天數,但沒(méi)有辦法直接獲取該月最后一天。
這里有一個(gè)方法,當獲取指定年月日的日期時(shí),設置日參數為0,就可以獲取上一個(gè)月的最后一天,所以可以這樣獲?。?/p>
new Date(this.Year, this.Month, 0).getDate()
這個(gè)方法是很久以前在別人代碼中發(fā)現的。
使用說(shuō)明:
首先是實(shí)例化一個(gè)Calendar,并設置參數。
參數說(shuō)明:
Year:要顯示的年份
Month:要顯示的月份
SelectDay:選擇日期
onSelectDay:在選擇日期觸發(fā)
onToday:在當天日期觸發(fā)
onFinish:日歷畫(huà)完后觸發(fā)
一般SelectDay設置成選擇了的日期,并在onSelectDay中設置一個(gè)函數用來(lái)設置這個(gè)日期的樣式,
例如實(shí)例里SelectDay設置成今個(gè)月10號并在那天樣式設為onSelect:
SelectDay: new Date().setDate(10),
onSelectDay: function(o){ o.className = "onSelect"; },
而onToday就用來(lái)設置今日日期的樣式,
例如實(shí)例里面把今天的日期的樣式設為onToday:
onToday: function(o){ o.className = "onToday"; },
在onFinish中可以放需要設置日歷的程序。
可以通過(guò)this.Year和this.Month獲取當前日歷顯示的年份和月份。
對有數據的日期的也在這里設置,例如實(shí)例中是有一個(gè)當前月份的有數據的日期列表,然后根據這個(gè)列表對相應的日期進(jìn)行設置:
實(shí)例中是固定了這個(gè)日期列表,實(shí)際應用中可以根據年份月份獲取對應的日期列表,
個(gè)人推薦用年份月份通過(guò)ajax獲取。
程序還有下面這幾個(gè)方法:
NowMonth:顯示當前月
PreMonth:顯示上一月
NextMonth:顯示下一月
PreYear:顯示上一年
NextYear:顯示下一年
PreDraw:根據日期參數畫(huà)日歷
程序代碼:

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(){},//在選擇日期觸發(fā)
onToday: function(){},//在當天日期觸發(fā)
onFinish: function(){}//日歷畫(huà)完后觸發(fā)
};
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));
},
//根據日期畫(huà)日歷
PreDraw: function(date) {
//再設置屬性
this.Year = date.getFullYear(); this.Month = date.getMonth() + 1;
//重新畫(huà)日歷
this.Draw();
},
//畫(huà)日歷
Draw: function() {
//用來(lái)保存日期列表
var arr = [];
//用當月第一天在一周中的日期值作為當月離第一天的天數
for(var i = 1, firstDay = new Date(this.Year, this.Month - 1, 1).getDay(); i <= firstDay; i++){ arr.push(0); }
//用當月最后一天在一個(gè)月中的日期值作為當月的天數
for(var i = 1, monthDay = new Date(this.Year, this.Month, 0).getDate(); i <= monthDay; i++){ arr.push(i); }
//清空原來(lái)的日期對象列表
this.Days = [];
//插入日期
var frag = document.createDocumentFragment();
while(arr.length){
//每個(gè)星期插入一個(gè)tr
var row = document.createElement("tr");
//每個(gè)星期有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.