基于jQuery日历插件制作日历


Posted in Javascript onMarch 11, 2016

来看下最终效果图吧:

基于jQuery日历插件制作日历

是长得丑了一点,不要吐槽我-。-

首先来说说这个日历主要的制作逻辑吧:

·一个月份最多有31天,需要一个7X6的表格去装载

·如果知道了某个月份1号是星期几,这个月份有多少天,一个循环就可以显示某个月的日历了吧(眼睛都放光了*.*)

·加上一些控件让用户可以方便操作吧(比如可以输入年份、月份,可以点击选择年份、月份)

新建一个html文件,html结构:

<div class="container">
 <input type="text" value="" id="cal-input"/>
 <div class="cal-box">
 <table>
  <thead>
  <tr>
   <td class="sun">日</td>
   <td>一</td>
   <td>二</td>
   <td>三</td>
   <td>四</td>
   <td>五</td>
   <td class="sta">六</td>
  </tr>
  </thead>
  <tbody>
  <tr>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
  </tr>
  <tr>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
  </tr>
  <tr>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
  </tr>
  <tr>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
  </tr>
  <tr>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
  </tr>
  <tr>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
  </tr>
  </tbody>
 </table>
 </div>
</div>

再加点样式进去,打开浏览器看看效果:

thead td,tbody td{
  width: 20px;
  height: 20px;<br><span class="styles-clipboard-only"> 

 <span class="webkit-css-property">text-align: <span class="expand-element"><span class="value">center;</span></span></span></span>
 }
 thead td.sun,thead td.sta{
  color: #eec877;
 }
 tbody td{
  border: 1px solid #eee;
 }

 基于jQuery日历插件制作日历

看起来还不错,但是这是一个插件,要写这么多html的代码是不合理的,应该是在这个插件内部动态插入的,这样写也是为了直观演示。

要开始写JS代码了,现在要得知某月的1号是星期几,方便去遍历显示某月的日历出来,这里用到了蔡勒公式

PS:简单解释一下,蔡勒公式:var week = y + parseInt(y/4) + parseInt(c/4) - 2*c + parseInt(26*(m+1)/10) + d - 1;

c是年份的前两位,y是年份的后两份(2016年,c是20,y就是16),m是月份,d是日期,把week%7后得出的结果就是星期几
但是1,2月要当成上一年的13,14月进行计算,比如2016.2.3,就要换算成2015.14.3来使用蔡勒公式

week是正数和负数时求模是不一样的,负数时要 (week%7+7)%7,正数时直接求模 week%7,

还有得知道这个月份有多少天,1、3、5、7、8、10、12月是31天,4、6、9、11月是30天,2月分闰年和平年,平年是28天,闰年是29天,闰年是能被4整除但不能被100整除的,好了有了些前提下,还是能很快写出JS的

$(function(){
 var $td = $('tbody').find('td');
 
 var date = new Date(),
  year = date.getFullYear(),
  month = date.getMonth() + 1,
  day = date.getDate(),days;
 
 
 function initCal(yy,mm,dd){
  if(mm ==2 && yy%4 == 0 && yy%100 !==0 ){
  days = 28;
  }else if(mm == 1 || mm == 3 || mm == 5 || mm == 7 || mm == 8 || mm == 10 || mm == 12){
  days = 31;
  }else if(mm==4 || mm==6 || mm==9 || mm==11 ){
  days = 30;
  }else{
  days = 29;
  }
 
  var m = mm < 3 ? (mm == 1 ? 13 : 14): mm;
  yy = m > 12 ? yy - 1 : yy;
  var c = Number(yy.toString().substring(0,2)),
   y = Number(yy.toString().substring(2,4)),
   d = 1;
  //蔡勒公式
  var week = y + parseInt(y/4) + parseInt(c/4) - 2*c + parseInt(26*(m+1)/10) + d - 1;
 
  week = week < 0 ? (week%7+7)%7 : week%7;
 
  for(var i=0 ;i<42;i++){
  $td.eq(i).text('');
//清空原来的text文本
  }
 
  for(var i = 0;i < days; i++){
  $td.eq( week % 7 +i).text(i+1);


  }
 }
 
 initCal(year,month,day);
 })

再打开浏览器看看,现在的日历是长这样

基于jQuery日历插件制作日历

打开手机日历看一看,现在是16年3月,嗯,长得一毛一样(得意脸)

现在要添加一些控件进去,两个输入框和四个按键,按键是使用了iconfont,html代码如下:

<div class="container">
 <input type="text" value="" id="cal-input"/>
 <div class="cal-box">
 <div class="cal-control-box">
  <div class="wif iw-bofangqixiayiqu left"></div>
  <div class="wif iw-iconfont-bofang left"></div>
  <input type="" value=""/>
  <span>年</span>
  <input type="" value=""/>
  <div class="wif iw-iconfont-bofang right"></div>
  <div class="wif iw-bofangqixiayiqu right"></div>
 </div>
 <table>
  <thead>
  <tr>
   <td class="sun">日</td>
   <td>一</td>
   <td>二</td>
   <td>三</td>
   <td>四</td>
   <td>五</td>
   <td class="sta">六</td>
  </tr>
  </thead>
  <tbody>
  <tr>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
  </tr>
  <tr>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
  </tr>
  <tr>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
  </tr>
  <tr>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
  </tr>
  <tr>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
  </tr>
  <tr>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
   <td></td>
  </tr>
  </tbody>
 </table>
 </div>
</div>

现在的日历是长这样子了

基于jQuery日历插件制作日历

