javascript写的日历类(基于pj)


Posted in Javascript onDecember 28, 2010

先看看效果:

<script type="text/javascript" src="http://users4.Jabry.com/pengju/src/pj-2.1.1.mini.js"></script> 
<script type="text/javascript" src="http://users4.Jabry.com/pengju/src/Calendar.js"></script> 
<input name="" type="text" id="pos" style="position:absolute; left:200px; top:80px;" value="" readonly="readonly" /> 
<script type="text/javascript"> 
var cat=new Calendar(new Date(1633,6,6),100); 
cat.onChange(function(){alert(this.getDateString())}) 
cat.onSelect(function(){alert(this.getDateString());}); 
cat.fadeIn(0) 
var o=new Calendar(); 
o.locateAt(pj.id("pos")); 
o.onSelect(function(){pj.id("pos").value=this.getDateString();this.hide()}); 
pj("#pos").focus(function(){o.show(100)}); 
</script>

使用很简单;
先创建一个Calendar对象
var calendar=new Calendar();

只要调用show()方法即可显示
calendar.show()

其实调用的是pj库的show方法
因此在使用之前要先把pj库引进来,在把Calendar.js引进来就可以
Calendar的主要方法有
getDateString([pattern]) format是日期格式,默认是yyyy-mm-dd
show:function(duration) 显示日历
hide:function(duration)隐藏日历
fadeIn:function(duration)淡入日历
fadeOut:function(duration)淡出日历
locateAt:function(obj,offsetX,offsetY)把日历定位到指定的元素正下方,offsetX、offsetY可选,是相对于X、Y轴的偏移量

只定义了两个事件
onChange(fn)//当改变年份或者月份是的事件监听器,以当前Calendar对象为上下文执行fn函数
onSelect(fn)//当选择日期时触发的函数,以当前Calendar对象为上下文执行fn函数

还是把源代码粘贴上来吧(有点多,因为封装了一个table)

