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

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

  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. function isLeapYear(year) {
  2. return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)
  3. }

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

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

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

2. calculateDays 根据年月计算天

  1. var months = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
  2. function calculateDays(year, month) {
  3. var days = months[month]
  4. // 2月比较特殊,非闰年28天,闰年29天,如2008年2月为29天
  5. if ( 1 == month && isLeapYear(year) ) {
  6. days = 29
  7. }
  8. return days
  9. }

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日期组件的实现的更多相关文章

  1. JavaScript日期对象使用总结

    javascript Date日期对象的创建 创建一个日期对象: var objDate=new Date([arguments list]); 我总结了参数形式主要有以下3种: new Date(& ...

  2. 日期组件wdatepicker

    导入WdataPicker文件包到项目的js文件夹下: 在用户管理中的添加.编辑jsp页面对生日表单项引入日期组件: <script type="text/javascript&quo ...

  3. amazeui-js插件-ui增强-日期组件如何使用(把实例做一下)

    amazeui-js插件-ui增强-日期组件如何使用(把实例做一下) 一.总结 一句话总结:需要jquery.js和amazeui.js一切才能使用 1.amazeui中的各种js效果要怎么才能使用? ...

  4. 测试开发【提测平台】分享12-掌握日期组件&列表状态格式化最终实现提测管理多条件搜索展示功能

    微信搜索[大奇测试开],关注这个坚持分享测试开发干货的家伙. 本章内容思维导图如下,由于需要各种状态下的菜单操作,所以需要先实现提测信息的列表基础页面,然后再推进其他需求开发 基本知识点学习 Date ...

  5. yii2超好用的日期组件和时间组件

    作者:白狼 出处:http://www.manks.top/yii2_datetimepicker.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接 ...

  6. Moment.js 超棒Javascript日期处理类库

    Moment.js 不容错过的超棒Javascript日期处理类库 主要特性: 3.2kb超轻量级 独立类库,意味这你不需要倒入一堆js 日期处理支持UNIX 时间戳,String,指定格式的Date ...

  7. EXTJS项目实战经验总结一:日期组件的change事件:

    1  依据选择的日期,加载相应的列表数据,如图:   开发说明    1 开发思路: 在日期值变化的事件中获得选择后的日期值,传给后台,然后从后台加载相应的数据 2 问题:在查看extjs2.2 的a ...

  8. vue自定义日期组件

    vue-datepicker 基于 vuejs 2.x 可自定义主题的日期组件 github Usage 只需要在项目中加入 calendar.vue,就可以使用了. 向组件传入 prop 即可改变 ...

  9. 为Ext添加下拉框和日期组件

    Ext.onReady(function(){ var config = { fields:['module'], data:[['新建'],['删除'],['增加']}; var store = n ...

随机推荐

  1. springMVC中Dispatcher中的/和/*的区别

    1. 首先 / 这个是表示默认的路径,及表示:当没有找到可以匹配的URL就用这个URL去匹配.2. 在springmvc中可以配置多个DispatcherServlet,比如: 配置多个Dispatc ...

  2. 使用VS GDB扩充套件在VS上远端侦错Linux上的C/C++程序

    在 Linux 上开发 C/C++ 程序,或许你会直接(本机或远端)登入 Linux,打开编辑器写完代码后,就用 gcc/g++ 来编译,遇到要除错(debug)的时候,则会选择使用 gdb 来进行除 ...

  3. KTV点歌系统

    经过十多天的艰苦奋战,MyKTV点歌系统终于成型,从刚开始接到项目的茫然,到完成项目时的喜悦,整个过程的艰辛和付出只有自己知道.虽然这个项目还有许多需要完善的地方,譬如添加歌词信息,实现窗体的美化等, ...

  4. 在uwp中复活常用的vb库函数

    这个博文是纯原创的,转载一定要说明作者是 Nukepayload2!! 在.Net Core 中,很多地方被精简了,有个重灾区就是vb语言库.从当初的囊括vb6库函数并且附带后期绑定到现在的几个函数加 ...

  5. spring中的DisposableBean和InitializingBean,ApplicationContextAware的用法

    在spring容器初始化bean和销毁bean的以前的操作有很多种, 目前我知道的有:在xml中定义的时候用init-method和destory-method,还有一种就是定义bean的时候实现Di ...

  6. 划分树---Feed the dogs

    POJ  2761 Description Wind loves pretty dogs very much, and she has n pet dogs. So Jiajia has to fee ...

  7. Mysql denied for user 'odbc@localhost' || denied for user 'root@localhost'

    1. Question Description: 1.1  mysql  version:  mysql-5.7.11-win64.zip 1.2  if you connect to the mys ...

  8. 【iOS】Quartz2D矩阵操作

    前面画基本图形时,画四边形是由几条直线拼接成的,现在有更简便的方法. 一.关于矩阵操作 1.画一个四边形 通过设置两个端点(长和宽)来完成一个四边形的绘制. 代码: - (void)drawRect: ...

  9. Automapper扩展方法

    问题描述 系统中实现了一个自定义的PagedList /// <summary> /// Paged list interface /// </summary> public ...

  10. log4net 日志框架的配置

    log4net 日志框架的配置——静态文件(一) 添加对log4net程序集的引用 选择程序集文件添加引用即可,需要注意的是需要添加相应程序版本的程序集,如果你的应用是基于.netFramework2 ...