最近要用到日历控件刚开始是使用梅花雨3.0不过发现了一些弹出的快慢还有定位的问题.总是有点麻烦.另外我是处于一个隐藏层内所以会有很多问题. 这个时候研究了下discuznt.net看到他们投票里面有一个很好的JS控件,内容如下
文件名为:calendar.js
var
is_ie
=
document.all
?
true
:
false
;
var
is_ff
=
window.addEventListener
?
true
:
false
;
//
得到控件的绝对位置
function
getposition(id)
...
{
e
=
document.getElementById(id);
var
t
=
e.offsetTop;
var
l
=
e.offsetLeft;
while
(e
=
e.offsetParent)
...
{
t
+=
e.offsetTop;
l
+=
e.offsetLeft;
}
var
r
=
new
Array();
r[
'
x
'
]
=
l;
r[
'
y
'
]
=
t;
return
r;
}
//
debug
document.write(
'
<div id="jsdebug"></div>
'
);
function
d(e)
...
{
s
=
''
;
for
(k
in
e)
...
{
t
=
typeof
e[k];
s
+=
t
+
'
: <b>
'
+
k
+
'
:</b>
'
+
e[k]
+
'
<br>
'
;
}
document.getElementById(
'
jsdebug
'
).innerHTML
=
s;
}
/**/
/*
*********************************************************************************************************************
*/
var
controlid;
//
控件 日历数值显示, 绝对位置定位
var
currdate
=
null
;
//
当前初始化时间 默认为本地时间
var
startdate
=
null
;
//
日期范围 - 开始日期
var
enddate
=
null
;
//
日期范围 - 截止日期
var
yy
=
null
;
//
年
var
mm
=
null
;
//
月
var
i;
//
列
var
j;
//
行
var
currday
=
null
;
//
今天
var
today
=
new
Date();
//
当前时间
today.setHours(
0
);
today.setMinutes(
0
);
today.setSeconds(
0
);
today.setMilliseconds(
0
);
//
pasedate('2005-1-2') 返回date对象
function
parsedate(s)
...
{
if
(s
==
''
)
...
{
return
false
;}
;
var
reg
=
new
RegExp(
"
[^0-9-]
"
,
""
)
if
(s.search(reg)
>=
0
)
return
today;
var
ss
=
s.split(
"
-
"
);
if
(ss.length
!=
3
)
return
today;
if
(isNaN(ss[
0
])
||
isNaN(ss[
1
])
||
isNaN(ss[
2
]))
return
today;
return
new
Date(parseFloat(ss[
0
]),parseFloat(ss[
1
])
-
1
,parseFloat(ss[
2
]));
}
function
setdate(d)
...
{
document.getElementById(
'
calendardiv
'
).style.display
=
'
none
'
;
controlid.value
=
yy
+
"
-
"
+
(mm
+
1
)
+
"
-
"
+
d;
}
function
myCancelBubble(event)
...
{
e
=
event
?
event : window.event ;
if
(is_ff)
...
{
e.stopPropagation();
}
else
if
(is_ie)
...
{
e.cancelBubble
=
true
;
}
}
function
initcalendar()
...
{
//
当前时间
s
=
'
<style>
'
;
s
+=
'
#calendardiv{background-color:#FFFFCC;cursor:default}
'
;
s
+=
'
#calendardiv a{color:#333333;text-decoration:none;}
'
;
s
+=
'
#calendardiv table{border:1px solid #333333}
'
;
s
+=
'
.expire, .expire a{color:#ccc;}
'
;
s
+=
'
.default, .default a{color:#333333}
'
;
s
+=
'
.checked, .checked a{font-weight:bold;}
'
;
s
+=
'
.today{color:#ffcc00}
'
;
s
+=
'
</style>
'
;
s
+=
'
<div id="calendardiv" style="display:none;position:absolute;" onclick="myCancelBubble(event)">
'
;
s
+=
'
<table cellpadding="2" cellspacing="4">
'
;
s
+=
'
<tr><td colspan="7"><table width="100%" style="border:0px" align="center"><tr><td id="prev" align="center"><a href="javascript:drawcalendar(yy-1,mm);" title="上一年"><img src="../../images/page/first.gif" border="0" width="9" height="8" /></a>  <a href="javascript:drawcalendar(yy,mm-1);" title="上个月"><img src="../../images/page/prev.gif" border="0" width="8" height="8" /></a></td><td colspan="5" id="yyyymm" align="center"></td><td id="next" align="center"><a href="javascript:drawcalendar(yy,mm+1);" title="下个月"><img src="../../images/page/next.gif" border="0" width="8" height="8" /></a>  <a href="javascript:drawcalendar(yy+1,mm);" title="下一年"><img src="../../images/page/last.gif" border="0" width="9" height="8" /></a></td></tr></table></td></tr>
'
;
//
s += '<tr><td id="prev"> </td><td colspan="5" id="yyyymm" align="center"></td></tr>';
s
+=
'
<tr><td>日</td><td>一</td><td>二</td><td>三</td><td>四</td><td>五</td><td>六</td></tr>
'
;
for
(i
=
0
; i
<
6
; i
++
)
...
{
s
+=
"
<tr>
"
;
for
(j
=
1
; j
<=
7
; j
++
)
s
+=
"
<td id=d
"
+
(i
*
7
+
j)
+
"
height="19">0</td>
"
;
s
+=
"
</tr>
"
;
}
s
+=
'
</table>
'
;
s
+=
'
</div>
'
;
document.write(s);
currday
=
currdate
?
currdate : today;
//
默认为本地时间
//
点击隐藏
document.onclick
=
function
()
...
{
document.getElementById(
'
calendardiv
'
).style.display
=
'
none
'
;
}
}
function
showcalendar(event, controlid1, startdate1, enddate1, defday)
...
{
//
判断controlid position
controlid
=
document.getElementById(controlid1);
startdate
=
parsedate(document.getElementById(startdate1).value);
enddate
=
parsedate(document.getElementById(enddate1).value);
defday
=
parsedate(defday);
var
p
=
getposition(controlid1);
document.getElementById(
'
calendardiv
'
).style.display
=
'
block
'
;
document.getElementById(
'
calendardiv
'
).style.left
=
p[
'
x
'
];
document.getElementById(
'
calendardiv
'
).style.top
=
p[
'
y
'
]
+
20
;
myCancelBubble(event);
drawcalendar(defday.getFullYear(),defday.getMonth());
}
//
刷新日历
function
drawcalendar(y, m)
...
{
var
x
=
new
Date(y, m,
1
);
var
mv
=
x.getDay();
var
d
=
x.getDate();
var
de
=
null
;
//
单元格对象
yy
=
x.getFullYear();
mm
=
x.getMonth();
document.getElementById(
"
yyyymm
"
).innerHTML
=
yy
+
"
.
"
+
(mm
+
1
>
9
?
mm
+
1
:
"
0
"
+
(mm
+
1
));
//
将1号以前的单元设置为空
for
(
var
i
=
1
; i
<=
mv; i
++
)
...
{
de
=
document.getElementById(
"
d
"
+
i);
de.innerHTML
=
""
;
de.className
=
""
;
}
//
开始画当月日历
while
(x.getMonth()
==
mm)
...
{
de
=
document.getElementById(
"
d
"
+
(d
+
mv));
if
((enddate
&&
x.getTime()
>
enddate.getTime())
||
(startdate
&&
x.getTime()
<
startdate.getTime()))
...
{
de.className
=
'
expire
'
;
de.innerHTML
=
d;
}
else
...
{
de.className
=
'
default
'
;
de.innerHTML
=
"
<a href=javascript:setdate(
"
+
d
+
"
);>
"
+
d
+
"
</a>
"
;
}
if
(x.getTime()
==
currday.getTime())
...
{
de.className
=
'
checked
'
;
}
if
(x.getTime()
==
today.getTime())
...
{
de.className
=
'
today
'
;
}
x.setDate(
++
d);
}
//
尾部空格
while
(d
+
mv
<=
42
)
...
{
de
=
document.getElementById(
"
d
"
+
(d
+
mv));
de.innerHTML
=
""
;
de.bgColor
=
""
;
de.className
=
""
;
d
++
;
}
}
initcalendar();
那么我再default.aspx里面要引用这个怎么使用呢.
下面就是default.aspx的前台代码
首先再<head></head>标签内部填入以下(当然这个路径你要注意哦,我是放在一个目录下的)
<
script language
=
"
javascript
"
type
=
"
text/javascript
"
src
=
"
calendar.js
"
></
script
>
看到这个calendar.js里面有句function showcalendar(event, controlid1, startdate1, enddate1, defday)
其中controlid1表示要使用这个日历的空间的ID,startdate1,enddate1,表示指示开始以及指定时间的范围的空间的ID.defday
这样我再default.aspx里面放上三个input,两个是runat server,因为我需要取得还有生成开始值
记得后两个input 为hidden.
<
asp:TextBox ID
=
"
enddatetime
"
runat
=
"
server
"
onClick
=
"
showcalendar(event, 'enddatetime', 'cal_startdate', 'cal_enddate','cal_enddate')
"
></
asp:TextBox
>&
nbsp;
<
input type
=
"
hidden
"
name
=
"
cal_startdate
"
runat
=
"
server
"
id
=
"
cal_startdate
"
/>
<
input type
=
"
hidden
"
name
=
"
cal_enddate
"
id
=
"
cal_enddate
"
runat
=
"
server
"
/>
那么我在default.aspx.cs里面生成初始值也就是当前的值
protected
void
Page_Load(
object
sender, EventArgs e)
...
{
cal_startdate.Value
=
DateTime.Now.Year.ToString()
+
"
-
"
+
DateTime.Now.Month.ToString()
+
"
-
"
+
DateTime.Now.Day.ToString();
}
ok run一下,发现在当前值之前的日期始灰色不可选取的.哈哈.就这样了.我喜欢这个效果,特别始放在投票里面