博主是个java新手,目前在做的一个项目就是考勤排班系统,主要负责的模块是排班模块这一方面。需求上面要求要在显示当月的日历表,日历表上同时动态生成上班时间、下班时间、是否值班、值班类型等功能。
当时在网上找了很多日历模板,都没有找到能够符合自己要求的。便决定自己画一个页面。

个人感觉最主要的一块就是字符串的拼接,日历的生成,还有一些个别的属性需要注意。

基本样式引用:

<link rel="stylesheet" href="css/bootstrap.css" /><link rel="stylesheet" href="css/bootstrapValidator.css" /><link rel="stylesheet" href="css/css1.css" /><script type="text/javascript" src="js/jquery-1.10.2.js" ></script><script type="text/javascript" src="js/bootstrap.js" ></script><script type="text/javascript" src="js/bootstrapValidator.js" ></script>

html代码:

<div class="col-xs-10 col-xs-offset-1"><form class="form-inline"><div class="form-group col-xs-offset-1"><label for="exampleInputName2">部门:</label><select class="form-control" style="margin-right: 50px;"><option>==请选择==</option><option>产品研发部</option><option>系统运维部</option><option>人事管理部</option></select><label for="exampleInputEmail2">员工名:</label><select class="form-control" style="margin-right: 100px;" onchange="alertdate()"><option>==请选择==</option><option>张三</option><option>李四</option><option>王五</option></select><button class="btn btn-primary">保存</button></div><div class='calendar' id='calendar'></div></form></div>

html代码中的下拉框都是写死的,给第二个下拉框绑定onchange事件,触发事件在id=’calendar’的div中生成日历。

js部分:

