百度前端技术学院上有一个任务,要实现一个日期选择组件,本文由此而来~

看看需求

组件默认一直呈显示状态

通过某种方式选择年、月,选择了年月后,日期列表做相应切换

通过单击某个具体的日期进行日期选择

组件初始化时,可配置可选日期的上下限。可选日期和不可选日期需要有样式上的区别

提供设定日期的接口,指定具体日期,日历面板相应日期选中

日期选择面板默认隐藏,会显示一个日期显示框和一个按钮,点击这两个部分,会浮出日历面板。再点击则隐藏。

点击选择具体日期后,面板隐藏,日期显示框中显示选取的日期

增加一个接口,用于当用户选择日期后的回调处理

增加一个参数及相应接口方法,来决定这个日历组件是选择具体某天日期,还是选择一个时间段

当设置为选择时间段时,需要在日历面板上点击两个日期来完成一次选择,两个日期中,较早的为起始时间,较晚的为结束时间,选择的时间段用特殊样式标示

增加参数及响应接口方法,允许设置时间段选择的最小或最大跨度,并提供当不满足跨度设置时的默认处理及回调函数接口

在弹出的日期段选择面板中增加确认和取消按钮

先完成一个组件的基本结构

(function(window,document){

function Calendar(options){

//传入配置的中的参数

this.init();

}

Calendar.prototype={

init:function(){

this.createDom();

this.loadCss();

this.cacheDom();

this.bindEvents();

this.render();

},

loadCss:function(){

// 把组件所需的样式表动态加载进来

},

createDom:function(){

// 创建dom对象或者创建html片段或者创建template

},

cacheDom:function(){

// 存储dom 对象

},

bindEvents:function(){

//事件绑定

},

render:function(){

//渲染函数,更新数据或样式

}

}

window.Calendar=Calendar;//把组件对象绑定到全局

}(window,document));

通常我写组件时的基本结构如上,你可以根据组件的需要或者自己习惯进行编写。然后就可以在html里面添加以下的代码就可以调用我们的组件了,

var a=new Calendar({

// 各种配置

/* 类似于 id:'myCalendar'

onSelected:function(){

alert('hello');

}

*/

});

下面再看一下我们的需求,我们来一 一分析

需求也不是很多嘛,手动斜眼~

先上图,根据图再慢慢分析

其实我们看了需求之后,每个人都会有一个大概的思路,下面说一下我的思路

首先,要实现一个日期选择器,最重要的就是要有一个日历,根据不同的年份和月份,日期面板上回显示每一天和对应的周几~

其实实现这一点的话就两点

第一,要根据年份和月份算出每月有多少天

第二,要计算出每月的第一天(1号)是周几

伪代码如下:

/**

* @param {string} year 年份

* @param {string} month 月份

* @param {string} day 号

* @return {object} message

* message{

* year 年份

* month 月份

* monthLen 那个月的天数

* whichDay 1号是周几

* day 号

* }

*/

function calculate(year,month,day){

var date=year+'/'+month+'/'+'1';

var whichDay=new Date(date).getDay();

var message={

year:year,

month:month,

monthLen:new Date(year,month,0).getDate(),

whichDay:whichDay,

day:day

};

return message;

},

我想看完代码之后大家应该比较疑惑的是获取每个月天数的那句代码,这个比较优雅的做法是从这里看到的,

注意:在Date对象里month为0代表的是1月份,month为5代表6月份,所以我new Date(year,5,0)代表的六月份的第0天,即5月份的最后一天,所以还可以用getDate()获取5月份的长度,getDate方法是返回指定日期对象的月份中的第几天(1-31)。

所以当我们点击了月份加减/年份加减的按钮时,向calculate函数传入变化后的year,month参数,然后进行渲染,日历面板改变

其次,”选择时间段并且另处于开始时间和结束时间之间的日期添加特殊的样式“这一点也是花了不少时间来写,

伪代码如下:

// 初始化

var firstDate,secondDate=[0,0,0];

//点击日历面板上的日期的点击事件的执行函数的片段,每当点击事件被触发,就会执行该片段

