一个简单横向javascript日期控件

具体要求就是:
1、日期表格横向占满页面。
2、每个月的日期列表横向显示在一排,而不是像网上的很多日期控件显示一个方块。
3、要求只有年月日可选,选择年或月后自动更新对应日期(这个每个日期控件都有的)。
4、默认显示当前年月,高亮当前日期,并显示当前的周次(本年第几周)和星期几。
5、选择某个日期后高亮显示当前日期,并自动更新周次和星期显示。
6、提供接口,可以设定特定日期的显示样式。
6、其他就是一些界面展示的问题了。

想着就是一个日期控件,做着也比较简单,不过比较特别是横向的,第一次听说这种需求的!
偶还是第一次写日历类的东西,不过这次的麻烦还是在于周次的计算上和最后提供的设定特定日期的接口实现上,但经过一番分析也很好的解决了。
主要几个总结:
1、使用了闭包,隐藏内部函数及变量,防止变量污染。最后只提供一个对外接口:setDateStyle
2、计算每年二月的天数不是通过判断闰年的办法,而是通过判断是否2月29日存在,如果不存在则为28天。
3、计算周次要先计算当前日期是本年的第几天,同时要考虑本年1月1日是星期几,然后计算即可得出。
4、setDateStyle支持单个日期样式的传入,也支持多个日期样式的设定。对于样式的更新主要采用数组合并字符窜,并采用字符串的indexOf方法匹配并执行样式的设定。
5、CSS/JS/HTML相分离,便于维护。函数模块化便于重用。


代码如下:

