JS日期和时间选择控件升级版(自写)


Posted in Javascript onAugust 02, 2013

鉴于网上找到的几个日期选择程序有些问题,遂着手重写一个程序,大部分还是借鉴前人的代码,添加了时间选择功能,隐藏会遮挡控件的标签select,object。
开始本想使用window.createPopup()来弹出日历的选择,这样就可以跨过任何标签。

不过做到中途发现用createPopup窗口实现理论上是行不通的:
一是因为不在窗体里单击任何地方都会关闭窗口,而当用下拉框选择年份时,很有可能会单击到窗体外的地方,当然这个可以自己写select来避免,但是比较麻烦;
二是窗体的宽度和高度只能在弹出时设置,而显然,在选择不同年月时,控件高度是要发生改变的。

鉴于上面的原因,还是决定采用普通的处理方法。
JS日期和时间选择控件升级版(自写) 
Calendar.js:

/** 
*本日历选择控件由tiannet根据前人经验完善而得。大部分代码来自meizz的日历控件。 
*tiannet添加了时间选择功能、select,object标签隐藏功能,还有其它小功能。 
*使用方法: 
* (1)只选择日期 <input type="text" name="date" readOnly onClick="setDay(this);"> 
* (2)选择日期和小时 <input type="text" name="dateh" readOnly onClick="setDayH(this);"> 
* (3)选择日期和小时及分钟 <input type="text" name="datehm" readOnly onClick="setDayHM(this);"> 
*设置参数的方法 
* (1)设置日期分隔符 setDateSplit(strSplit);默认为"-" 
* (2)设置日期与时间之间的分隔符 setDateTimeSplit(strSplit);默认为" " 
* (3)设置时间分隔符 setTimeSplit(strSplit);默认为":" 
* (4)设置(1),(2),(3)中的分隔符 setSplit(strDateSplit,strDateTimeSplit,strTimeSplit); 
* (5)设置开始和结束年份 setYearPeriod(intDateBeg,intDateEnd) 
*说明: 
* 默认返回的日期时间格式如同:2005-02-02 08:08 
*/ 
//------------------ 样式定义 ---------------------------// 
//功能按钮同样样式 
var s_tiannet_turn_base = "height:16px;font-size:9pt;color:white;border:0 solid #CCCCCC;cursor:hand;background-color:#2650A6;"; 
//翻年、月等的按钮 
var s_tiannet_turn = "width:28px;" + s_tiannet_turn_base; 
//关闭、清空等按钮样式 
var s_tiannet_turn2 = "width:22px;" + s_tiannet_turn_base; 
//年选择下拉框 
var s_tiannet_select = "width:64px;display:none;"; 
//月、时、分选择下拉框 
var s_tiannet_select2 = "width:46px;display:none;"; 
//日期选择控件体的样式 
var s_tiannet_body = "width:150;background-color:#2650A6;display:none;z-index:9998;position:absolute;" + 
"border-left:1 solid #CCCCCC;border-top:1 solid #CCCCCC;border-right:1 solid #999999;border-bottom:1 solid #999999;"; 
//显示日的td的样式 
var s_tiannet_day = "width:21px;height:20px;background-color:#D8F0FC;font-size:10pt;"; 
//字体样式 
var s_tiannet_font = "color:#FFCC00;font-size:9pt;cursor:hand;"; 
//链接的样式 
var s_tiannet_link = "text-decoration:none;font-size:9pt;color:#2650A6;"; 
//横线 
var s_tiannet_line = "border-bottom:1 solid #6699CC"; 
//------------------ 变量定义 ---------------------------// 
var tiannetYearSt = 1950;//可选择的开始年份 
var tiannetYearEnd = 2010;//可选择的结束年份 
var tiannetDateNow = new Date(); 
var tiannetYear = tiannetDateNow.getFullYear(); //定义年的变量的初始值 
var tiannetMonth = tiannetDateNow.getMonth()+1; //定义月的变量的初始值 
var tiannetDay = tiannetDateNow.getDate(); 
var tiannetHour = 8;//tiannetDateNow.getHours(); 
var tiannetMinute = 0;//tiannetDateNow.getMinutes(); 
var tiannetArrDay=new Array(42); //定义写日期的数组 
var tiannetDateSplit = "-"; //日期的分隔符号 
var tiannetDateTimeSplit = " "; //日期与时间之间的分隔符 
var tiannetTimeSplit = ":"; //时间的分隔符号 
var tiannetOutObject; //接收日期时间的对象 
var arrTiannetHide = new Array();//被强制隐藏的标签 
var m_bolShowHour = false;//是否显示小时 
var m_bolShowMinute = false;//是否显示分钟 
var m_aMonHead = new Array(12); //定义阳历中每个月的最大天数 
m_aMonHead[0] = 31; m_aMonHead[1] = 28; m_aMonHead[2] = 31; m_aMonHead[3] = 30; m_aMonHead[4] = 31; m_aMonHead[5] = 30; 
m_aMonHead[6] = 31; m_aMonHead[7] = 31; m_aMonHead[8] = 30; m_aMonHead[9] = 31; m_aMonHead[10] = 30; m_aMonHead[11] = 31; 
// ---------------------- 用户可调用的函数 -----------------------------// 
//用户主调函数-只选择日期 
function setDay(obj){ 
tiannetOutObject = obj; 
//如果标签中有值,则将日期初始化为当前值 
var strValue = tiannetTrim(tiannetOutObject.value); 
if( strValue != "" ){ 
tiannetInitDate(strValue); 
} 
tiannetPopCalendar(); 
} 
//用户主调函数-选择日期和小时 
function setDayH(obj){ 
tiannetOutObject = obj; 
m_bolShowHour = true; 
//如果标签中有值,则将日期和小时初始化为当前值 
var strValue = tiannetTrim(tiannetOutObject.value); 
if( strValue != "" ){ 
tiannetInitDate(strValue.substring(0,10)); 
var hour = strValue.substring(11,13); 
if( hour < 10 ) tiannetHour = hour.substring(1,2); 
} 
tiannetPopCalendar(); 
} 
//用户主调函数-选择日期和小时及分钟 
function setDayHM(obj){ 
tiannetOutObject = obj; 
m_bolShowHour = true; 
m_bolShowMinute = true; 
//如果标签中有值,则将日期和小时及分钟初始化为当前值 
var strValue = tiannetTrim(tiannetOutObject.value); 
if( strValue != "" ){ 
tiannetInitDate(strValue.substring(0,10)); 
var time = strValue.substring(11,16); 
var arr = time.split(tiannetTimeSplit); 
tiannetHour = arr[0]; 
tiannetMinute = arr[1]; 
if( tiannetHour < 10 ) tiannetHour = tiannetHour.substring(1,2); 
if( tiannetMinute < 10 ) tiannetMinute = tiannetMinute.substring(1,2); 
} 
tiannetPopCalendar(); 
} 
//设置开始日期和结束日期 
function setYearPeriod(intDateBeg,intDateEnd){ 
tiannetYearSt = intDateBeg; 
tiannetYearEnd = intDateEnd; 
} 
//设置日期分隔符。默认为"-" 
function setDateSplit(strDateSplit){ 
tiannetDateSplit = strDateSplit; 
} 
//设置日期与时间之间的分隔符。默认为" " 
function setDateTimeSplit(strDateTimeSplit){ 
tiannetDateTimeSplit = strDateTimeSplit; 
} 
//设置时间分隔符。默认为":" 
function setTimeSplit(strTimeSplit){ 
tiannetTimeSplit = strTimeSplit; 
} 
//设置分隔符 
function setSplit(strDateSplit,strDateTimeSplit,strTimeSplit){ 
tiannetDateSplit(strDateSplit); 
tiannetDateTimeSplit(strDateTimeSplit); 
tiannetTimeSplit(strTimeSplit); 
} 
//设置默认的日期。格式为:YYYY-MM-DD 
function setDefaultDate(strDate){ 
tiannetYear = strDate.substring(0,4); 
tiannetMonth = strDate.substring(5,7); 
tiannetDay = strDate.substring(8,10); 
} 
//设置默认的时间。格式为:HH24:MI 
function setDefaultTime(strTime){ 
tiannetHour = strTime.substring(0,2); 
tiannetMinute = strTime.substring(3,5); 
} 
// ---------------------- end 用户可调用的函数 -----------------------------// 
//------------------ begin 页面显示部分 ---------------------------// 
var weekName = new Array("日","一","二","三","四","五","六"); 
document.write('<div id="divTiannetDate" style="'+s_tiannet_body+'" style="本日历选择控件由tiannet根据前人经验完善而成!">'); 
document.write('<div align="center" id="divTiannetDateText" Author="tiannet" style="padding-top:2px;">'); 
document.write('<span id="tiannetYearHead" Author="tiannet" style="'+s_tiannet_font+'" '+ 
'onclick="spanYearCEvent();"> 年</span>'); 
document.write('<select id="selTianYear" style="'+s_tiannet_select+'" Author="tiannet" '+ 
' onChange="tiannetYear=this.value;tiannetSetDay(tiannetYear,tiannetMonth);document.all.tiannetYearHead.style.display=\'\';'+ 
'this.style.display=\'none\';">'); 
for(var i=tiannetYearSt;i <= tiannetYearEnd;i ++){ 
document.writeln('<option value="' + i + '">' + i + '年</option>'); 
} 
document.write('</select>'); 
document.write('<span id="tiannetMonthHead" Author="tiannet" style="'+s_tiannet_font+'" '+ 
'onclick="spanMonthCEvent();">  月</span>'); 
document.write('<select id="selTianMonth" style="'+s_tiannet_select2+'" Author="tiannet" '+ 
'onChange="tiannetMonth=this.value;tiannetSetDay(tiannetYear,tiannetMonth);document.all.tiannetMonthHead.style.display=\'\';'+ 
'this.style.display=\'none\';">'); 
for(var i=1;i <= 12;i ++){ 
document.writeln('<option value="' + i + '">' + i + '月</option>'); 
} 
document.write('</select>'); 
//document.write('</div>'); 
//document.write('<div align="center" id="divTiannetTimeText" Author="tiannet">'); 
document.write('<span id="tiannetHourHead" Author="tiannet" style="'+s_tiannet_font+'display:none;" '+ 
'onclick="spanHourCEvent();"> 时</span>'); 
document.write('<select id="selTianHour" style="'+s_tiannet_select2+'display:none;" Author="tiannet" '+ 
' onChange="tiannetHour=this.value;tiannetWriteHead();document.all.tiannetHourHead.style.display=\'\';' + 
'this.style.display=\'none\';">'); 
for(var i=0;i <= 23;i ++){ 
document.writeln('<option value="' + i + '">' + i + '时</option>'); 
} 
document.write('</select>'); 
document.write('<span id="tiannetMinuteHead" Author="tiannet" style="'+s_tiannet_font+'display:none;" '+ 
'onclick="spanMinuteCEvent();">  分</span>'); 
document.write('<select id="selTianMinute" style="'+s_tiannet_select2+'display:none;" Author="tiannet" '+ 
' onChange="tiannetMinute=this.value;tiannetWriteHead();document.all.tiannetMinuteHead.style.display=\'\';'+ 
'this.style.display=\'none\';">'); 
for(var i=0;i <= 59;i ++){ 
document.writeln('<option value="' + i + '">' + i + '分</option>'); 
} 
document.write('</select>'); 
document.write('</div>'); 
//输出一条横线 
document.write('<div style="'+s_tiannet_line+'"></div>'); 
document.write('<div align="center" id="divTiannetTurn" style="border:0;" Author="tiannet">'); 
document.write('<input type="button" style="'+s_tiannet_turn+'" value="年↑" title="上一年" onClick="tiannetPrevYear();">'); 
document.write('<input type="button" style="'+s_tiannet_turn+'" value="年↓" title="下一年" onClick="tiannetNextYear();"> '); 
document.write('<input type="button" style="'+s_tiannet_turn+'" value="月↑" title="上一月" onClick="tiannetPrevMonth();">'); 
document.write('<input type="button" style="'+s_tiannet_turn+'" value="月↓" title="下一月" onClick="tiannetNextMonth();">'); 
document.write('</div>'); 
//输出一条横线 
document.write('<div style="'+s_tiannet_line+'"></div>'); 
document.write('<table border=0 cellspacing=0 cellpadding=0 bgcolor=white onselectstart="return false">'); 
document.write(' <tr style="background-color:#2650A6;font-size:10pt;color:white;height:22px;" Author="tiannet">'); 
for(var i =0;i < weekName.length;i ++){ 
//输出星期 
document.write('<td width="21" align="center" Author="tiannet">' + weekName[i] + '</td>'); 
} 
document.write(' </tr>'); 
document.write('</table>'); 
//输出天的选择 
document.write('<table border=0 cellspacing=1 cellpadding=0 bgcolor=white onselectstart="return false">'); 
var n = 0; 
for (var i=0;i<5;i++) { 
document.write (' <tr align=center id="trTiannetDay' + i + '" >'); 
for (var j=0;j<7;j++){ 
document.write('<td align="center" id="tdTiannetDay' + n + '" '+ 
'onClick="tiannetDay=this.innerText;tiannetSetValue(true);" ' 
+' style="' + s_tiannet_day + '"> </td>'); 
n ++; 
} 
document.write (' </tr>'); 
} 
document.write (' <tr align=center id="trTiannetDay5" >'); 
document.write('<td align="center" id="tdTiannetDay35" onClick="tiannetDay=this.innerText;tiannetSetValue(true);" ' 
+' style="' + s_tiannet_day + '"> </td>'); 
document.write('<td align="center" id="tdTiannetDay36" onClick="tiannetDay=this.innerText;tiannetSetValue(true);" ' 
+' style="' + s_tiannet_day + '"> </td>'); 
document.write('<td align="right" colspan="5"><a href="javascript:tiannetClear();" style="' + s_tiannet_link + '">清空</a>'+ 
' <a href="javascript:tiannetHideControl();" style="' + s_tiannet_link + '">关闭</a>' + 
' <a href="javascript:tiannetSetValue(true);" style="' + s_tiannet_link + '">确定</a> ' + 
'</td>'); 
document.write (' </tr>'); 
document.write('</table>'); 
document.write('</div>'); 
//------------------ end 页面显示部分 ---------------------------// 
//------------------ 显示日期时间的span标签响应事件 ---------------------------// 
//单击年份span标签响应 
function spanYearCEvent(){ 
hideElementsById(new Array("selTianYear","tiannetMonthHead"),false); 
if(m_bolShowHour) hideElementsById(new Array("tiannetHourHead"),false); 
if(m_bolShowMinute) hideElementsById(new Array("tiannetMinuteHead"),false); 
hideElementsById(new Array("tiannetYearHead","selTianMonth","selTianHour","selTianMinute"),true); 
} 
//单击月份span标签响应 
function spanMonthCEvent(){ 
hideElementsById(new Array("selTianMonth","tiannetYearHead"),false); 
if(m_bolShowHour) hideElementsById(new Array("tiannetHourHead"),false); 
if(m_bolShowMinute) hideElementsById(new Array("tiannetMinuteHead"),false); 
hideElementsById(new Array("tiannetMonthHead","selTianYear","selTianHour","selTianMinute"),true); 
} 
//单击小时span标签响应 
function spanHourCEvent(){ 
hideElementsById(new Array("tiannetYearHead","tiannetMonthHead"),false); 
if(m_bolShowHour) hideElementsById(new Array("selTianHour"),false); 
if(m_bolShowMinute) hideElementsById(new Array("tiannetMinuteHead"),false); 
hideElementsById(new Array("tiannetHourHead","selTianYear","selTianMonth","selTianMinute"),true); 
} 
//单击分钟span标签响应 
function spanMinuteCEvent(){ 
hideElementsById(new Array("tiannetYearHead","tiannetMonthHead"),false); 
if(m_bolShowHour) hideElementsById(new Array("tiannetHourHead"),false); 
if(m_bolShowMinute) hideElementsById(new Array("selTianMinute"),false); 
hideElementsById(new Array("tiannetMinuteHead","selTianYear","selTianMonth","selTianHour"),true); 
} 
//根据标签id隐藏或显示标签 
function hideElementsById(arrId,bolHide){ 
var strDisplay = ""; 
if(bolHide) strDisplay = "none"; 
for(var i = 0;i < arrId.length;i ++){ 
var obj = document.getElementById(arrId[i]); 
obj.style.display = strDisplay; 
} 
} 
//------------------ end 显示日期时间的span标签响应事件 ---------------------------// 
//判断某年是否为闰年 
function isPinYear(year){ 
var bolRet = false; 
if (0==year%4&&((year%100!=0)||(year%400==0))) { 
bolRet = true; 
} 
return bolRet; 
} 
//得到一个月的天数,闰年为29天 
function getMonthCount(year,month){ 
var c=m_aMonHead[month-1]; 
if((month==2)&&isPinYear(year)) c++; 
return c; 
} 
//重新设置当前的日。主要是防止在翻年、翻月时,当前日大于当月的最大日 
function setRealDayCount() { 
if( tiannetDay > getMonthCount(tiannetYear,tiannetMonth) ) { 
//如果当前的日大于当月的最大日,则取当月最大日 
tiannetDay = getMonthCount(tiannetYear,tiannetMonth); 
} 
} 
//在个位数前加零 
function addZero(value){ 
if(value < 10 ){ 
value = "0" + value; 
} 
return value; 
} 
//取出空格 
function tiannetTrim(str) { 
return str.replace(/(^\s*)|(\s*$)/g,""); 
} 
//为select创建一个option 
function createOption(objSelect,value,text){ 
var option = document.createElement("OPTION"); 
option.value = value; 
option.text = text; 
objSelect.options.add(option); 
} 
//往前翻 Year 
function tiannetPrevYear() { 
if(tiannetYear > 999 && tiannetYear <10000){tiannetYear--;} 
else{alert("年份超出范围(1000-9999)!");} 
tiannetSetDay(tiannetYear,tiannetMonth); 
//如果年份小于允许的最小年份,则创建对应的option 
if( tiannetYear < tiannetYearSt ) { 
tiannetYearSt = tiannetYear; 
createOption(document.all.selTianYear,tiannetYear,tiannetYear + "年"); 
} 
checkSelect(document.all.selTianYear,tiannetYear); 
tiannetWriteHead(); 
} 
//往后翻 Year 
function tiannetNextYear() { 
if(tiannetYear > 999 && tiannetYear <10000){tiannetYear++;} 
else{alert("年份超出范围(1000-9999)!");return;} 
tiannetSetDay(tiannetYear,tiannetMonth); 
//如果年份超过允许的最大年份,则创建对应的option 
if( tiannetYear > tiannetYearEnd ) { 
tiannetYearEnd = tiannetYear; 
createOption(document.all.selTianYear,tiannetYear,tiannetYear + "年"); 
} 
checkSelect(document.all.selTianYear,tiannetYear); 
tiannetWriteHead(); 
} 
//选择今天 
function tiannetToday() { 
tiannetYear = tiannetDateNow.getFullYear(); 
tiannetMonth = tiannetDateNow.getMonth()+1; 
tiannetDay = tiannetDateNow.getDate(); 
tiannetSetValue(true); 
//tiannetSetDay(tiannetYear,tiannetMonth); 
//selectObject(); 
} 
//往前翻月份 
function tiannetPrevMonth() { 
if(tiannetMonth>1){tiannetMonth--}else{tiannetYear--;tiannetMonth=12;} 
tiannetSetDay(tiannetYear,tiannetMonth); 
checkSelect(document.all.selTianMonth,tiannetMonth); 
tiannetWriteHead(); 
} 
//往后翻月份 
function tiannetNextMonth() { 
if(tiannetMonth==12){tiannetYear++;tiannetMonth=1}else{tiannetMonth++} 
tiannetSetDay(tiannetYear,tiannetMonth); 
checkSelect(document.all.selTianMonth,tiannetMonth); 
tiannetWriteHead(); 
} 
//向span标签中写入年、月、时、分等数据 
function tiannetWriteHead(){ 
document.all.tiannetYearHead.innerText = tiannetYear + "年"; 
document.all.tiannetMonthHead.innerText = tiannetMonth + "月"; 
if( m_bolShowHour ) document.all.tiannetHourHead.innerText = " "+tiannetHour + "时"; 
if( m_bolShowMinute ) document.all.tiannetMinuteHead.innerText = tiannetMinute + "分"; 
tiannetSetValue(false);//给文本框赋值,但不隐藏本控件 
} 
//设置显示天 
function tiannetSetDay(yy,mm) { 
setRealDayCount();//设置当月真实的日 
tiannetWriteHead(); 
var strDateFont1 = "", strDateFont2 = "" //处理日期显示的风格 
for (var i = 0; i < 37; i++){tiannetArrDay[i]=""}; //将显示框的内容全部清空 
var day1 = 1; 
var firstday = new Date(yy,mm-1,1).getDay(); //某月第一天的星期几 
for (var i = firstday; day1 < getMonthCount(yy,mm)+1; i++){ 
tiannetArrDay[i]=day1;day1++; 
} 
//如果用于显示日的最后一行的第一个单元格的值为空,则隐藏整行。 
//if(tiannetArrDay[35] == ""){ 
// document.all.trTiannetDay5.style.display = "none"; 
//} else { 
// document.all.trTiannetDay5.style.display = ""; 
//} 
for (var i = 0; i < 37; i++){ 
var da = eval("document.all.tdTiannetDay"+i) //书写新的一个月的日期星期排列 
if (tiannetArrDay[i]!="") { 
//判断是否为周末,如果是周末,则改为红色字体 
if(i % 7 == 0 || (i+1) % 7 == 0){ 
strDateFont1 = "<font color=#f0000>" 
strDateFont2 = "</font>" 
} else { 
strDateFont1 = ""; 
strDateFont2 = "" 
} 
da.innerHTML = strDateFont1 + tiannetArrDay[i] + strDateFont2; 
//如果是当前选择的天,则改变颜色 
if(tiannetArrDay[i] == tiannetDay ) { 
da.style.backgroundColor = "#CCCCCC"; 
} else { 
da.style.backgroundColor = "#EFEFEF"; 
} 
da.style.cursor="hand" 
} else { 
da.innerHTML="";da.style.backgroundColor="";da.style.cursor="default" 
} 
}//end for 
tiannetSetValue(false);//给文本框赋值,但不隐藏本控件 
}//end function tiannetSetDay 
//根据option的值选中option 
function checkSelect(objSelect,selectValue) { 
var count = parseInt(objSelect.length); 
if( selectValue < 10 && selectValue.toString().length == 2) { 
selectValue = selectValue.substring(1,2); 
} 
for(var i = 0;i < count;i ++){ 
if(objSelect.options[i].value == selectValue){ 
objSelect.selectedIndex = i; 
break; 
} 
}//for 
} 
//选中年、月、时、分等下拉框 
function selectObject(){ 
//如果年份小于允许的最小年份,则创建对应的option 
if( tiannetYear < tiannetYearSt ) { 
for( var i = tiannetYear;i < tiannetYearSt;i ++ ){ 
createOption(document.all.selTianYear,i,i + "年"); 
} 
tiannetYearSt = tiannetYear; 
} 
//如果年份超过允许的最大年份,则创建对应的option 
if( tiannetYear > tiannetYearEnd ) { 
for( var i = tiannetYearEnd+1;i <= tiannetYear;i ++ ){ 
createOption(document.all.selTianYear,i,i + "年"); 
} 
tiannetYearEnd = tiannetYear; 
} 
checkSelect(document.all.selTianYear,tiannetYear); 
checkSelect(document.all.selTianMonth,tiannetMonth); 
if( m_bolShowHour ) checkSelect(document.all.selTianHour,tiannetHour); 
if( m_bolShowMinute ) checkSelect(document.all.selTianMinute,tiannetMinute); 
} 
//给接受日期时间的控件赋值 
//参数bolHideControl - 是否隐藏控件 
function tiannetSetValue(bolHideControl){ 
var value = ""; 
if( !tiannetDay || tiannetDay == "" ){ 
tiannetOutObject.value = value; 
return; 
} 
var mm = tiannetMonth; 
var day = tiannetDay; 
if( mm < 10 && mm.toString().length == 1) mm = "0" + mm; 
if( day < 10 && day.toString().length == 1) day = "0" + day; 
value = tiannetYear + tiannetDateSplit + mm + tiannetDateSplit + day; 
if( m_bolShowHour ){ 
var hour = tiannetHour; 
if( hour < 10 && hour.toString().length == 1 ) hour = "0" + hour; 
value += tiannetDateTimeSplit + hour; 
} 
if( m_bolShowMinute ){ 
var minute = tiannetMinute; 
if( minute < 10 && minute.toString().length == 1 ) minute = "0" + minute; 
value += tiannetTimeSplit + minute; 
} 
tiannetOutObject.value = value; 
//document.all.divTiannetDate.style.display = "none"; 
if( bolHideControl ) { 
tiannetHideControl(); 
} 
} 
//是否显示时间 
function showTime(){ 
if( !m_bolShowHour && m_bolShowMinute){ 
alert("如果要选择分钟,则必须可以选择小时!"); 
return; 
} 
hideElementsById(new Array("tiannetHourHead","selTianHour","tiannetMinuteHead","selTianMinute"),true); 
if( m_bolShowHour ){ 
//显示小时 
hideElementsById(new Array("tiannetHourHead"),false); 
} 
if( m_bolShowMinute ){ 
//显示分钟 
hideElementsById(new Array("tiannetMinuteHead"),false); 
} 
} 
//弹出显示日历选择控件,以让用户选择 
function tiannetPopCalendar(){ 
//隐藏下拉框,显示相对应的head 
hideElementsById(new Array("selTianYear","selTianMonth","selTianHour","selTianMinute"),true); 
hideElementsById(new Array("tiannetYearHead","tiannetMonthHead","tiannetHourHead","tiannetMinuteHead"),false); 
tiannetSetDay(tiannetYear,tiannetMonth); 
tiannetWriteHead(); 
showTime(); 
var dads = document.all.divTiannetDate.style; 
var iX, iY; 
var h = document.all.divTiannetDate.offsetHeight; 
var w = document.all.divTiannetDate.offsetWidth; 
//计算left 
if (window.event.x + h > document.body.offsetWidth - 10 ) 
iX = window.event.x - h - 5 ; 
else 
iX = window.event.x + 5; 
if (iX <0) 
iX=0; 
//计算top 
iY = window.event.y; 
if (window.event.y + w > document.body.offsetHeight - 10 ) 
iY = document.body.scrollTop + document.body.offsetHeight - w - 5 ; 
else 
iY = document.body.scrollTop +window.event.y + 5; 
if (iY <0) 
iY=0; 
dads.left = iX; 
dads.top = iY; 
tiannetShowControl(); 
selectObject(); 
} 
//隐藏日历控件(同时显示被强制隐藏的标签) 
function tiannetHideControl(){ 
document.all.divTiannetDate.style.display = "none"; 
tiannetShowObject(); 
arrTiannetHide = new Array();//将被隐藏的标签对象清空 
} 
//显示日历控件(同时隐藏会遮挡的标签) 
function tiannetShowControl(){ 
document.all.divTiannetDate.style.display = ""; 
tiannetHideObject("SELECT"); 
tiannetHideObject("OBJECT"); 
} 
//根据标签名称隐藏标签。如会遮住控件的select,object 
function tiannetHideObject(strTagName) { 
x = document.all.divTiannetDate.offsetLeft; 
y = document.all.divTiannetDate.offsetTop; 
h = document.all.divTiannetDate.offsetHeight; 
w = document.all.divTiannetDate.offsetWidth; 
for (var i = 0; i < document.all.tags(strTagName).length; i++) 
{ 
var obj = document.all.tags(strTagName)[i]; 
if (! obj || ! obj.offsetParent) 
continue; 
// 获取元素对于BODY标记的相对坐标 
var objLeft = obj.offsetLeft; 
var objTop = obj.offsetTop; 
var objHeight = obj.offsetHeight; 
var objWidth = obj.offsetWidth; 
var objParent = obj.offsetParent; 
while (objParent.tagName.toUpperCase() != "BODY"){ 
objLeft += objParent.offsetLeft; 
objTop += objParent.offsetTop; 
objParent = objParent.offsetParent; 
} 
//alert("控件左端:" + x + "select左端" + (objLeft + objWidth) + "控件底部:" + (y+h) + "select高:" + objTop); 
var bolHide = true; 
if( obj.style.display == "none" || obj.style.visibility == "hidden" || obj.getAttribute("Author") == "tiannet" ){ 
//如果标签本身就是隐藏的,则不需要再隐藏。如果是控件中的下拉框,也不用隐藏。 
bolHide = false; 
} 
if( ( (objLeft + objWidth) > x && (y + h + 20) > objTop && (objTop+objHeight) > y && objLeft < (x+w) ) && bolHide ){ 
//arrTiannetHide.push(obj);//记录被隐藏的标签对象 
arrTiannetHide[arrTiannetHide.length] = obj; 
obj.style.visibility = "hidden"; 
} 
} 
} 
//显示被隐藏的标签 
function tiannetShowObject(){ 
for(var i = 0;i < arrTiannetHide.length;i ++){ 
//alert(arrTiannetHide[i]); 
arrTiannetHide[i].style.visibility = ""; 
} 
} 
//初始化日期。 
function tiannetInitDate(strDate){ 
var arr = strDate.split(tiannetDateSplit); 
tiannetYear = arr[0]; 
tiannetMonth = arr[1]; 
tiannetDay = arr[2]; 
} 
//清空 
function tiannetClear(){ 
tiannetOutObject.value = ""; 
tiannetHideControl(); 
} 
//任意点击时关闭该控件 
function document.onclick(){ 
with(window.event.srcElement){ 
if (tagName != "INPUT" && getAttribute("Author") != "tiannet") 
tiannetHideControl(); 
} 
} 
//按ESC键关闭该控件 
function document.onkeypress(){ 
if( event.keyCode == 27 ){ 
tiannetHideControl(); 
} 
}

