javascript实现日历控件(年月日关闭按钮)


Posted in Javascript onDecember 12, 2012

经常使用google的朋友一定对google绚丽的日历控件记忆犹新吧,那我们也来实现一个,虽然功能和效果比不上,但重要的是实现的过程.
下面是要实现的html结构:
<div id="a"><div id="head"><span id="yface">年:<select id="year"></select></span><span id="mface">月:<select id="month"></select></span></div><div id="biaoti"></div><div id="body"></div></div>
先说一下日历查询的算法:
w=y+parseInt(y/4)+parseInt(c/4)-2*c+parseInt(26*(m+1)/10)+d-1 ;
下面是详细的说明过程,有兴趣的可以去看下: 
https://3water.com/article/32572.htm
以下是实现的javascript代码:

sx.activex.calender={ 
bind:function(target){ 
var a=document.createElement("div"); 
var head=document.createElement("div"); 
var biaoti=document.createElement("div"); 
var select=document.createElement("select"); 
var yface=document.createElement("span"); 
var mface=document.createElement("span"); 
var body=document.createElement("div"); 
var select1=document.createElement("select"); 
yface.appendChild(select); 
mface.appendChild(select1); 
head.appendChild(yface); 
head.appendChild(mface); 
a.appendChild(head); 
a.appendChild(biaoti); 
a.appendChild(body); 
yface.insertBefore(document.createTextNode("年 "),yface.firstChild) 
mface.insertBefore(document.createTextNode("月 "),mface.firstChild) 
a.style.position="absolute"; 
biaoti.style.height="10%"; 
for(var i=0;i<7;i++){ 
var can=document.createElement("span") 
can.style.width="14%"; 
can.style.height="100%"; 
can.style.textAlign="center"; 
biaoti.appendChild(can); 
} 
biaoti.all[0].innerText="日" 
biaoti.all[1].innerText="一" 
biaoti.all[2].innerText="二" 
biaoti.all[3].innerText="三" 
biaoti.all[4].innerText="四" 
biaoti.all[5].innerText="五" 
biaoti.all[6].innerText="六" 
head.style.height="20%"; 
a.style.position="absolute"; 
a.style.height="200px"; 
a.style.width="302px"; 
a.style.border="1px red solid"; 
yface.style.width="50%"; 
yface.style.padding="5px"; 
yface.style.height="100%"; 
select.style.width="80%"; 
for(var i=1960;i<2010;i++){ 
var option=document.createElement("option"); 
option.text=i; 
select.add(option); 
} 
mface.style.width="50%"; 
mface.style.padding="5px"; 
mface.style.height="100%"; 
select1.style.width="80%"; 
for(var i=1;i<=12;i++){ 
var option=document.createElement("option"); 
option.text=i; 
select1.add(option); 
} 
body.style.height="70%"; 
for(var i=0;i<42;i++){ 
var span=document.createElement("span"); 
span.style.width="14%"; 
span.style.height="16%"; 
span.style.textAlign="center"; 
span.onmouseover=function(){ 
this.style.cursor="hand"; 
this.tempcolor=this.style.backgroundColor; 
this.style.backgroundColor="lightblue"; 
} 
span.onmouseout=function(){ 
this.style.backgroundColor=this.tempcolor; 
} 
span.onclick=function(){ 
target.value=select.options[select.selectedIndex].text+"年"+select1.options[select1.selectedIndex].text+"月"+this.innerText+"日"; 
a.parentNode.removeChild(a); 
} 
body.appendChild(span); 
} 
select.onchange=function(){ 
for(var o in body.all){ 
body.all[o].innerText=""; 
if(o.toString()!="length") 
body.all[o].style.backgroundColor=""; 
} 
var year1=this.options[this.selectedIndex].text; 
var month1=select1.options[select1.selectedIndex].text; 
var y=parseInt(year1.substr(2,2)-0); 
var c=parseInt(year1.substr(0,2));; 
var m=parseInt(month1);; 
m=m>=3?m:(y=y-1,m+12); 
var d=1; 
var w=y+parseInt(y/4)+parseInt(c/4)-2*c+parseInt(26*(m+1)/10)+d-1 ; 
if(w<0) w=w+700; 
w=w%7; 
switch(parseInt(month1)){ 
case 2: 
if(parseInt(year1)%4==0) 
var r=29; 
else 
var r=28; 
var day=w; 
for(var d=1;d<=r;d++){ 
body.all[day++].innerText=d; 
if(parseInt(year1)==(new Date()).getYear() && parseInt(month1)==(new Date()).getMonth()+1 && d==(new Date()).getDate()) 
body.all[day-1].style.backgroundColor="red"; 
body.all[41].innerText="关闭"; 
} 
break; 
default: if(parseInt(month1)==1 || parseInt(month1)==3 || parseInt(month1)==5 || parseInt(month1)==7 || parseInt(month1)==8 || parseInt(month1)==10 || parseInt(month1)==12) 
var r=31; 
else 
var r=30; 
var day=w; 
for(var d=1;d<=r;d++){ 
body.all[day++].innerText=d; 
if(parseInt(year1)==(new Date()).getYear() && parseInt(month1)==(new Date()).getMonth()+1 && d==(new Date()).getDate()) 
body.all[day-1].style.backgroundColor="red"; 
body.all[41].innerText="关闭"; 
} 
break; 

} 
} 
select1.onchange=function(){ 
for(var o in body.all){ 
body.all[o].innerText=""; 
if(o.toString()!="length") 
body.all[o].style.backgroundColor=""; 
} 
var month1=this.options[this.selectedIndex].text; 
var year1=select.options[select.selectedIndex].text; 
var y=parseInt(year1.substr(2,2)-0); 
var c=parseInt(year1.substr(0,2)); 
var m=parseInt(month1); 
m=m>=3?m:(y=y-1,m+12); 
var d=1; 
var w=y+parseInt(y/4)+parseInt(c/4)-2*c+parseInt(26*(m+1)/10)+d-1 ; 
if(w<0) w=w+700; 
w=w%7; 
switch(parseInt(month1)){ 
case 2: 
if(parseInt(year1)%4==0) 
var r=29; 
else 
var r=28; 
var day=w; 
for(var d=1;d<=r;d++){ 
body.all[day++].innerText=d; 
if(parseInt(year1)==(new Date()).getYear() && parseInt(month1)==(new Date()).getMonth()+1 && d==(new Date()).getDate()) 
body.all[day-1].style.backgroundColor="red"; 
body.all[41].innerText="关闭"; 
} 
break; 
default: 
if(parseInt(month1)==1 || parseInt(month1)==3 || parseInt(month1)==5 || parseInt(month1)==7 || parseInt(month1)==8 || parseInt(month1)==10 || parseInt(month1)==12) 
var r=31; 
else 
var r=30; 
var day=w; 
for(var d=1;d<=r;d++){ 
body.all[day++].innerText=d; 
if(parseInt(year1)==(new Date()).getYear() && parseInt(month1)==(new Date()).getMonth()+1 && d==(new Date()).getDate()) 
body.all[day-1].style.backgroundColor="red"; 
body.all[41].innerText="关闭"; 
} 
break; 

} 
} 
var date=new Date(); 
for(var s1=0;s1<select.options.length;s1++){ 
if(parseInt(select.options[s1].text)==parseInt(date.getYear())){ 
select.options[s1].selected=true; 
break; 
} 
} 
for(var s2=0;s2<select1.options.length;s2++){ 
if(parseInt(select1.options[s2].text)==parseInt(date.getMonth())+1){ 
select1.options[s2].selected=true; 
break; 
} 
} 
select.onchange(); 
for(var i in body.all){ 
if(body.all[i].innerText==date.getDate()){ 
body.all[i].style.backgroundColor="red"; 
} 
} 
target.onfocus=function(){ 
document.body.appendChild(a); 
a.style.left=target.offsetLeft+"px";; 
a.style.top=target.offsetTop+target.offsetHeight+"px"; 
} 
target.onblur=function(){ 
if(a && window.event.clientY>a.offsetTop && window.event.clientY<a.offsetTop+a.offsetHeight && window.event.clientX>a.offsetLeft && window.event.clientX<a.offsetLeft+a.offsetWidth) 
return; 
if(!a) return; 
a.parentNode.removeChild(a); 
} 
body.all[41].innerText="关闭"; 
body.all[41].onclick=function(){ 
this.style.backgroundColor=""; 
a.parentNode.removeChild(a); 
} 
} 
}