var logDateControl=(function(){
  var curSelEl;  //当前选中的日期
  var styleData=[],dataStyle={};
  //获取指定id的元素
  var $=function(id){return document.getElementById(id)}
  //计算指定日期是第几周(默认为当前日期),该计算方法比较严密准确
  var calWeek=function(dt){
    var calDay=dt||new Date();  //当前要计算的时间
    var firstDay=new Date(calDay.getFullYear(),0,1);  //本年第一天
    //计算当前是本年的第几天,00:00为当天开始
    var daysAll=Math.floor((calDay-firstDay)/1000/60/60/24)+1;  
    //本年第一天星期几
    var firstDayWeekday=firstDay.getDay();  
    //该结果加到第一周的周一,便于后面计算
    var diffDay=firstDayWeekday==0?6:firstDayWeekday-1;  
    daysAll=daysAll+diffDay;
    return Math.ceil(daysAll/7);  //返回计算结果
  }
  //计算一个月多少天,年份4位数字,月份1-2位数字(应该是js日期格式如1月传入0),数据非法返回-1
  var getDaysLen=function(year,month){
    if(!(/^\d{4}$/.test(year)&&/^\d{1,2}$/.test(month))){return -1}
    var monthDays=[31,28,31,30,31,30,31,31,30,31,30,31]
    //存在2月29日
    if(month==1&&new Date(year,1,29).getMonth()==1){monthDays[1]=29}
    return monthDays[month]
  }
  //显示日期列表,传入年、月(按日常月份传入。如二月传入2)、及显示位置
  var displayDayList=function(year,month,pos){
    var daysList=[];
    var cells1=$(pos).rows[0].cells;
    var cells2=$(pos).rows[1].cells;
    var daysArr=['日','一','二','三','四','五','六'];
    //下面的month-1转换为js月份表示
    for(var i=1,l=getDaysLen(year,--month)+1;i<l;i++){
      var wd=new Date(year,month,i).getDay();
      cells1[i-1].className="";
      if(wd==0||wd==6){cells1[i-1].className="weekEnd";}  //为周末添加特殊样式
      //_oldCls保存当前日期的默认样式
      cells1[i-1].innerText=daysArr[wd];
      cells2[i-1].className="unSelectDay";
      cells2[i-1].setAttribute("_oldCls","unSelectDay");
      cells2[i-1].innerText=i>9?i:"0"+i;
      //匹配用户自定义样式
      var dtStr=year+"|"+(month+1)+"|"+i;
      if((","+styleData.join(',')+",").indexOf(","+dtStr+",")>-1){
        cells2[i-1].className="unSelectDay "+dataStyle[dtStr];
        cells2[i-1].setAttribute("_oldCls","unSelectDay "+dataStyle[dtStr]);
      }
    }
    //如果是当前月则选中当日
    if(new Date().getMonth()==month){
      curSelEl=cells2[new Date().getDate()-1];
      curSelEl.className="selectDay";
    }
    for(var j=i-1;j<31;j++){
      cells1[j].className=cells2[j].className="";
      cells1[j].innerHTML=cells2[j].innerHTML="  ";
    }
    $(pos).onclick=function(){changeInfo()}
  }
  //根据选择的值进行处理周次和周几的调整,可以直接传入保存日期内容的dom元素,或者函数根据点击位置判断
  var changeInfo=function(e){
    e=e||event;
    var el=e.target||e.srcElement||e;  //最后一个e:可能是传入的对象
    var day=el.innerText;
    if(!/^\d{1,2}$/.test(day)) return;  //如果不是日期什么都不做
    //恢复之前选中日期的样式
    if(curSelEl){curSelEl.className=curSelEl.getAttribute("_oldCls")}
    curSelEl=el;  //保存当前处理的元素
    //更新选中日期的样式
    el.className="selectDay";
    var dt=new Date($("year").value,$("month").value-1,day);
    //更新信息
    $("day").value=day;  //日期
    $("weekday").value=['日','一','二','三','四','五','六'][dt.getDay()];  //星期几
    $("week").value=calWeek(dt);  //第几周
  }
  //初始化
  window.attachEvent("onload",function(){
    var curDate=new Date(),curYear=curDate.getFullYear();
    //显示上下十年
    for(var i=-10;i<10;i++){$("year").add(new Option(curYear+i,curYear+i))}
    $("year").selectedIndex=10;  //默认选中当前年份
    $("month").selectedIndex=curDate.getMonth();  //当前月份
    $("day").value=curDate.getDate();  //当前日期
    $("weekday").value=['日','一','二','三','四','五','六'][curDate.getDay()];  //当前星期几
    $("week").value=calWeek();  //当前第几周
    //改变日期或年份更新日期列表
    $("year").onchange=$("month").onchange=function(){displayDayList($("year").value,$("month").value,"daysList")};
    //显示当月日期列表,并高亮当天的日期
    displayDayList(curDate.getFullYear(),curDate.getMonth()+1,"daysList");
  });

//对外设定样式的接口。
  //格式:([2007,10,12],"color:#f00") ([[2007,10,20],[2007,11,25]],"color:#00f")
  //如果月份小于10不要带0
  var setDateStyle=function(dateArr,style){
    if(typeof dateArr!="object")return;
    if(dateArr instanceof Array){
      if(dateArr[0] instanceof Array){
        for(var i=0;i<dateArr.length;i++) setDateStyle(dateArr[i],style);
      }
      var dataStr=dateArr.join('|');
      styleData.push(dataStr);
      dataStyle[dataStr]=style;
      return;
    }
  }
  //对外接口
  return {setDateStyle:setDateStyle}
})();
//测试样式设定
logDateControl.setDateStyle([[2007,12,15],[2007,11,12]],"test");

new document

*{font-size:14px}
/*日期最外层*/
#logCalendar{width:950px;border-top:1px solid #ccc;border-left:1px solid #ccc}
/*日期内部所有单元格*/
#logCalendar td{
border-right:1px solid #ccc;border-bottom:1px solid #ccc;
padding-left:5px;text-align:center;
height:22px;line-height:22px;
}
#daysList{border-top:1px solid #ccc;border-left:1px solid #ccc}
/*日期列表所有单元格*/
#daysList td{text-align:center;height:22px}