//date:默认开始日期,不需要可以是null(以当天日期开始),yearListLength:年份下拉列表长度 
function Calendar(date,yearListLength){ 
var currentDate=date||new Date(),_this=this; this.container=pj("<div>").appendTo(document.body).setStyle({overflow:'hidden',background: '#99CCFF',border:'1px solid #CCC',fontSize:'12px',height:'160px',width:'180px',position:"absolute",display:'none'}); 
this.container.get().innerHTML='<table border="0" style=" height:160px;width:180px;"><tr> <td colspan="2" align="center" valign="middle"> <select></select></td> <td colspan="3" align="center" valign="middle"><span></span>年<span></span>月</td> <td colspan="2" align="center" valign="middle"> <select> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> <option value="9">9</option> <option value="10">10</option> <option value="11">11</option> <option value="12">12</option> </select></td></tr><tr style="color: #999;"> <td align="center" valign="middle">日</td> <td align="center" valign="middle">一</td> <td align="center" valign="middle">二</td> <td align="center" valign="middle">三</td> <td align="center" valign="middle">四</td> <td align="center" valign="middle">五</td> <td align="center" valign="middle">六</td></tr><tr> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td></tr><tr> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td></tr><tr> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td></tr><tr> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td></tr><tr> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td></tr><tr> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td> <td align="center" valign="middle"><a href="javascript:void(0)"> </a></td></tr></table>'; 
this.spans=pj("span",this.container.get()); 
this.as=pj("a",this.container.get()).setStyle({textDecoration:"none",color:"#333"}); 
this.selects=pj("select",this.container.get()); 
this.getCurrentDate=function(){return currentDate;}; 
this.init(); 
this.initYearList(yearListLength||70); 
var change=function(){},select=function(){}; 
this.onChange=function(fn){//当改变年份或者月份是的事件监听器,以当前Calendar对象为上下文执行fn函数 
if(pj.isFunction(fn))change=fn; 
}; 
this.onSelect=function(fn){//当选择日期时触发的函数,以当前Calendar对象为上下文执行fn函数 
if(pj.isFunction(fn))select=fn; 
}; 
this.selects[0].onchange=function(){ 
currentDate.setFullYear(parseInt(this.options[this.selectedIndex].value)); 
_this.init(); 
change.apply(_this,arguments); 
};//选择年份 
this.selects[1].onchange=function(){ 
currentDate.setMonth(parseInt(this.options[this.selectedIndex].value)-1); 
_this.init(); 
change.apply(_this,arguments); 
};//选择月份 
this.selects[1].options[currentDate.getMonth()].selected=true; 
this.as.addListener({ 
click:function(){currentDate.setDate(parseInt(this.innerHTML));select.apply(_this,arguments);}, 
mouseover:function(){if(_this.todate.getDate()+""!=this.innerHTML)this.style.color="#CCC";}, 
mouseout:function(){if(_this.todate.getDate()+""!=this.innerHTML)this.style.color="#333";} 
}); 
pj("td",this.container.get(0)).addListener({ 
mouseover:function(){this.style.backgroundColor="#303";}, 
mouseout:function(){this.style.backgroundColor="#9CF";} 
}); 
} 
Calendar.prototype={ 
init:function(){ 
var cur=this.getCurrentDate(), 
i=new Date(cur.getFullYear(),cur.getMonth(),1).getDay(),//取星期 
j=new Date(cur.getFullYear(),cur.getMonth()+1,0).getDate();//取当月最大日数 
//alert(i); 
this.spans[0].innerHTML=cur.getFullYear(); 
this.spans[1].innerHTML=cur.getMonth()+1; 
var m=0,n=this.as.length-1,isTodate=Calendar.isThisMonth(cur); 
while(m<n){this.as[m].innerHTML=this.as[n].innerHTML='';n--;m++;}//清空 
for(var day=1;day<=j;day++,i++){ 
this.as[i].innerHTML=day; 
if(isTodate&&day==this.todate.getDate()){ 
this.todateLink=this.as[i]; 
pj.setStyle(this.as[i],{color:"#F60",fontWeight:"bold"}); 
}else if(!isTodate&&day==this.todate.getDate()&&this.todateLink){ 
pj.setStyle(this.todateLink,{color:"#333",fontWeight:"normal"}); 
} 
} 
}, 
initYearList:function(len){ 
Calendar.emptySelect(this.selects[0]); 
var cur=this.getCurrentDate(),now=this.todate.getFullYear(),max=Math.max(now-cur.getFullYear(),len); 
for(var y=0;y<=max;y++){//年份下拉列表长度为12 
var option=document.createElement("option"); 
if(cur.getFullYear()==now)option.selected=true; 
else option.selected=false; 
option.text=now; 
option.value=now--; 
try{ 
this.selects[0].add(option,null); 
}catch(e){ 
this.selects[0].add(option); 
} 
} 
}, 
getDateString:function(format){//format是日期格式,如yyyy-mm-dd 
if(!format||!/y{4}.m{2}.d{2}/.test(format))format="yyyy-mm-dd"; 
format=format.replace(/^yyyy/,this.getCurrentDate().getFullYear()); 
format=format.replace(/mm/,Calendar.fx(this.getCurrentDate().getMonth()+1)); 
format=format.replace(/dd/,Calendar.fx(this.getCurrentDate().getDate())); 
return format; 
}, 
todate:new Date(), 
todateLink:null, 
show:function(duration){this.container.show(duration);}, 
hide:function(duration){this.container.hide(duration);}, 
fadeIn:function(duration){this.container.fadeIn(duration);}, 
fadeOut:function(duration){this.container.fadeOut(duration);}, 
locateAt:function(obj,offsetX,offsetY){ 
this.container.locate(obj,pj.LEFT_BOTTOM_POSITION,offsetX,offsetY); 
} 
}; 
Calendar.emptySelect=function(target){ 
if(!target.options)return; 
while(target.options.length>0)target.remove(0); 
}; 
Calendar.fx=function(dig){return dig<10?'0'+dig:dig}; 
Calendar.isThisMonth=function(date){ 
return date.getFullYear()==Calendar.prototype.todate.getFullYear()&&date.getMonth()==Calendar.prototype.todate.getMonth(); 
};

