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基础知识filter()和find()实例说明
Jul 06 Javascript
JavaScript中的面向对象介绍
Jun 30 Javascript
jQuery手动点击实现图片轮播特效
Apr 20 Javascript
JavaScript事件详细讲解
Jun 27 Javascript
用js动态添加html元素,以及属性的简单实例
Jul 19 Javascript
JS button按钮实现submit按钮提交效果
Nov 01 Javascript
jq stop()和:is(:animated)的用法及区别(详解)
Feb 12 Javascript
Vue+elementui 实现复杂表头和动态增加列的二维表格功能
Sep 23 Javascript
jQuery实现滑动星星评分效果(每日分享)
Nov 13 jQuery
原生JS实现汇率转换功能代码实例
May 13 Javascript
微信小程序实现弹框效果
May 26 Javascript
微信小程序实现电影App导航和轮播
Nov 30 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将时间差转换为字符串提示
2011/09/07 PHP
php数组查找函数in_array()、array_search()、array_key_exists()使用实例
2014/04/29 PHP
php实现的Timer页面运行时间监测类
2014/09/24 PHP
PHP制作图形验证码代码分享
2014/10/23 PHP
php过滤所有的空白字符(空格、全角空格、换行等)
2015/10/27 PHP
PHP获取指定时间段之间的 年,月,天,时,分,秒
2016/06/05 PHP
Yii安装与使用Excel扩展的方法
2016/07/13 PHP
php 读取输出其他文件的实现方法
2016/07/26 PHP
Yii框架实现邮箱激活的方法【数字签名】
2016/10/18 PHP
PHP实现Redis单据锁以及防止并发重复写入
2018/04/10 PHP
Laravel中如何轻松容易的输出完整的SQL语句
2020/07/26 PHP
JavaScript中的null和undefined解析
2012/04/14 Javascript
简单谈谈javascript代码复用模式
2015/01/28 Javascript
jQuery插件imgPreviewQs实现上传图片预览
2016/01/15 Javascript
基于Javascript实现倒计时功能
2016/02/22 Javascript
基于JavaScript实现鼠标箭头移动图片跟着移动
2016/08/30 Javascript
JavaScript数据类型学习笔记分享
2016/09/01 Javascript
浅谈angular2 组件的生命周期钩子
2017/08/12 Javascript
JS实现二维数组横纵列转置的方法
2018/04/17 Javascript
vue中post请求以a=a&amp;b=b 的格式写遇到的问题
2018/04/27 Javascript
vue通过滚动行为实现从列表到详情,返回列表原位置的方法
2018/08/31 Javascript
vue cli3.0 引入eslint 结合vscode使用
2019/05/27 Javascript
Python中多线程thread与threading的实现方法
2014/08/18 Python
浅析Python的Django框架中的Memcached
2015/07/23 Python
Python中死锁的形成示例及死锁情况的防止
2016/06/14 Python
Python实现多线程HTTP下载器示例
2017/02/11 Python
python中pyplot基础图标函数整理
2020/11/10 Python
Python之字符串的遍历的4种方式
2020/12/08 Python
英国设计师泳装、沙滩装和比基尼在线精品店:Beach Cafe
2019/08/28 全球购物
水污染治理专业毕业生推荐信
2013/11/14 职场文书
违反工作纪律检讨书
2014/02/15 职场文书
大学军训感言600字
2014/02/25 职场文书
公司经理聘任书
2014/03/29 职场文书
晚会开幕词
2015/01/28 职场文书
表扬信范文
2015/05/04 职场文书
PyTorch 实现L2正则化以及Dropout的操作
2021/05/27 Python