现在来给按键们都绑上点击事件,输入框绑上change事件

//更改月份按钮
 $(document).on("click",".iw-iconfont-bofang",function(){
  if($(this).hasClass("left")){
  //判断加还是减
  if(month == 1 ){
   month = 12;
   year--;
  }else{
   month--;
  }
  }else{
  if(month == 12){
   month = 1;
   year ++;
  }else{
   month ++;
  }
  }
  initCal(year,month,day);
 })
 
 //更改年份
 $(document).on("click",".iw-bofangqixiayiqu",function(){
  if($(this).hasClass("left")){
  year--;
  }else{
  year++;
  }
  initCal(year,month,day);
 })
 //年份输入
 $(document).on("change","input.cal-year",function(){
  year = $(this).val();
  initCal(year,month,day);
 })
 
 //月份输入
 $(document).on("change","input.cal-month",function(){
  month = $(this).val();
  initCal(year,month,day);
 })

顺便在initCal()函数里面要把年份和月份的值用JQ的val()方法,放进input框里面就ok啦

结束语:这里呢并没有写成一个插件的形式,但是把这个日历的实现主要思路写好了,最近也是忙着写毕业论文,还有挺多东西想写下来分享的,总是感觉时间不够用,下次写一下怎么将这个日历写成一个chrome插件,就是下面这个

基于jQuery日历插件制作日历

希望本文所述对jquery程序设计有所帮助。

Javascript 相关文章推荐
(转载)JavaScript中匿名函数,函数直接量和闭包
May 08 Javascript
JQery 渐变图片导航效果代码 漂亮
Jan 01 Javascript
JavaScript Serializer序列化时间处理示例
Jul 31 Javascript
jquery实现多行文字图片滚动效果示例代码
Oct 10 Javascript
javascript DIV实现跟随鼠标移动
Mar 19 Javascript
浅谈jQuery添加的HTML,JS失效的问题
Oct 05 Javascript
微信小程序 前端源码逻辑和工作流详解
Oct 08 Javascript
利用jQuery.Validate异步验证用户名是否存在(推荐)
Dec 09 Javascript
vue2.0嵌套路由实现豆瓣电影分页功能(附demo)
Mar 13 Javascript
详解基于Vue+Koa的pm2配置
Oct 24 Javascript
基于js中的存储键值对以及注意事项介绍
Mar 30 Javascript
使用NestJS开发Node.js应用的方法
Dec 03 Javascript
jQuery Html控件基本操作(日常收集整理)
Mar 11 #Javascript
JavaScript获取客户端IP的方法(新方法)
Mar 11 #Javascript
JavaScript高级程序设计(第三版)学习笔记6、7章
Mar 11 #Javascript
JavaScript高级程序设计(第三版)学习笔记1~5章
Mar 11 #Javascript
Angularjs中使用Filters详解
Mar 11 #Javascript
使用jquery.qrcode.min.js实现中文转化二维码
Mar 11 #Javascript
JavaScript制作简单的日历效果
Mar 10 #Javascript
You might like
PHP程序员基本要求和必备技能
2014/05/09 PHP
php实现过滤表单提交中html标签的方法
2014/10/17 PHP
PHP实现格式化文件数据大小显示的方法
2015/01/03 PHP
php实现XSS安全过滤的方法
2015/07/29 PHP
PHP加密技术的简单实现
2016/09/04 PHP
浏览器无法运行JAVA脚本的解决方法
2008/01/09 Javascript
关于jQuery参考实例2.0 用jQuery选择元素
2013/04/07 Javascript
Extjs4 GridPanel 的几种样式使用介绍
2013/04/18 Javascript
JQuery实现动态表格点击按钮表格增加一行
2014/08/24 Javascript
AngularJs Modules详解及示例代码
2016/09/01 Javascript
关于js原型的面试题讲解
2016/09/25 Javascript
7个好用的JavaScript技巧分享(译)
2019/05/07 Javascript
layui内置模块layim发送图片添加加载动画的方法
2019/09/23 Javascript
[01:21:58]守擂赛DOTA2第一周决赛
2020/04/22 DOTA
Python3实现并发检验代理池地址的方法
2016/09/18 Python
python入门基础之用户输入与模块初认识
2016/11/14 Python
Python中将变量按行写入txt文本中的方法
2018/04/03 Python
python使用socket创建tcp服务器和客户端
2018/04/12 Python
python中sklearn的pipeline模块实例详解
2020/05/21 Python
python 实现图片批量压缩的示例
2020/12/18 Python
css3简单练习实现遨游浏览器logo的绘制
2013/01/30 HTML / CSS
彪马美国官网:PUMA美国
2017/03/09 全球购物
JSF面试题:如何管量web层中的Bean,用什么标签。如何通过jsp页面与Bean绑定在一起进行处理?
2012/10/05 面试题
不用游标的SQL语句有哪些
2012/09/07 面试题
事业单位接收函
2014/01/10 职场文书
村优秀党员事迹材料
2014/01/15 职场文书
市场安全管理制度
2014/01/26 职场文书
创新型城市实施方案
2014/03/06 职场文书
环保建议书作文
2014/03/12 职场文书
法学自荐信
2014/06/20 职场文书
2015年新农合工作总结
2015/03/30 职场文书
采购内勤岗位职责
2015/04/13 职场文书
大学毕业典礼致辞
2015/07/29 职场文书
小学生法制教育心得体会
2016/01/14 职场文书
Python基础之pandas数据合并
2021/04/27 Python
发工资啦!教你用Python实现邮箱自动群发工资条
2021/05/10 Python