来看下效果图
一、先来说下功能: 1.点击“确定”显示日历
2。再次点击隐藏,或从DOM中删除这个日历。如些反复第一,和第二这两步。
3.让日历中显示当前月份日期(多少天,每天是多少号)。
4.让当前月份的日期和星期几对应.
5.让左边两边的日历关联起来。
二、再来说下HTML结构。 1.上面蓝色的是一个DIV,显示当前月分,和上月,下月。
2.下面的日期和星期,是用一个table结构存放数据。星期用thead,日期用:tbody存放。
三、功能展开分析: 3.1、前两个功能?
让我想起使用JQUERY里面的toggle。很方便就可以解决。
3.2、让日历中显示当前月份日期数?
既然跟日期有关的,肯定会想起Deta这个对象了。在这个对象中,我们可以获取或设某年,某天,某月,某日,某星期几。但就是不能直接获取这一个月中有多少天。?怎么办呢?
所以我们只能用判断了。根据当前月份的数值。来把天数存到一个变量当中。(对象获取到的当前月份要+1。国它是从零开始计算的).
比如现在是五月,根据判断,五月是大,所以变量中就存31这个数值;即这个月有31天。
3.3、让当前月份的日期和星期几对应.??
这个问题,解决办法就是,获取到当月一号,对应的星期几。后面的就可以依次排列下去了。这里的依次排列,我理解的是,因为存放日期的都是TD标签,在TBODY里面这些TD的索引,都是排列好的,所以把一号插入到那个TD当中,后面的二号,就会插入到后一个TD当中了。
3.4、让左边两边的日历关联起来。
这里重点是“关联”:我最近写了“倒计时”,再就是这次的"联动日历",还有让我想起了“联动下拉菜单”,比如省份和市的联动下拉菜单;这些都涉汲到“联动”.
我总结了一下,就是需要“联动”的东西,必定有一个“点”(先这么叫吧),其它需要变化,都要和这个点相关联起来,这样改变这个点,其它和这个点关联的东西,也就都会发生改变,也就实现了“联动”这一效果。
比如,上次的“倒计时”,里面的“点”,就是当前时间和设定以后时间,之前相差的"总毫秒数"。倒计时显示的,时,分,秒,都和这个"总毫秒数"有关联,只要这个“总毫秒数”变化,那么时,分,秒,都会变化,这就是"联动"了.
这次的日历联动,里面的"点",就是当前创建日期对象后,获得的年,月。根据这个年,月,来去设置右边,即下个月该显示的东西。那么只要当前获取的年,月,有变化,后面的自然也会变化。也就“联动”了。
当然里面还是有点小多细节,处理。
四、上代码,太长了,所以只放了结构,里面的内容可以下载文章最后的DEMO 复制代码 代码如下:
$(function(){
var nowDate = $(".nowDate"), //左边的日历盒子
nextDate = $(".nextDate"), //右边的日历盒子
lstrTd = "", //左日期的行的DOM结构
rstrTd = "", //右日期的行的DOM结构
lrows = 0, //左日期行数
rrows = 0, //右日期行数
iHtmlNow = "", //左边的日历结构
iHtmlNext = "", //右边的日历的结构
nowTitleDateY = "", //左边标题年份
nowTitleDateM = "", //左边显示的月份
nowlastM = "", //左边的翻月显示
nextTitleDateY = "", //右边标题年份
nextTitleDateM = "", //右边显示的月份
nextLastM = "", //右边的翻月显示
creatbtu = true, //只创建一次HTML结构的开关
NumDay = 0, //左边每个月的天数;
rNumDay = 0, //左边每个月的天数;
lfday = 0, //左边当前月份的第一天,是星期几
rfday = 0; //右边当前月份的第一天,是星期几
//创建日期行
function creatTr(l,r){
}
/*创建当前和下一个月的日期和年份
*这里分三种情况,当前月为12月 当前月为11月,当前月为1月
*/
function getTitleDate(){
var odate = new Date();
//如果当前月是12月分,那么右边的月份,就应该是1月份
//如果当前月是11月分,那么右边的月份,就应该是1月份
//如果当前月是1月分,那么左边的月份,就应该是12月份
}
/*获取当前月份的一号,是星期几
*首先设置你创建日期对象的年份,月份,和你需要知道的日期数,把这些设置好之后,再使用getDay()方法,就可以获取你设置日期的,星期数了;
*/
function getfirstD(m1,y1,m2,y2){
}
//根据大小月份取得天数
function getTdDay(m1,y1,m2,y2){
}
//根据传入的年份参数,判断是否是润年,即能够被4整除,但不能被100整除,同时满足时;或者能被400整除;
function isRunYear(y){
}
//创建HMTL结构
function creatHtml(creatbtu){
//根据当前月份的一号是星期几,来生成有几行存放所有日期
}
//将日期插入到对应的TD当中
function insertdate(d,t){
//插入到左边
//插入到边
}
//插入到DOM
function insertHtml(){
}
//从DOM中删除
function delHtml(){
}
//点击确定显示或隐藏日历
$("input[type=button]").toggle(function(){
//加这个判断是防止连续点击确定按钮
if(!nowDate.add(nextDate).is(":animated")&&nowDate.add(nextDate).is(":empty")){
//获得标题上面的年份和月份
getTitleDate();
//获得左和右的月份的天数
getTdDay(nowTitleDateM,nowTitleDateY,nextTitleDateM,nextTitleDateY);
//获得左和右的月份一号是星期几
getfirstD(nowTitleDateM,nowTitleDateY,nextTitleDateM,nextTitleDateY);
//创建HTML结构
creatHtml();
//将结构插入到DOM当中
insertHtml();
//插入日期到左和右的表格TD当中
insertdate(lfday,rfday);
//展开日期
nowDate.add(nextDate).slideDown(200);
}
},function(){
//加这个判断是防止连续点击
if(!nowDate.add(nextDate).is(":animated")){
//收起日历
nowDate.add(nextDate).slideUp(200);
//从DOM中删除日历结构
delHtml();
}
});
})
4.1分析下这代码结构看注解就可以明白的,以下几个步骤:
1.获得当前年份,月份(联动的“点”)
2.获得左边和右边对应月份的天数;
3.获得左边和右边月分当中一号,分别对应的是星期几
4.有了以上东西,我们就可以创建HTML结构了(因为要根据月份当中的日期排列,来决定,创建五行,还是六行。来显示日期)
5.将创建好的结构,插入到DOM当中
6.再将获得的天数,也就是日期数,插入到对应的表格存放日期的TD当中;
五、总结
1.不用把TR分行处理,只接把tbody里面的td做为一个整体的数组,往里面插入数据;(因为显示的是数字,正好可以和)
2.“联动”的规则
3.像这种类似插入很多数据的东西,要用循解决。
4。像这种数据多的,应该先存放到数组中(因为本例显示的是数字,所以可以直接用循环里面的变量,如果是值,要先存放到数组中,根据索引取出来)
在线演示:http://demo./js/2012/mycalendar/
DEMO下载:mycalendar_jb51.rar
相关推荐:
Flex 获得png透明截图的问题和解决方法
php 读取mysql数据库三种方法
js replace正则相关的诡异问题
DB2 日期和时间的函数应用说明
JavaScript 对话框和状态栏使用说明
asp.net服务器上几种常见异常的解决方案.
jquery tree 可编辑节点实现代码(jquery一句话节点菜单)
php UTF8 文件的签名问题
Jquery 表单取值赋值的一些基本操作
C# DoubleClick与MouseDoubleClick区别,双击事件引发顺序
Mootools 1.2教程 输入过滤第二部分(字符串)
sql2005 HashBytes 加密函数
中文域名获国际通行证 投资价值突飞猛进
flash 得到自身url参数的代码
javascript 获取FCKeditor内容
读大数据量的XML文件的读取问题
mysql正则表达式 LIKE 通配符
as3 rollOver or mouseOver使用说明
php面向对象全攻略 (十) final static const关键字的使用
SQLSERVER中union,cube,rollup,cumpute运算符使用说明
php程序之die调试法 快速解决错误
js表格分页实现代码
滑动门式菜单 实现代码
MSSQL2005 INSERT,UPDATE,DELETE 之OUTPUT子句使用实例
MooTools 1.2中的Drag.Move来实现拖放
javascript currying返回函数的函数
JQuery 绑定事件时传递参数的实现方法
asp.net dataview做无限极分类的又一用法
jQuery帮助之CSS尺寸(五)outerHeight、outerWidth
PHP 正则 email语句详解
AJAX 自学练习 无刷新提交并修改数据库数据并显示
基于HTTP长连接的"服务器推"技术的php 简易聊天室
php 数学运算验证码实现代码
jquery select选中的一个小问题
javascript void(0)的妙用
学习ExtJS(一) 之基础前提
jquery 弹出层实现代码
实用的JS表单验证提示效果
Oracle 分析函数RANK(),ROW_NUMBER(),LAG()等的使用方法
PHP 程序员应该使用的10个组件
JavaScript 三种不同位置代码的写法
Serv-U 无法连接到服务器127.0.0.1,端口43958 之解决办法
SQL 语句优化方法30例
Javascript 模式实例 观察者模式
Mootools 1.2教程 Fx.Tween的使用
extjs 学习笔记(一) 一些基础知识
将jQuery应用于login页面的问题及解决
aspnet_isapi.dll设置图文方法.net程序实现伪静态
union组合结果集时的order问题
Oracle 子程序参数模式,IN,OUT,NOCOPY