/*周次及星期几的输入框*/
.bd{border:0;text-align:center;color:#00f}
/*日期默认样式*/
.unSelectDay{
color:#00f;font-weight:normal;
padding:3px;cursor:pointer;
text-decoration:underline
}
/*当前点击的日期样式*/
.selectDay{color:#fff;font-weight:bold;background:#FEB0B0;padding:1px;text-decoration:none;cursor:normal}
/*周末样式*/
.weekEnd{color:#f00}

.test{color:#f00;text-decoration:none}

//2007-12-21 工作日志日期组件 yanwei
//使用闭包隐藏所有变量和函数,防止与外界冲突
var logDateControl=(function(){
var curSelEl; //当前选中的日期
var styleData=[],dataStyle={};
//获取指定id的元素
var $=function(id){return document.getElementById(id)}
//计算指定日期是第几周(默认为当前日期),该计算方法比较严密准确
var calWeek=function(dt){
var calDay=dt||new Date(); //当前要计算的时间
var firstDay=new Date(calDay.getFullYear(),0,1); //本年第一天
//计算当前是本年的第几天,00:00为当天开始
var daysAll=Math.floor((calDay-firstDay)/1000/60/60/24)+1;
//本年第一天星期几
var firstDayWeekday=firstDay.getDay();
//该结果加到第一周的周一,便于后面计算
var diffDay=firstDayWeekday==0?6:firstDayWeekday-1;
daysAll=daysAll+diffDay;
return Math.ceil(daysAll/7); //返回计算结果
}
//计算一个月多少天,年份4位数字,月份1-2位数字(应该是js日期格式如1月传入0),数据非法返回-1
var getDaysLen=function(year,month){
if(!(/^\d{4}$/.test(year)&&/^\d{1,2}$/.test(month))){return -1}
var monthDays=[31,28,31,30,31,30,31,31,30,31,30,31]
//存在2月29日
if(month==1&&new Date(year,1,29).getMonth()==1){monthDays[1]=29}
return monthDays[month]
}
//显示日期列表,传入年、月(按日常月份传入。如二月传入2)、及显示位置
var displayDayList=function(year,month,pos){
var daysList=[];
var cells1=$(pos).rows[0].cells;
var cells2=$(pos).rows[1].cells;
var daysArr=['日','一','二','三','四','五','六'];
//下面的month-1转换为js月份表示
for(var i=1,l=getDaysLen(year,--month)+1;i9?i:"0"+i;
//匹配用户自定义样式
var dtStr=year+"|"+(month+1)+"|"+i;
if((","+styleData.join(',')+",").indexOf(","+dtStr+",")>-1){
cells2[i-1].className="unSelectDay "+dataStyle[dtStr];
cells2[i-1].setAttribute("_oldCls","unSelectDay "+dataStyle[dtStr]);
}
}
//如果是当前月则选中当日
if(new Date().getMonth()==month){
curSelEl=cells2[new Date().getDate()-1];
curSelEl.className="selectDay";
}
for(var j=i-1;j

第周 星期

1
2
3
4
5
6
7
8
9
10
11
12
日期

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

(0)

相关推荐

  • javascript格式化日期时间函数

    复制代码 代码如下: function DateUtil(){}/***功能:格式化时间*示例:DateUtil.Format("yyyy/MM/dd","Thu Nov 9 20:30:37 UTC+0800 2006 ");*返回:2006/11/09*/DateUtil.Format=function(fmtCode,date){    var result,d,arr_d;        var patrn_now_1=/^y{4}-M{2}-d{2}\sh

  • JavaScript中日期的相关操作方法总结

    创建日期 Date 对象用于处理日期和时间. 可以通过 new 关键词来定义 Date 对象.以下代码定义了名为 myDate 的 Date 对象: 有四种方式初始化日期: new Date() // 当前日期和时间 new Date(milliseconds) //返回从 1970 年 1 月 1 日至今的毫秒数 new Date(dateString) new Date(year, month, day, hours, minutes, seconds, milliseconds) 上面的参

  • javascript 当前日期加(天、周、月、年)

    复制代码 代码如下: //create the date var myDate = new Date(); //add a day to the date myDate.setDate(myDate.getDate() + 1); //add a week myDate.setDate(myDate.getDate() + 7); //add a month myDate.setMonth(myDate.getMonth() + 1); //add a year myDate.setYear(m

  • 一个简单横向javascript日期控件

    具体要求就是: 1.日期表格横向占满页面. 2.每个月的日期列表横向显示在一排,而不是像网上的很多日期控件显示一个方块. 3.要求只有年月日可选,选择年或月后自动更新对应日期(这个每个日期控件都有的). 4.默认显示当前年月,高亮当前日期,并显示当前的周次(本年第几周)和星期几. 5.选择某个日期后高亮显示当前日期,并自动更新周次和星期显示. 6.提供接口,可以设定特定日期的显示样式. 6.其他就是一些界面展示的问题了. 想着就是一个日期控件,做着也比较简单,不过比较特别是横向的,第一次听说这种

  • 一个简单的JS时间控件示例代码(JS时分秒时间控件)

    自己在网上找了半天没找到只有 "时分秒"的控件, 就自己做了个,发在这里方便有人用到 鼠标点击 后 的效果 SetTime.js 复制代码 代码如下: /**//************************************ 使用说明:* 首先把本控件包含到页面 * <script src="XXX/setTime.js" type="text/javascript"></script>* 控件调用函数:_Set

  • 一个简单的JavaScript 日期计算算法

    复制代码 代码如下: <script type="text/javascript"> var today=new Date(); //定义当天日期对象 var year = today.getYear(); //获取年份 var month = today.getMonth(); //获取月份 var date = today.getDate(); //获取日期值 try{ //定义下个日期对象,日期值加上30天 var nextDay = new Date(year,mo

  • 利用PyQT5日期控件制作一个小日历

    目录 介绍 主要代码 补充 介绍 日历的制作比较简单,因为pyqt5已经自带了相关的日期控件,只需要明白如何调用再加上比较个性化的功能,这个日历的小控件就制作完成了. 日历实现代码量不多,具体效果如下图 主要代码 在制作过程中使用到的python模块包说明: from PyQt5.QtWidgets import * # 窗口组件 from PyQt5.QtCore import * # 核心组件.日历组件就是在这个库 import sys # 操作系统处理库 在小日历的制作过程中只使用了一个槽

  • JS日期控件My97DatePicker基本用法

    My97DatePicker是一款非常灵活好用的日期控件.使用非常简单.  1.下载My97DatePicker组件包  下载地址:https://www.jb51.net/jiaoben/18012.html 2.在页面中引入该组件js文件:  <script type="text/JavaScript" src="My97DatePicker/WdatePicker.js"></script>  3.例子 <!DOCTYPE HTM

  • ASP.NET Calendar日历(日期)控件使用方法

    Calendar 控件显示一个日历,用户可通过该日历导航到任意一年的任意一天.当 ASP.NET 网页运行时,Calendar 控件以 HTML 表格的形式呈现.因此,该控件的许多属性与多种不同的表格格式相符.在这些属性中,有几个在一些低版本的浏览器中不能得到完全支持,因此在这些浏览器中并不能使用所有的格式功能. 使用 Calendar 控件在网页上显示日历的单个月.该控件使您可以选择日期并移到下个月或上个月.Calendar 控件支持 System.Globalization 命名空间中的所有

  • ASP.NET使用My97DatePicker日期控件实例

    .Net中默认提供了Calendar日期控件,但是它有一个缺陷,就是每次日历的显示,隐藏和用户的的选择日期都会造成回传.  在网上找到My97DatePicker这个js日期控件,不错,和大家分享一下. My97DatePicker日期控件在网上很多都可以免费下载,也有该控件的网站  把下载好的My97DatePicker.jar解压,黏贴到项目根目录下,当然这个位置大家可以自己设置  我在根目录下新建了一个test.aspx页面 源代码: <%@ Page Language="C#&qu

  • ASP.NET My97DatePicker日期控件实现OA日期记事功能

    My97DatePicker日期控件是一个非常好用的日期控件,功能非常优秀的日期控件. 对实现页面刷新完善的很好,用日期控件时可以有比较好的享受,这次的OA日期记事功能也得益于此控件,具体效果图如下: 部分代码: Default页布局一个Calendar日期控件 <div> <asp:Calendar ID="Calendar1" runat="server" Width="100%" ShowGridLines="T

  • jquery获取easyui日期控件的值实现方法

    jquery easyui日期控件中,在页面里用JS拿到设置的日期值的方法 jquery获取easyui日期控件的值 jquery easyui 日期框 有这样的一个日期文本框: <input type="text" name="mdate" size="20" value="" id="mdate" class="easyui-datebox"/> 使用easyui给文本框

  • jQuery EasyUI中的日期控件DateBox修改方法

    jQuery EasyUI中的日期控件DateBox很好用的,首先需要引入jquery文件,代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Basic DateBox - jQuery EasyUI Demo</title> <link rel="stylesheet" type="text/cs

随机推荐