Calendar.html:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 
<html> 
<head> 
<title></title> 
<meta name="GENERATOR" content="Microsoft Visual Studio .NET 7.1"> 
<meta name="ProgId" content="VisualStudio.HTML"> 
<meta name="Originator" content="Microsoft Visual Studio .NET 7.1"> 
<script src="./Calendar.js"></script> 
</head> 
<body> 
(1)只选择日期 <input type="text" name="date" readOnly onClick="setDay(this);"><br/> 
(2)选择日期和小时 <input type="text" name="dateh" readOnly onClick="setDayH(this);"><br/> 
(3)选择日期和小时及分钟 <input type="text" name="datehm" readOnly onClick="setDayHM(this);"> 
</body> 
</html>
Javascript 相关文章推荐
JavaScript 异步调用框架 (Part 1 - 问题 &amp; 场景)
Aug 03 Javascript
js下用层来实现select的title提示属性
Feb 23 Javascript
javascript中callee与caller的区别分析
Apr 20 Javascript
bootstrap基础知识学习笔记
Nov 02 Javascript
利用jQuery来动态为属性添加或者删除属性的简单方法
Dec 02 Javascript
详解springmvc 接收json对象的两种方式
Dec 06 Javascript
jQuery实现的浮动层div浏览器居中显示效果
Feb 03 Javascript
Angular4学习教程之HTML属性绑定的方法
Jan 04 Javascript
vue-cli实现多页面多路由的示例代码
Jan 30 Javascript
vue 微信授权登录解决方案
Apr 10 Javascript
jQuery实现table表格信息的展开和缩小功能示例
Jul 21 jQuery
Vue基础配置讲解
Nov 29 Javascript
Js日期选择器并自动加入到输入框中示例代码
Aug 02 #Javascript
js动态给table添加/删除tr的方法
Aug 02 #Javascript
JS和jquery获取各种屏幕的宽度和高度的代码
Aug 02 #Javascript
JavaScript获取/更改文本框的值的实例代码
Aug 02 #Javascript
JS限制Textarea文本域字符个数的具体实现
Aug 02 #Javascript
javascript自动改变文字大小和颜色的效果的小例子
Aug 02 #Javascript
JS解决ie6下png透明的方法实例
Aug 02 #Javascript
You might like
磨咖啡豆的密诀
2021/03/03 冲泡冲煮
php算开始时间到过期时间的相隔的天数
2011/01/12 PHP
修改php.ini不生效问题解决方法(上传大于8M的文件)
2013/06/14 PHP
Web程序工作原理详解
2014/12/25 PHP
smarty中常用方法实例总结
2015/08/07 PHP
利用PHP实现开心消消乐的算法示例
2017/10/12 PHP
PHP迭代器和迭代的实现与使用方法分析
2018/04/19 PHP
javascript onkeydown,onkeyup,onkeypress,onclick,ondblclick
2009/02/04 Javascript
javascript学习笔记(六) Date 日期类型
2012/06/19 Javascript
JavaScript事件委托的技术原理探讨示例
2014/04/17 Javascript
JS实现屏蔽shift,Ctrl,alt等功能键的方法
2015/06/01 Javascript
JavaScript必知必会(九)function 说起 闭包问题
2016/06/08 Javascript
JS中的==运算: [''] == false —&gt;true
2016/07/24 Javascript
Bootstrap Table使用方法详解
2016/08/01 Javascript
在 Node.js 中使用原生 ES 模块方法解析
2017/09/19 Javascript
微信小程序数据分析之自定义分析的实现
2018/08/17 Javascript
Bootstrap模态对话框用法简单示例
2018/08/31 Javascript
vue项目刷新当前页面的三种方法
2018/12/04 Javascript
layui(1.0.9)文件上传upload,前后端的实例代码
2019/09/26 Javascript
vue+element导航栏高亮显示的解决方式
2019/11/12 Javascript
微信小程序 flexbox layout快速实现基本布局的解决方案
2020/03/24 Javascript
python命令行参数解析OptionParser类用法实例
2014/10/09 Python
python 对字典按照value进行排序的方法
2019/05/09 Python
详解Python打包分发工具setuptools
2019/08/05 Python
Django User 模块之 AbstractUser 扩展详解
2020/03/11 Python
Django集成MongoDB实现过程解析
2020/12/01 Python
Otticanet美国:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/03/10 全球购物
大学生求职自荐信
2013/12/12 职场文书
小班幼儿评语大全
2014/04/30 职场文书
公共场所禁烟标语
2014/06/25 职场文书
党的群众路线教育实践活动批评与自我批评范文
2014/10/16 职场文书
2015年妇幼保健工作总结
2015/05/19 职场文书
亮剑观后感
2015/06/05 职场文书
go语言中GOPATH GOROOT的作用和设置方式
2021/05/05 Golang
Redis Stream类型的使用详解
2021/11/11 Redis
使用CSS定位HTML元素的实现方法
2022/07/07 HTML / CSS