[转]一种简单的js时间控件
使用方法:
粘贴代码到文本文档中,文档名称为datetime.js,然后在html文件中引用如下代码即可
<input name="shijian1" id="shijian1" type="text" class="sang_Calender" />
<script type="text/javascript" src="js/datetime.js"></script><!-- 时间控件js文件(引用在标签之后) -->
注意type="text" class="sang_Calender"不可变,文件路径写即可使用
代码如下:
(function(){ var d=document, w=window, isIE=w.navigator.appVersion.indexOf("MSIE")>-1, now=new Date(), nowM=now.getMonth(); nowY=now.getFullYear(); date=null, ids=null, oInput=null; document.write('<iframe frameborder=0 style="display:none;position:absolute;" width="200" height="215" scrolling="no" name="sangcalender" id="sangcalender"></iframe>'); var f=window.frames['sangcalender']; var ff=d.getElementById('sangcalender'); var fd=f.document; fd.open(); fd.write('<!DOCTYPE html><html><head><style type="text/css">#yearL, #monthL, #monthR, #yearR, #hoursL, #hoursR, #minL, #minR, #y, #m, #h, #i, #s{cursor:pointer;}.calenderClose a{display:block;width:13px;line-height:13px;border:1px solid #cccccc;background-color:#eeeeee;color:#666; text-decoration:none}.calenderClose a:hover{color:red}td{text-align:center}#calenderDay{cursor:pointer}body{font-size:12px;padding:0;margin:0}.col666{color:#999}.bg9ebdd6{background-color:#9ebdd6}</style></head><body onselectstart="return false" style="-moz-user-select:none" oncontextmenu="return false">') fd.write('<table width="100%" border="0" bgcolor="#CCCCCC" cellspacing="1" cellpadding="0">'+ '<tr><td><table border="0" cellspacing="0" bgcolor="#6699FF" cellpadding="0" width="100%">'+ '<tr><td width="20" height="25" align="center" id="yearL" title="上一年"><<</td>'+ '<td width="12" align="center" id="monthL" title="上一月"><</td><td align="center">'+ '<span id="y" title="点击选择年份"></span>年<span id="m" title="点击选择月份"></span>月</td>'+ '<td width="12" align="center" id="monthR" title="下一月">></td>'+ '<td width="20" align="center" id="yearR" title="下一年">>></td></tr></table></td></tr>'+ '<tr bgcolor="#FFFFFF"><td><table width="100%" border="0" bgcolor="#9999FF" cellspacing="1" cellpadding="0">'+ '<tr bgcolor="#CCCCFF" height="18"><td>日</td><td>一</td><td>二</td><td>三</td><td>四</td><td>五</td><td>六</td></tr></table></td></tr>'+ '<tr bgcolor="#FFFFFF"><td><div id="calenderDay"></div></td></tr>'+ '<tr><td><table border="0" bgcolor="#eeeeee" cellpadding="0" cellspacing="0" width="100%">'+ '<tr><td align="center" height="20" id="hoursL" title="时减少"><<</td>'+ '<td align="center" id="minL" title="分减少"><</td>'+ '<td align="center"><span id="h" title="点击选择小时"></span>:<span id="i" title="点击选择分"></span>:<span id="s" title="点击选择秒"></span></td>'+ '<td align="center" id="minR" title="分增加">></td><td align="center" id="hoursR" title="时增加">>></td></tr>'+ '</table></td></tr></table>'); fd.write('</body></html>'); fd.close(); //获取框架里的元素 gids.call(obj,id) function gids(idArr){ var oId=[]; for(var i=0,len=idArr.length;i<len;i++){ oId[idArr[i]]=this.getElementById(idArr[i]); } return oId; } //需要添加事件的元素的集合 var idsArr=['yearL','yearR','y','m','monthL','monthR','hoursL','hoursR','minL','minR','calenderClose','calenderDay','h','i','s']; if(!ids){ids=gids.call(fd,idsArr)}; //格式化日历控件 function formatDay(timestr){ var t=/(\d+)-(\d+)-(\d+)\s*(\d*):?(\d*):?(\d*)/.exec(timestr); var da=null; var dn=getdate(now); if(t){ da=new Date(t[1],t[2]-1,1,t[4],t[5],t[6]); }else{ da=new Date(dn['y'],dn['m'],1,dn['h'],dn['i'],dn['s']); } date=getdate(da); var mon=[31,date['y']%4==0?29:28,31,30,31,30,31,31,30,31,30,31]; var str="",day=1; str+='<table width="100%" border="0" bgcolor="#cecece" cellspacing="1" cellpadding="0">'; for(var md=mon[date['m']-1],wd=md-date['w']+1,n=0;n<6;n++){ str+='<tr bgcolor="#ffffff" height="23">'; for(var nn=0;nn<7;nn++){ if(wd<=md){ str+='<td class="col666">'+wd+'</td>'; wd++; }else { if(day<=mon[date['m']]){ if(day==dn['d'] && nowM==now.getMonth()&&nowY==now.getFullYear()){ str+='<td class="bg9ebdd6">'+(day++)+'</td>'; }else{ str+='<td>'+(day++)+'</td>'; } var day2=1; }else{ str+='<td class="col666">'+(day2++)+'</td>'; } } } str+='</tr>'; } str+='</table>'; ids['calenderDay'].innerHTML=str; var dates=[date['y'],fillzero(date['m']+1),fillzero(date['h']),fillzero(date['i']),fillzero(date['s'])]; each.call([ids['y'],ids['m'],ids['h'],ids['i'],ids['s']],function(o,i){o.innerHTML=dates[i]}); each.call(ids['calenderDay'].getElementsByTagName("td"),function(o,i){ addEvent(o,"mouseover",function(e){ o.style.backgroundColor="#9ebdd6"; }) addEvent(o,"mouseout",function(e){ o.style.backgroundColor=""; }) addEvent(o,"click",function(e){ if(o.className=="col666"){return} oInput.value=ids['y'].innerHTML+"-"+ids['m'].innerHTML+"-"+ fillzero(o.innerHTML) +" "+ids['h'].innerHTML+":"+ids['i'].innerHTML+":"+ids['s'].innerHTML; hide(); }) }) } //为按钮添加事件 var handlers=[yL,yR,mL,mR,hL,hR,iL,iR]; each.call([ids['yearL'],ids['yearR'],ids['monthL'],ids['monthR'],ids['hoursL'],ids['hoursR'],ids['minL'],ids['minR']],function(o,i){ addEvent(o,"click",handlers[i]); }) var clicks=[yClick,mClick,hClick,iClick,sClick]; each.call([ids['y'],ids['m'],ids['h'],ids['i'],ids['s']],function(o,i){ addEvent(o,"click",clicks[i]); }) //获取元素位置 function getPos(e){ var x,y,e=typeof e=="string"?d.getElementById(e):e,p=[]; x=e.offsetLeft; y=e.offsetTop; while(e=e.offsetParent){ x+=e.offsetLeft; y+=e.offsetTop; } p['x']=x;p['y']=y; return p; } //上一年 function yL(){ now.setFullYear(date['y']-1); formatDay(); } //下一年 function yR(){ now.setFullYear(date['y']+1); formatDay(); } //上一月 function mL(){ now.setMonth(date['m']-1); formatDay(); } //下一月 function mR(){ now.setMonth(date['m']+1); formatDay(); } //时增加 function hR(){ now.setHours(date['h']+1); formatDay(); } //时减少 function hL(){ now.setHours(date['h']-1); formatDay(); } //分增加 function iR(){ now.setMinutes(date['i']+1); formatDay(); } //分减少 function iL(){ now.setMinutes(date['i']-1); formatDay(); } //为SELECT添加事件 function addEventForSelect(type){ function changeInner(){ ids[type].innerHTML=fillzero(oSelect.value); now.setFullYear(ids['y'].innerHTML); now.setMonth(Number(ids['m'].innerHTML)-1); now.setHours(ids['h'].innerHTML); now.setMinutes(ids['i'].innerHTML); now.setSeconds(ids['s'].innerHTML); formatDay(); } var oSelect=gids.call(fd,['calenderSelect'])['calenderSelect']; oSelect.focus(); addEvent(oSelect,'change',changeInner); addEvent(oSelect,"blur",changeInner); } //生成option选项 function createOption(type,v){ var str='',str2='',i=0,i2=0; function create(i,i2){ while(i>=i2){ if(v==i){ str2+='<option value="'+i+'" selected>'+i+'</option>'; }else{ str2+='<option value="'+i+'">'+i+'</option>'; } i--; } str+=str2+'</select>'; ids[type].innerHTML=str; addEventForSelect(type); } str+='<select id="calenderSelect">'; if(type=="y"){ i=2011;i2=1990; create(i,i2); return; } if(type=="m"){ i=1;i2=12; } if(type=="h"){ i=00;i2=23; } if(type=="i"){ i=00;i2=59; } if(type=="s"){ i=00;i2=59; } create(i2,i); } //年鼠标点击 function yClick(e){ if(getTarget(e).tagName.toLowerCase()=="span"){ createOption("y",ids['y'].innerHTML); } } //月鼠标点击 function mClick(e){ if(getTarget(e).tagName.toLowerCase()=="span"){ createOption("m",ids['m'].innerHTML); } } //时鼠标点击 function hClick(e){ if(getTarget(e).tagName.toLowerCase()=="span"){ createOption("h",ids['h'].innerHTML); } } //分鼠标点击 function iClick(e){ if(getTarget(e).tagName.toLowerCase()=="span"){ createOption("i",ids['i'].innerHTML); } } //秒鼠标点击 function sClick(e){ if(getTarget(e).tagName.toLowerCase()=="span"){ createOption("s",ids['s'].innerHTML); } } //each方法 function each(handler){ var o=null; for(var i=0,len=this.length;i<len;i++){ o=typeof this[i]=="string"?fd.getElementById(this[i]):this[i]; handler(o,i); } } //如果日期为一位数,则在前面补零 function fillzero(str){ var str=typeof str=="string"?str:str.toString(); if(str.length==1){ str="0"+str; } return str; } //获取时间 function getdate(da){ var date=[]; date['y']=da.getFullYear(); date['m']=da.getMonth(); date['d']=da.getDate(); date['w']=da.getDay(); date['h']=da.getHours(); date['i']=da.getMinutes(); date['s']=da.getSeconds(); return date; } //阻止默认事件 function preventDefault(e){ var e=e||window.event; if(e.preventDefault){ e.preventDefault(); }else{ e.returnValue=false; } } function getTarget(e){ var e=e||window.event; return e.srcElement||e.target; } //显示日历控件 function show(o){ var s=o.value; var p=getPos(o); if(s){ formatDay(s); }else{ now=new Date(); formatDay(); } ff.style.left=p['x']+"px"; ff.style.top=p['y'] + o.offsetHeight + "px"; ff.style.display="block"; } //隐藏日历控件 function hide(){ ff.style.display="none"; } //添加事件 function addEvent(element,event,handler){ var element=typeof element=="string"?d.getElementById(element):element; if(element.addEventListener){ element.addEventListener(event,handler,false) }else if(element.attachEvent){ element.attachEvent("on"+event,handler); }else{ element["on"+event]=handler; } } //获取要实现控件的表单 function getObj(className){ var o=d.getElementsByTagName('*'),oArr=[]; for(var i=0,len=o.length;i<len;i++){ if(o[i].className==className){ oArr.push(o[i]) } } return oArr; } each.call(getObj("sang_Calender"),function(o,i){ addEvent(o,"click",function(e){preventDefault(e);oInput=o,show(o);ff.focus()}) }) //var iframeObj=isIE?ff:f; addEvent(isIE?ff:f,"blur",function(e){hide()}) })()
study just for life!