var dateobj = prev();function prev(){var _date = new Date();    // 默认为当前系统时间return {getDate : function(){return _date;},setDate : function(date) {_date = date;}};}function alertdate(){renderhtml();    //对日历div中增加表格元素showCalendarData();  //在表格中显示日期bindEvent();   //对表格上方的上月下月绑定事件$(":radio").click(function(){var parentCode=$(this).parent();if($(this).val()=='true'){if(parentCode.children("select").length==0){parentCode.children("span").show();parentCode.append("<select><option>白班</option><option>夜班</option></select>");}}else{parentCode.children("select").remove();parentCode.children("span").hide();}});}function renderhtml(){var calendar=document.getElementById("calendar");var titlebox=document.createElement("div");  //在div中设置标题区  显示当前月份和上月下月的控制var bodybox=document.createElement("div");   //主体部分 用于存放日历表格titlebox.className="calendar-title-box";   //给标题box绑定属性   并向div中添加元素titlebox.innerHTML="<span id='prevMonth' class='prev-month'></span>"+"<span class='calendar-title' id='calendarTitle'></span>"+"<span class='next-month' id='nextMonth'></span>";calendar.appendChild(titlebox);  //将标题box设为日历容器的子节点bodybox.className='calendar-body-box';   //表格部分绑定属性var headhtml="<tr>"+"<th>日</th>"+"<th>一</th>"+"<th>二</th>"+"<th>三</th>"+"<th>四</th>"+"<th>五</th>"+"<th>六</th>"+"</tr>";var bodyhtml="";for(var i=0;i<6;i++){      //一周7天 字符串拼接放到bodyhtml中bodyhtml+="<tr>"+"<td></td>"+"<td></td>"+"<td></td>"+"<td></td>"+"<td></td>"+"<td></td>"+"<td></td>"+"</tr>";}bodybox.innerHTML="<table id='calendarTable' class='table table-bordered text-center'>"+headhtml+bodyhtml+"</table>";  //设置表格box的内容calendar.appendChild(bodybox);}function showCalendarData(){//alert(dateobj);var year=dateobj.getDate().getFullYear();   //dateobj为object对象 通过getDate得到日期 再得到年var month=dateobj.getDate().getMonth()+1;var datestr=getdatestr(dateobj.getDate());  //通过函数gatdatestr将dateobj转换成字符串格式//设置表格顶部的年月信息var calendarTitle=document.getElementById("calendarTitle");var titleStr=datestr.substr(0,4)+"年"+datestr.substr(4,2)+"月";  //通过substr截取字符串  得到年的数字和月份数字calendarTitle.innerText=titleStr;   //将拼接后的****年**月显示在上方//设置表格中的日期数据var table=document.getElementById("calendarTable");var tds=table.getElementsByTagName("td");var firstday=new Date(year,month-1,1);  //当前月的第一天//alert(firstday.getDay());for(var i=0;i<tds.length;i++){var thisday=new Date(year,month-1,i+1-firstday.getDay());  //getDay得到第一天是周几 从而显示第一行上个月的数据var thisdayStr=getdatestr(thisday);//tds[i].innerText=thisday.getDate();tds[i].innerHTML="<span style='font-size:16px; font-wight:700'>"+thisday.getDate()+"</span>"+"<br/>上班时间:<input type='text' style='width:48px; height:18px; margin-top:1px' placeholder='9:00' />"+"<br/>下班时间:<input type='text' style='width:48px; height:18px; margin-top:1px' placeholder='18:00' />"+"<br/>是否值班:<input type='radio' name='flag"+i+"' value='true' style='margin-top:2px' />是"+"<input type='radio' name='flag"+i+"' value='false' checked='checked' style='margin-top:2px' />否"+"<br/><span style='display:none'>值班类型:</span>";tds[i].setAttribute("data",thisdayStr);if(thisdayStr==getdatestr(new Date())){tds[i].className="currentDay";   //当天设置属性}else if(thisdayStr.substr(0,6)==getdatestr(firstday).substr(0,6)){tds[i].className="currentMonth";  //当前月设置属性}else{tds[i].className="otherMonth";      //其他月的日历设置属性}}//alert(dateobj.getdate().getDay());}function bindEvent(){var prevMonth=document.getElementById("prevMonth");var nextMonth=document.getElementById("nextMonth");addEvent(prevMonth,'click',toPrevMonth);    //绑定点击事件addEvent(nextMonth,'click',toNextMonth);//addEvent($(":radio"),'click',toChooseSch);}function getdatestr(date){var year=date.getFullYear();var month=date.getMonth()+1;  //月份从0开始var day=date.getDate();month=(month>9)?(""+month):("0"+month);  //如果得到的数字小于9要在前面加'0'day=(day>9)?(""+day):("0"+day);return year+month+day;}function addEvent(dom,eType,func){if(dom.addEventListener){dom.addEventListener(eType,function(e){func(e);});}else if(dom.attachEvent){dom.attachEvent('on'+eType,function(e){func(e);});}else{dom['on'+eType]=function(e){func(e);}}}function toPrevMonth(){var date=dateobj.getDate();dateobj.setDate(new Date(date.getFullYear(),date.getMonth()-1,1));showCalendarData();}function toNextMonth(){var date=dateobj.getDate();dateobj.setDate(new Date(date.getFullYear(),date.getMonth()+1),1)showCalendarData();}</script>

其中印象比较深刻的地方有

1、每个单元格中的radio按钮所设置的checked=’checked’属性无效。
这个原因博主找了一会发现,因为所有的日历部分代码都是通过字符串拼接动态生成的,在生成radio按钮的时候

是否值班:<input type='radio' name='flag' value='true' style='margin-top:2px' />是<input type='radio' name='flag' value='false' checked='checked' style='margin-top:2px' />否

这里所绑定的name属性是全部相同的,即整个表格中的name属性重复,所以所生成的单选按钮组没有默认选中项。

后来在name属性中加上for循环中的变量i,实现一个单元格中的两个按钮name值相同,从而解决该问题。

2、相同类型的问题还有一处:

<span id='dutyType' style='display:none'>值班类型:</span>

博主在尝试实现选择值班时显示值班类型的功能时发现在js代码中无法找到该span。按理用jquery的id选择器不会出现这种问题啊,仔细想想应该还是字符串拼接出错。因为博主是使用for循环实现每个日历单元格都产生相应的操作,后面再根据是否属于当前月进行判断是进行显示还是隐藏。

最终发现每个单元格中所产生的span id全部相同,无法使用选择器找到。后来博主便放弃了使用id选择器的方法。改用节点操作:

$(":radio").click(function(){var parentCode=$(this).parent();if($(this).val()=='true'){if(parentCode.children("select").length==0){parentCode.children("span").show();parentCode.append("<select><option>白班</option><option>夜班</option></select>");}}else{parentCode.children("select").remove();parentCode.children("span").hide();}});

找到所点击按钮的父级元素,在父级元素的所有子元素中找到span的children,再通过hide或者show控制其显示或者隐藏。同样的select下拉框也是这样实现的。

3、字符串拼接后 radio按钮所绑定的click事件失效。

$(":radio").click(function(){var parentCode=$(this).parent();if($(this).val()=='true'){if(parentCode.children("select").length==0){parentCode.children("span").show();parentCode.append("<select><option>白班</option><option>夜班</option></select>");}}else{parentCode.children("select").remove();parentCode.children("span").hide();}});

还是相同的代码块,原先博主是用html()方法获取所点击按钮父级元素中所有的内容,在后面继续字符串的拼接加上select下拉框,最后再用html()将原先的内容替换,但是后面自测发现事件失效,当前单元格中的click事件无效,在Google的开发者工具中查看页面代码无问题,但是始终不能触发事件。

后选择是用append的方法实现。查阅相关资料应该是js部分的代码在页面加载完之后,也随之加载完,若想再次实现点击事件需要重新加载js代码,看的我一脸懵逼。这地方始终不是太明白。

关于用js实现的日历记事功能相关推荐

  1. 如何新建桌面便签、任务列表、个人日历记事

    在电脑桌面记事,几乎是上班族的共同需求.领导临时交代的一串任务,不在便签上列一个任务表,一会儿就忘了任务都有什么了.写月总结的时候,如果没有在一张月视图上总览当月记事,真不知道这个月自己做了什么事情值 ...

  2. html制作日历备忘录,原生JS代码制作带记事备忘功能的双月份显示效果的日历

    原生JS写的日历月历 - demo by js.alixixi.com window.onload = function(){ function $(id){return typeof id === ...

  3. html桌面日历功能,jQuery简单带记事功能的日历插件

    e-calendar是一款jQuery简单带记事功能的日历插件.通过该jQuery日历插件你可以记录或设置某天某个时刻发生的事情,具有工作备忘录的功能.通过简单的参数设置你就可以定制该日历插件的外观. ...

  4. android日历窗口实现,基于Android日历及记事功能完整实现.doc

    基于Android日历及记事功能完整实现 <移动通信程序设计> 课程设计 题 目 基于andriod的功能的日历 二O年月日 1概述1 2 总体设计2 3详细设计3 3.1.绘画基础5 3 ...

  5. Java怎么搞安卓日历提醒,Android日历有闹钟提醒功能记事功能等

    [实例简介] 好看的Android日历,里面有闹钟.提醒功能.记事功能等等 [实例截图] [核心代码] Calenda └── Calenda ├── AndroidManifest.xml ├── ...

  6. js php 实现日历签到_基于jquery实现日历签到功能_jquery

    在一些任务游戏.贴吧管理中都会有一个签到功能,帮助大家记录登录天数,积累等级经验,这个日历签到功能是如何实现的,本文为大家进行演. 本文实例讲述了基于jquery实现日历签到功能.分享给大家供大家参考 ...

  7. Bootstrap全年日历插件带记事功能

    下载地址 实用的Bootstrap3带记事功能的全年日历插件.该日历插件使用简单,可以动态在某个日期上设置备忘录,可以自定义高亮日期样式和选择最大日期和最小日期范围等. dd:

  8. 前端日历添加记事功能_通过添加实验室功能从Google日历中获取更多信息

    前端日历添加记事功能 Recently we took a look at how you can take Gmail further by enabling some of the extra f ...

  9. jQuery日历记事插件SimpleCalendar(附源代码)

    二期修改SimpleCalendar为日历记事插件,并修复多个bug,带农历.节假日. 一.效果图: 二.Simple-Calendar插件的使用方法 1.引入资源 (1). 使用日历插件前首先要引用 ...

最新文章

  1. 深入实践Spring Boot3.1 模型设计
  2. 知其然,知其所以然:基于多任务学习的可解释推荐系统
  3. Haar小波变换的快速实现
  4. IAR调试按钮功能说明及调试主要看哪些内容
  5. RPA如何助力企业解决人才短缺难题?
  6. Python(4):条件控制
  7. service请求处理逻辑
  8. 在linux系统中查看组管理信息命令,Linux用户和组管理常用命令
  9. 链表应用 多项式相加
  10. 斗鱼连接弹幕Demo_pythonC#
  11. 有生成的日志的监控电脑性能的软件吗_全链路监控:方案概述与对比,看完你就懂...
  12. 关于登录tomcat8一直登录不进去问题
  13. 基于Python的指数基金量化投资 - 正三角和倒三角投资模型
  14. 傅里叶变换与Matlab
  15. kubectl自动补全
  16. C语言 负数对正数取余,负数取余/整除,Python和C语言的不同
  17. Linux之core dumped出错原因及位置分析
  18. 有没有人可以解答一下?
  19. lumen5.5 使用 jwt-auth1.0 笔记
  20. 内网安全-域横向CobaltStrikeSPNRDP

热门文章

  1. 控制面板中的管理工具提示位置不可用
  2. 微积分7---极坐标确定切线方程
  3. python爬虫(廖雪峰商业爬虫)
  4. 64位Ubuntu系统兼容32位程序
  5. fiddle 配置
  6. CNN网络中的小工具——绘制热力图(Heat_Map)
  7. 基于PCI9054和LTC4240的CPCI总线接口设计
  8. 向日葵Linux远程失败,向日葵远程控制客户端无法安装的问题解决方式
  9. 汇总:Linux下文件操作接口
  10. 想转行当程序员的必看!揭秘ARouter路由机制,Android校招面试指南