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 相关文章推荐
JavaScript获取GridView选择的行内容
Apr 14 Javascript
jQuery Selector选择器小结
May 06 Javascript
用Jquery重写windows.alert方法实现思路
Apr 03 Javascript
JS求平均值的小例子
Nov 29 Javascript
node.js学习总结之调式代码的方法
Jun 25 Javascript
JavaScript资源预加载组件和滑屏组件的使用推荐
Mar 10 Javascript
如何让一个json文件显示在表格里【实现代码】
May 09 Javascript
推荐三款不错的图片压缩上传插件(webuploader、localResizeIMG4、LUploader)
Apr 21 Javascript
JS立即执行函数功能与用法分析
Jan 15 Javascript
解决Vue.js应用回退或刷新界面时提示用户保存修改问题
Nov 24 Javascript
JavaScript JSON使用原理及注意事项
Jul 30 Javascript
详解Vue slot插槽
Nov 20 Vue.js
关于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
thinkphp框架下404页面设置 仅三步
2016/05/14 PHP
php 5.4 全新的代码复用Trait详解
2017/01/05 PHP
PHP封装的PDO数据库操作类实例
2017/06/21 PHP
PDO::_construct讲解
2019/01/27 PHP
JavaScript之appendChild、insertBefore和insertAfter使用说明
2010/12/30 Javascript
基于jquery的文章中所有图片width大小批量设置方法
2013/08/01 Javascript
在页面中js获取光标/鼠标的坐标及光标的像素坐标
2013/11/11 Javascript
jquery xMarquee实现文字水平无缝滚动效果
2014/04/29 Javascript
完美兼容各大浏览器的jQuery插件实现图片切换特效
2014/12/12 Javascript
AngularJS ngModel实现指令与输入直接的数据通信
2016/09/21 Javascript
使用Vue-Router 2实现路由功能实例详解
2017/11/14 Javascript
JQuery实现ajax请求的示例和注意事项
2018/12/10 jQuery
Vue实现一个图片懒加载插件
2019/03/11 Javascript
vue-router之实现导航切换过渡动画效果
2019/10/31 Javascript
浅谈vue中使用编辑器vue-quill-editor踩过的坑
2020/08/03 Javascript
移动端JS实现拖拽两种方法解析
2020/10/12 Javascript
使用rpclib进行Python网络编程时的注释问题
2015/05/06 Python
python保存网页图片到本地的方法
2018/07/24 Python
在PyCharm中批量查找及替换的方法
2019/01/20 Python
简单易懂Pytorch实战实例VGG深度网络
2019/08/27 Python
Python openpyxl读取单元格字体颜色过程解析
2019/09/03 Python
python读取配置文件方式(ini、yaml、xml)
2020/04/09 Python
Python与C/C++的相互调用案例
2021/03/04 Python
一个基于canvas的移动端图片编辑器的实现
2020/10/28 HTML / CSS
约瑟夫·特纳男装:Joseph Turner
2017/10/10 全球购物
财务主管自我鉴定
2014/01/17 职场文书
冰淇淋店的创业计划书
2014/02/07 职场文书
工程质量月活动方案
2014/02/19 职场文书
竞聘书格式及范文
2014/03/31 职场文书
求职个人评价范文
2014/04/09 职场文书
档案信息化建设方案
2014/05/16 职场文书
2015年个人工作总结报告
2015/04/25 职场文书
党员理论学习心得体会
2016/01/21 职场文书
企业转让协议书(范文2篇)
2019/08/15 职场文书
原生JS封装vue Tab切换效果
2021/04/28 Vue.js
Python使用scapy模块发包收包
2021/05/07 Python