入口参数是要绑定的html对象,这里一般是text input.
下面是调用代码:
<html>
<head>
<title>Untitled Document</title>
</head>
<body>
<script src="kongjian.js"></script>
<input type="text" id="a">
<script>
sx.activex.calender.bind(document.getElementById("a"));
</script>
</body>
</html>
差不多就这样,代码比较冗长,不是很好,如果哪位朋友有更好的办法,请与我多多交流啊.
Javascript 相关文章推荐
基于jquery的复制网页内容到WORD的实现代码
Feb 16 Javascript
深入理解JavaScript中的传值与传引用
Dec 09 Javascript
AngularJS基础知识
Dec 21 Javascript
JavaScript中数组继承的简单示例
Jul 29 Javascript
通过XMLHttpRequest和jQuery实现ajax的几种方式
Aug 28 Javascript
使用Node.js给图片加水印的方法
Nov 15 Javascript
微信小程序开发之Tabbar实例详解
Jan 09 Javascript
如何使用Bootstrap 按钮实例详解
Mar 29 Javascript
jQuery选择器之属性筛选选择器用法详解
Sep 19 jQuery
dts文件中删除一个node或属性的操作方法
Aug 05 Javascript
Websocket 向指定用户发消息的方法
Jan 09 Javascript
js实现可爱的气泡特效
Sep 05 Javascript
关于js中alert弹出窗口文本换行问题简单详细说明
Dec 11 #Javascript
用js判断页面是否加载完成实现代码
Dec 11 #Javascript
ajax页面无刷新 IE下遭遇Ajax缓存导致数据不更新的问题
Dec 11 #Javascript
IE6浏览器下resize事件被执行了多次解决方法
Dec 11 #Javascript
什么是json和jsonp,jQuery json实例详详细说明
Dec 11 #Javascript
JavaScript子窗口ModalDialog中操作父窗口对像
Dec 11 #Javascript
javascript中window.event事件用法详解
Dec 11 #Javascript
You might like
PHP写UltraEdit插件脚本实现方法
2011/12/26 PHP
JavaScript 学习笔记(十二) dom
2010/01/21 Javascript
一些javascript一些题目的解析
2010/12/25 Javascript
深入浅析JavaScript字符串操作方法 slice、substr、substring及其IE兼容性
2015/12/16 Javascript
微信小程序 天气预报开发实例代码源码
2017/01/20 Javascript
JavaScript实现的仿新浪微博原生态输入字数即时检查功能【兼容IE6】
2017/09/26 Javascript
基于Vue 服务端Cookies删除的问题
2018/09/21 Javascript
vue v-for 使用问题整理小结
2019/08/04 Javascript
基于vue、react实现倒计时效果
2019/08/26 Javascript
微信小程序国际化探索实现(附源码地址)
2020/05/20 Javascript
JavaScript图像放大镜效果实现方法详解
2020/06/28 Javascript
js实现表格单列按字母排序
2020/08/12 Javascript
vue实现简单的登录弹出框
2020/10/26 Javascript
基于Vue+Webpack拆分路由文件实现管理
2020/11/16 Javascript
[12:36]《DOTA2》国服注册与激活指南全攻略
2013/04/28 DOTA
[03:38]2014DOTA2西雅图国际邀请赛 VG战队巡礼
2014/07/07 DOTA
使用pdb模块调试Python程序实例
2015/06/02 Python
Python入门之三角函数tan()函数实例详解
2017/11/08 Python
python 识别图片中的文字信息方法
2018/05/10 Python
Python根据指定日期计算后n天,前n天是哪一天的方法
2018/05/29 Python
python 实时得到cpu和内存的使用情况方法
2018/06/11 Python
python批量处理文件或文件夹
2020/07/28 Python
python实现数据清洗(缺失值与异常值处理)
2019/12/02 Python
浅谈Python中的字符串
2020/06/10 Python
汉语言文学毕业生求职信
2013/10/01 职场文书
仪器仪表检测毕业生自荐信
2013/10/31 职场文书
写好自荐信要注意的问题
2013/11/10 职场文书
大学生两会精神学习心得体会
2014/03/10 职场文书
校庆口号
2014/06/20 职场文书
无房产证房屋转让协议书合同样本
2014/10/18 职场文书
2015年扫黄打非工作总结
2015/05/13 职场文书
2015年大学教师工作总结
2015/05/20 职场文书
文明医院的标语集锦!
2019/07/24 职场文书
Apache压力测试工具的安装使用
2021/03/31 Servers
PL350与SW11的比较
2021/04/22 无线电
vue.js Router中嵌套路由的实用示例
2021/06/27 Vue.js