三水点靠木打包
在线演示 http://demo.3water.com/js/Calendar_pj/index.htm
打包下载 https://3water.com/jiaoben/33760.html
Javascript 相关文章推荐
jQuery + Flex 通过拖拽方式动态改变图片的代码
Aug 03 Javascript
jquery $(this).attr $(this).val方法使用介绍
Oct 08 Javascript
超链接的禁用属性Disabled使用示例
Jul 31 Javascript
js显示文本框提示文字的方法
May 07 Javascript
基于javascript实现随机颜色变化效果
Jan 14 Javascript
浅谈JavaScript的push(),pop(),concat()方法
Jun 03 Javascript
JS设置时间无效问题的解决办法
Feb 18 Javascript
js匿名函数使用&amp;传参(实例)
Sep 08 Javascript
使用validate.js实现表单数据提交前的验证方法
Sep 04 Javascript
vue同步父子组件和异步父子组件的生命周期顺序问题
Oct 07 Javascript
Jquery遍历筛选数组的几种方法和遍历解析json对象,Map()方法详解以及数组中查询某值是否存在
Jan 18 jQuery
微信小程序学习总结(五)常见问题实例小结
Jun 04 Javascript
Jquery下attr和removeAttr的使用方法
Dec 28 #Javascript
基于Jquery的动态创建DOM元素的代码
Dec 28 #Javascript
jQuery中append、insertBefore、after与insertAfter的简单用法与注意事项
Apr 04 #Javascript
基于Jquery的标签智能验证实现代码
Dec 27 #Javascript
jQuery powerFloat万能浮动层下拉层插件使用介绍
Dec 27 #Javascript
在JavaScript中获取请求的URL参数[正则]
Dec 25 #Javascript
extjs之去除s.gif的影响
Dec 25 #Javascript
You might like
PHP高级OOP技术演示
2009/08/27 PHP
我的php学习笔记(毕业设计)
2012/02/21 PHP
修改php.ini不生效问题解决方法(上传大于8M的文件)
2013/06/14 PHP
php中debug_backtrace、debug_print_backtrace和匿名函数用法实例
2014/12/01 PHP
PHP通过API获取手机号码归属地
2015/05/28 PHP
谈谈你对Zend SAPIs(Zend SAPI Internals)的理解
2015/11/10 PHP
学习php设计模式 php实现命令模式(command)
2015/12/08 PHP
php实现用户登陆简单实例
2017/04/04 PHP
Laravel框架处理用户的请求操作详解
2019/12/20 PHP
javascript+xml实现简单图片轮换(只支持IE)
2012/12/23 Javascript
JavaScript的事件绑定(方便不支持js的时候)
2013/10/01 Javascript
html dom节点操作(获取/修改/添加或删除)
2014/01/23 Javascript
获取select元素被选中的文本内容的js代码
2014/01/29 Javascript
laypage分页控件使用实例详解
2016/05/19 Javascript
js获取页面引用的css样式表中的属性值方法(推荐)
2016/08/19 Javascript
原生JS实现网络彩票投注效果
2016/09/25 Javascript
解析jQueryEasyUI的使用
2016/11/22 Javascript
JavaScript利用闭包实现模块化
2017/01/13 Javascript
jQuery图片切换动画效果
2017/02/28 Javascript
微信小程序实现MUI数字输入框效果
2018/01/31 Javascript
JavaScript运行原理分析
2018/02/09 Javascript
如何使node也支持从url加载一个module详解
2018/06/05 Javascript
jquery实现垂直手风琴导航栏
2020/02/18 jQuery
vue中v-for循环选中点击的元素并对该元素添加样式操作
2020/07/17 Javascript
Python中的魔法方法深入理解
2014/07/09 Python
基于Python解密仿射密码
2019/10/21 Python
PyTorch加载自己的数据集实例详解
2020/03/18 Python
基于Keras 循环训练模型跑数据时内存泄漏的解决方式
2020/06/11 Python
HTML5 input元素类型:email及url介绍
2013/08/13 HTML / CSS
米兰网婚纱礼服法国网上商店:Milanoo法国
2016/08/20 全球购物
荷兰网上药店:Drogisterij.net
2019/09/03 全球购物
英语专业大学生求职简历的自我评价
2013/10/18 职场文书
制药工程专业个人求职自荐信
2014/01/25 职场文书
中学教师教育感言
2014/02/21 职场文书
高中班主任工作总结(范文)
2019/08/20 职场文书
浅谈PostgreSQL表分区的三种方式
2021/06/29 PostgreSQL