JavaScript日期组件的实现

旅游频道的开发中需要定义各种日期组件,有的是基本的日期选择,

这个基本日期只包含如下功能

  1. 左右翻(月)

  2. 点击天回填到输入域

  3. 点击“今天”,回填今天的日期到输入域

  4. 点击“关闭”,日期控件关闭

有的同时显示两个月的日期

有的包含一些业务信息,比如机票搜索结果页的低价日历。

这个比上面的要复杂一些

  1. 每天的日期格子里含有价格信息

  2. 点击左右箭头会向后退请求更新每天的低价机票信息

  3. 且点击每天的格子是会重新查询

这里记录下一个基本日历组件的要点

一、html结构

这里以table来布局,由以下三个部分组成

分别对应,thead(显示区,左右箭头切换月份),tbody(显示天,点击天回填到输入域),tfoot(补充工具区)

开发日期组件之前就有个疑问,为什么星期是以周日开始,而不是周一呢?细心的同学会发现很多日期组件都是以“周日”开始,比如windows和mac系统自带的日历

  

这个其实是由于日期对象的getDay方法返回的值是这样的,这样实现起来方便一些,当然也可以实现为从周一开始排列的。

周日 0

周一 1

周二 2

周三 3

...

顺便提下 getMonth方法,它返回月份,值是从0开始的,比如

一月 0

二月 1

三月 2

...

二、核心函数


1. isLeapYear 判断闰年

?





1

2

3

function
isLeapYear(year) {

    return
(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)

}

闰年是比普通年份多出一段时间的年份,在各种历法中都有出现,目的是为了弥补人为规定的纪年与地球公转产生的差异。有两个条件

a. 非整百年:年数除以4余数为1是闰年,即公元前1、5、9……年。

b. 整百年:年数除以400余数为1是闰年,年数除以3200余数为1,不是闰年,年数除以172800余1又为闰年,即公元前401、801……年。

2. calculateDays 根据年月计算天

?





1

2

3

4

5

6

7

8

9

var
months = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

function
calculateDays(year, month) {

    var
days = months[month]

    // 2月比较特殊,非闰年28天,闰年29天,如2008年2月为29天

    if
( 1 == month && isLeapYear(year) ) {

        days = 29

    }

    return
days

}

1-12月的天数分别是31,28,31,30,31,30,31,31,30,31,30,31。2月比较特殊,闰年是29天。

3. format 格式化回填到输入框的字符串,可以带星期,也可以不带

4. setPosi 用来定位日期弹层的位置,一般是固定在输入框的下面

5. onBodyClick 点击body时的响应函数,这时会把日期弹层关闭(从DOM里删除)

6. template 日期组件的html模板函数,生成基本的框架,但日期数据是后续回填

7. render
渲染日期组件。点击输入框时会调用该方法,根据当前日期生成模板,根据年月生成该月的日期天数然后回填,添加组件上各种事件,计算组件的位置后插入到body里。

8. fillDate 根据年月计算该月的天数,然后插入。比如点击左右箭头(上月,下月)都会调用该方法。

9. events 方法会采用事件代理机制为日历上所有事件添加事件响应函数。即日期组件的行为由它完成。

10. prevMonth/nextMonth 是点击左右箭头的时候调用的,即更换月份的事件。

11. remove 将日期组件删除,点击body,点“关闭”,选择一个“天”
后都会调用该方法。该方法会从DOM中把日期组件删除,会把当前的天回填到输入框。注意,除了从DOM节点中删除,日期组件上的所有的事件绑定也将解除。

总结:基本上可以按照此思路来实现各种日期控件,比如有的需要添加农历信息、节假日、有的需要添加机票的价格信息。

DEMO:http://snandy.github.io/lib/calendar/

JavaScript日期组件的实现,布布扣,bubuko.com

时间: 2024-08-04 17:39:27

JavaScript日期组件的实现的相关文章

日期组件wdatepicker

导入WdataPicker文件包到项目的js文件夹下: 在用户管理中的添加.编辑jsp页面对生日表单项引入日期组件: <script type="text/javascript" src="${basePath }js/datepicker/WdatePicker.js"></script> 用法: 1 <s:textfield id="birthday" name="user.birthday"

JavaScript日期对象使用总结

javascript Date日期对象的创建 创建一个日期对象: var objDate=new Date([arguments list]); 我总结了参数形式主要有以下3种: new Date("month dd yyyy hh:mm:ss"); //后面的hh:mm:ss可选(不选的话就是默认的开始时间),而且前三项的顺序可以随意,甚至各字段后面可以加逗号 new Date(yyyy,mth,dd,hh,mm,ss); //除了前两个字段(年.月字段)外,其余的都是可选的(不选的

【ExtJs】带日期组件的文本输入框、容器与Ext.Msg.alert告警框告警两次

ExtJs的UI组件主要模仿客户端的界面效果,甚至其编程方式都有类似之处. 一.基本目标 比如如下的组件,与VC6中的<[mfc]不同对话框之间互相操控.全局变量与日期控件>(点击打开链接)就有异曲同工之妙. 其基本的思想也是先设置两个日期组件与按钮组件,然后,在点击按钮,就触发事件. 二.制作过程 首先,这个网页全程运用ExtJs编程,因此基本的HTML布局,处理引入ExtJS资源之外什么都没有.甚至可以把下面的ExtJs脚本完全写在一个Js里面. <!DOCTYPE HTML PUB

JavaScript日期时间对象的创建与使用(三)

时钟效果一: 代码: <html> <head> <meta charset="utf-8"/> <title>JavaScript日期时间对象的创建与使用</title> </head> <body> <h2 id="time"></h2> <script type="text/javascript"> function Cl

javascript日期处理库-Datejs.js

原文:http://code.google.com/p/datejs/wiki/APIDocumentation javascript日期处理库-Datejs.js 当天时间 Date.today(); 比较两个时间大小,返回-1,0,1 var today = Date.today(); var past = Date.today().add(-6).days(); var future = Date.today().add(6).days(); Date.compare(today, fut

javascript 分页组件

原文:javascript 分页组件 自己写的一个简单的分页组件,主要功能还有实现都在JS中,html页面中只用增加一个放置生成分页的DIV,并给定容器的id. html结构如下: <ul class="pagination" id="pageDIV"> </ul> class="pagination" 给定了分页的样式, id="pageDIV"用于放置JS生成的分页 CSS结构如下: .pagina

JavaScript 日期格式化 简单实用

JavaScript 日期格式化 简单实用 代码如下,引入jquery后直接后加入以下代码刷新可测试 Date.prototype.Format = function (fmt) { //author: meizz var o = { "M+": this.getMonth() + 1, //月份 "d+": this.getDate(), //日 "h+": this.getHours(), //小时 "m+": this.

JavaScript日期时间操作

js日期操作: var myDate = new Date(); myDate.getYear(); //获取当前年份(2位)myDate.getFullYear(); //获取完整的年份(4位,1970-????)myDate.getMonth(); //获取当前月份(0-11,0代表1月)myDate.getDate(); //获取当前日(1-31)myDate.getDay(); //获取当前星期X(0-6,0代表星期天)myDate.getTime(); //获取当前时间(从1970.1

vue自定义日期组件

vue-datepicker 基于 vuejs 2.x 可自定义主题的日期组件 github Usage 只需要在项目中加入 calendar.vue,就可以使用了. 向组件传入 prop 即可改变 calendar 的样式 Props type(String): 默认 single(选择单天),可选 range(选择多天) / time(选择单天 + 时间) isAbandon(Boolean): 默认 true,早于系统日期的日期选项是否不可选 showInput(Boolean): 默认