if(self.isSelectRange){

var date=[self.year.innerHTML,self.month.innerHTML,ele.innerHTML];

if(self.firstDate[0]===0){//

if(self.secondDate[0]===0){//两个日期都没有被设置

self.firstDate=date;

}else{//firstDate没有被设置,secondDate已经被设置,

}

}else{

if(self.secondDate[0]===0){//firstDate已经设置,

self.secondDate=date;

if(compareDate(self.firstDate.join('/'),self.secondDate.join('/'))){//如果第一个选择的日期大于第二次选择的日期,进行交换

self.firstDate=[self.secondDate,self.secondDate=self.firstDate][0];

}

}else{//两个日期都已经被设置,已经选择了两个元素,再次选择则都

self.secondDate=[0,0,0];

self.firstDate=date;

self.clearDayInRangeStyle();

}

}

self.day.innerHTML=ele.innerHTML;

self.render();

firstDate,secondDate分别代表开始时间和结束时间。每次触发日期的点击事件时,就会执行以上的代码片段,对firstDate和secondDate进行更改,这样的话,无论是我对日历面板进行更新或者对开始时间和结束时间之间的日期显示不同的样式,都可以通过firstDate和secondDate来实现。

显示不同的样式就判断日期是否在开始时间和结束时间之间,每次重新render的时候就给选择过的firstDate和secondDate添加样式。

包括计算开始时间和结束时间之间的跨度是否在设定的跨度内,我们点击按钮后进行判断。

最后,看看render函数怎么实现

关于render函数,有以下几点需要注意:

清除日历面板上的所有内容和样式,样式通过清除每个单元格上的类实现

根据每月1号是周几和每月的长度生成每月的日历

根据记录的fisrtDate和secondDate来显示已经选择过的选择的样式

以上大概是我的思路,我也实现了一个组件,有兴趣的朋友可以点这里,欢迎找bug~

ps:文笔还是不行,文章写的好烂。。

html选择日期的组件,怎样实现一个datePicker(日期选择)组件相关推荐

  1. 前端架构之路:数据驱动型组件-HeyUI,一个新型的VUE组件库

    什么是数据驱动型组件? 其实,目前来说,也只有HEYUI组件库是这种方式的尝试者,这也是我在设计组件库的过程中,慢慢思考的成果. 所以,关于这一种定义,还没有人运用过. 当然,这也是HEYUI区别于其 ...

  2. java 通用组件_写一个通用数据访问组件

    出处:http://www.csharp-corner.comwillsound(翻译)我收到过数据库 出处:http://www.csharp-corner.com willsound(翻译) 我收 ...

  3. antd 日期时间选择_antd-mobile的DatePicker日期选择组件使用

    现在项目上有个需求,在时间选择上需要精确到分钟,且分钟只能是0分钟或者是30分钟. 其中组件有个minuteStep参数,将其设置成30,即可只显示0分钟或者30分钟了. 但是在选择的时候发现了问题, ...

  4. axure日期选择器组件_vue干货分享,超过六种组件通信方法讲解和精髓归纳

    好消息:为了更好的规划和组织内容,今后每期内容之后能将预告下期的主题,欢迎大家补充 组件的分类 常规页面组件,由 vue-router 产生的每个页面,它本质上也是一个组件(.vue),主要承载当前页 ...

  5. ruby 将日期转化为时间_Ruby中的日期和时间类

    ruby 将日期转化为时间 Ruby数据和时间类 (Ruby Data and Time Classes) In any program written in any language, at any ...

  6. Ant组件——DatePicker 日期选择框

    相关文档 DatePicker 日期选择框 业务需求 设置两个时间选择框,一个是开始时间,一个是结束时间,两者相互制约,开始不能早于结束,结束不能小于开始 代码示例 1.html <a-form ...

  7. element 日期选择图标_更换 App 图标,自制透明小组件!这可能是最全的 iPhone 桌面美化指南...

    说到个性化手机,你会想到换主题.换图标这些方法,不论是小清新还是偶像派,喜欢什么你就换什么.可如果你是 iPhone 用户,除了更换壁纸,也就能想想修改 app 文件夹名称了.Android 手机拥有 ...

  8. 重构ElementUI解决DatePicker日期选择组件修改父组件placement参数问题[Vue.js项目实践: 新冠自检系统]

    新冠疫情自我检测系统网页设计开发文档 Sylvan Ding 的第一个基于 Vue.js 的项目. 本项目所提供的信息,只供参考之用,不保证信息的准确性.有效性.及时性和完整性,更多内容请查看国家卫健 ...

  9. 如何在uni-app中选择一个合适的UI组件库

    uni-app框架转眼已经发布了一年多,使用uni-app的开发者也是与日俱增.因为uni-app是一个跨端框架,所以我们大多使用它就是为了同时一套代码跨多端,选择uni-app 可以算是眼下一个比较 ...

  10. iview DatePicker日期组件禁止选择今天之后的日期 不包括今天

    1.日期组件 <DatePicker type="date" :options="options" placeholder="请选择日期&quo ...

最新文章

  1. web server大全之GoAhead移植(转载)
  2. 改善代码设计 —— 简化条件表达式(Simplifying Conditional Expressions)
  3. Windows Embedded CE 6.0开发初体验(二)CE开发环境 收藏
  4. python去除字符串两边的空格_Python去除字符串两端空格的方法
  5. c++调用Java以及string互转
  6. 只腐蚀毛刺 腐蚀算法_避坑干货!8大卫浴五金选购指南,只买对的不买贵的
  7. 散列表(哈希表)工作原理 (转)
  8. 如何把备份的bak还原到新的数据库
  9. Android 笔记 android 7.0 单独编译framwork不生效的解决
  10. 【二十一】插件开发——用于验证码识别的 JMeter 插件(上)
  11. php 快速排序函数,PHP实现快速排序算法的三种方法
  12. 从 Google play 商店直接下载 apk 安装包
  13. Android 系统签名jks文件获取platform.jks
  14. 荒野行动android模拟,荒野行动用模拟器玩教程 荒野行动模拟器不支持机型解决方法...
  15. linux 搜索文件后缀名,Linux -find、文件后缀名
  16. 百度知道1000指数的关键词留链接排名到第一的实战案例
  17. 神雕侠侣手游服务器维护,《神雕侠侣怀旧服》2月15日更新维护公告
  18. Lightingroom4_秋凉教程 P3-P31笔记
  19. 《别做正常的傻瓜》1——结果偏见
  20. 做一个功能模块的实现流程

热门文章

  1. JavaBean对象转Map对象
  2. 11.4.2 内存映射的相关接口
  3. 苹果手机连接服务器传输文件,iOS 设备实现wifi局域网传输文件到iphone
  4. 微信小程序云开发-支付
  5. 物资仓库管理软件分析
  6. 3步接入顺丰快递云打印电子面单接口API
  7. ubuntu 18.04安装Tenda U12驱动
  8. navicat 与sqlserver2012连接报错无法连接到服务器
  9. 如何在win10下配置MySQL环境变量?
  10. matlab符号运算求二阶微分方程,matlab二阶微分方程求解x 0.2x 0.4x=0.2u(t)